From 4b8d02fdba244982780b0d2cee546b867e3c786b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Sun, 20 Dec 2020 00:44:26 -0500 Subject: [PATCH] Move Tracer to core-util. --- app/build.gradle | 2 -- .../securesms/ApplicationContext.java | 7 +++- .../securesms/PassphraseRequiredActivity.java | 3 +- .../securesms/database/SQLiteDatabase.java | 7 ++-- .../dependencies/ApplicationDependencies.java | 3 ++ .../logsubmit/SubmitDebugLogViewModel.java | 3 +- core-util/build.gradle | 17 +++++++++ .../org/signal/core/util}/tracing/Tracer.java | 35 +++++++++++++------ {app => core-util}/src/main/proto/Trace.proto | 2 +- 9 files changed, 57 insertions(+), 22 deletions(-) rename {app/src/main/java/org/thoughtcrime/securesms => core-util/src/main/java/org/signal/core/util}/tracing/Tracer.java (89%) rename {app => core-util}/src/main/proto/Trace.proto (98%) diff --git a/app/build.gradle b/app/build.gradle index d8f19fb7f8..1538436975 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -128,7 +128,6 @@ android { buildConfigField "String", "ZKGROUP_SERVER_PUBLIC_PARAMS", "\"AMhf5ywVwITZMsff/eCyudZx9JDmkkkbV6PInzG4p8x3VqVJSFiMvnvlEKWuRob/1eaIetR31IYeAbm0NdOuHH8Qi+Rexi1wLlpzIo1gstHWBfZzy1+qHRV5A4TqPp15YzBPm0WSggW6PbSn+F4lf57VCnHF7p8SvzAA2ZZJPYJURt8X7bbg+H3i+PEjH9DXItNEqs2sNcug37xZQDLm7X0=\"" buildConfigField "String[]", "LANGUAGES", "new String[]{\"" + autoResConfig().collect { s -> s.replace('-r', '_') }.join('", "') + '"}' buildConfigField "int", "CANONICAL_VERSION_CODE", "$canonicalVersionCode" - buildConfigField "int", "TRACE_EVENT_MAX", "3500" ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' @@ -229,7 +228,6 @@ android { ext.websiteUpdateUrl = "null" buildConfigField "boolean", "PLAY_STORE_DISABLED", "false" buildConfigField "String", "NOPLAY_UPDATE_URL", "$ext.websiteUpdateUrl" - buildConfigField "int", "TRACE_EVENT_MAX", "30_000" } prod { diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index 9670ea1c8c..740bdecbc6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -36,6 +36,7 @@ import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.AndroidLogger; import org.signal.core.util.logging.Log; import org.signal.core.util.logging.PersistentLogger; +import org.signal.core.util.tracing.Tracer; import org.signal.glide.SignalGlideCodecs; import org.signal.ringrtc.CallManager; import org.thoughtcrime.securesms.database.DatabaseFactory; @@ -68,7 +69,6 @@ import org.thoughtcrime.securesms.service.RotateSenderCertificateListener; import org.thoughtcrime.securesms.service.RotateSignedPreKeyListener; import org.thoughtcrime.securesms.service.UpdateApkRefreshListener; import org.thoughtcrime.securesms.storage.StorageSyncHelper; -import org.thoughtcrime.securesms.tracing.Tracer; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.SignalUncaughtExceptionHandler; @@ -109,8 +109,13 @@ public class ApplicationContext extends MultiDexApplication implements DefaultLi @Override public void onCreate() { Tracer.getInstance().start("Application#onCreate()"); + long startTime = System.currentTimeMillis(); + if (FeatureFlags.internalUser()) { + Tracer.getInstance().setMaxBufferSize(35_000); + } + super.onCreate(); initializeSecurityProvider(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java b/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java index 94c16bf2d7..0e9dd8cfe2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/PassphraseRequiredActivity.java @@ -12,6 +12,7 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import org.signal.core.util.logging.Log; +import org.signal.core.util.tracing.Tracer; import org.thoughtcrime.securesms.crypto.MasterSecretUtil; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob; @@ -25,7 +26,6 @@ import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.registration.RegistrationNavigationActivity; import org.thoughtcrime.securesms.service.KeyCachingService; -import org.thoughtcrime.securesms.tracing.Tracer; import org.thoughtcrime.securesms.util.TextSecurePreferences; import java.util.Locale; @@ -63,6 +63,7 @@ public abstract class PassphraseRequiredActivity extends BaseActivity implements initializeClearKeyReceiver(); onCreate(savedInstanceState, true); } + Tracer.getInstance().end(Log.tag(getClass()) + "#onCreate()"); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java index ab5194bf28..fcafb3dab8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SQLiteDatabase.java @@ -3,17 +3,14 @@ package org.thoughtcrime.securesms.database; import android.content.ContentValues; -import androidx.annotation.Nullable; - -import com.google.android.gms.vision.Tracker; - import net.sqlcipher.Cursor; import net.sqlcipher.SQLException; import net.sqlcipher.database.SQLiteQueryStats; import net.sqlcipher.database.SQLiteStatement; import net.sqlcipher.database.SQLiteTransactionListener; -import org.thoughtcrime.securesms.tracing.Tracer; +import org.signal.core.util.tracing.Tracer; +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import java.util.HashMap; import java.util.Locale; diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java index c014b9f606..ff92b7a74f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java @@ -5,6 +5,7 @@ import android.app.Application; import androidx.annotation.MainThread; import androidx.annotation.NonNull; +import org.signal.core.util.tracing.Tracer; import org.thoughtcrime.securesms.KbsEnclave; import org.thoughtcrime.securesms.components.TypingStatusRepository; import org.thoughtcrime.securesms.components.TypingStatusSender; @@ -23,6 +24,7 @@ import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess; import org.thoughtcrime.securesms.recipients.LiveRecipientCache; import org.thoughtcrime.securesms.service.TrimThreadsByDateManager; import org.thoughtcrime.securesms.util.EarlyMessageCache; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.FrameRateTracker; import org.thoughtcrime.securesms.util.Hex; import org.thoughtcrime.securesms.util.IasKeyStore; @@ -68,6 +70,7 @@ public class ApplicationDependencies { private static volatile TypingStatusRepository typingStatusRepository; private static volatile TypingStatusSender typingStatusSender; private static volatile DatabaseObserver databaseObserver; + private static volatile Tracer tracer; @MainThread public static void init(@NonNull Application application, @NonNull Provider provider) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogViewModel.java index 9541460f56..8cc4d406e8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogViewModel.java @@ -10,7 +10,8 @@ import androidx.lifecycle.ViewModelProvider; import com.annimon.stream.Stream; -import org.thoughtcrime.securesms.tracing.Tracer; +import org.signal.core.util.tracing.Tracer; +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.util.DefaultValueLiveData; import org.whispersystems.libsignal.util.guava.Optional; diff --git a/core-util/build.gradle b/core-util/build.gradle index 4eb73994cb..2af839669e 100644 --- a/core-util/build.gradle +++ b/core-util/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.library' +apply plugin: 'com.google.protobuf' apply plugin: 'witness' apply from: 'witness-verifications.gradle' @@ -21,9 +22,25 @@ dependencyVerification { configuration = '(debug|release)RuntimeClasspath' } +protobuf { + protoc { + artifact = 'com.google.protobuf:protoc:3.10.0' + } + generateProtoTasks { + all().each { task -> + task.builtins { + java { + option "lite" + } + } + } + } +} + dependencies { implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.2.1' + implementation 'com.google.protobuf:protobuf-javalite:3.10.0' testImplementation 'junit:junit:4.13.1' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' diff --git a/app/src/main/java/org/thoughtcrime/securesms/tracing/Tracer.java b/core-util/src/main/java/org/signal/core/util/tracing/Tracer.java similarity index 89% rename from app/src/main/java/org/thoughtcrime/securesms/tracing/Tracer.java rename to core-util/src/main/java/org/signal/core/util/tracing/Tracer.java index b5665e4119..44d80d4be2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/tracing/Tracer.java +++ b/core-util/src/main/java/org/signal/core/util/tracing/Tracer.java @@ -1,19 +1,18 @@ -package org.thoughtcrime.securesms.tracing; +package org.signal.core.util.tracing; import android.os.SystemClock; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.protobuf.ByteString; -import org.thoughtcrime.securesms.BuildConfig; -import org.thoughtcrime.securesms.trace.TraceProtos; -import org.thoughtcrime.securesms.trace.TraceProtos.Trace; -import org.thoughtcrime.securesms.trace.TraceProtos.TracePacket; -import org.thoughtcrime.securesms.trace.TraceProtos.TrackDescriptor; -import org.thoughtcrime.securesms.trace.TraceProtos.TrackEvent; -import org.whispersystems.signalservice.api.util.UuidUtil; +import org.signal.core.util.tracing.TraceProtos.Trace; +import org.signal.core.util.tracing.TraceProtos.TracePacket; +import org.signal.core.util.tracing.TraceProtos.TrackDescriptor; +import org.signal.core.util.tracing.TraceProtos.TrackEvent; +import java.nio.ByteBuffer; import java.util.Collections; import java.util.Map; import java.util.Queue; @@ -59,7 +58,7 @@ public final class Tracer { private static final Tracer INSTANCE = new Tracer(); private static final int TRUSTED_SEQUENCE_ID = 1; - private static final byte[] SYNCHRONIZATION_MARKER = UuidUtil.toByteArray(UUID.fromString("82477a76-b28d-42ba-81dc-33326d57a079")); + private static final byte[] SYNCHRONIZATION_MARKER = toByteArray(UUID.fromString("82477a76-b28d-42ba-81dc-33326d57a079")); private static final long SYNCHRONIZATION_INTERVAL = TimeUnit.SECONDS.toNanos(3); private final Clock clock; @@ -68,18 +67,24 @@ public final class Tracer { private final AtomicInteger eventCount; private long lastSyncTime; + private long maxBufferSize; - Tracer() { + private Tracer() { this.clock = SystemClock::elapsedRealtimeNanos; this.threadPackets = new ConcurrentHashMap<>(); this.eventPackets = new ConcurrentLinkedQueue<>(); this.eventCount = new AtomicInteger(0); + this.maxBufferSize = 3_500; } public static @NonNull Tracer getInstance() { return INSTANCE; } + public void setMaxBufferSize(long maxBufferSize) { + this.maxBufferSize = maxBufferSize; + } + public void start(@NonNull String methodName) { start(methodName, Thread.currentThread().getId(), null); } @@ -153,7 +158,7 @@ public final class Tracer { int size = eventCount.incrementAndGet(); - for (int i = size; i > BuildConfig.TRACE_EVENT_MAX; i--) { + for (int i = size; i > maxBufferSize; i--) { eventPackets.poll(); eventCount.decrementAndGet(); } @@ -223,6 +228,14 @@ public final class Tracer { .build(); } + public static byte[] toByteArray(UUID uuid) { + ByteBuffer buffer = ByteBuffer.wrap(new byte[16]); + buffer.putLong(uuid.getMostSignificantBits()); + buffer.putLong(uuid.getLeastSignificantBits()); + + return buffer.array(); + } + private interface Clock { long getTimeNanos(); } diff --git a/app/src/main/proto/Trace.proto b/core-util/src/main/proto/Trace.proto similarity index 98% rename from app/src/main/proto/Trace.proto rename to core-util/src/main/proto/Trace.proto index a892e32a11..646001b716 100644 --- a/app/src/main/proto/Trace.proto +++ b/core-util/src/main/proto/Trace.proto @@ -19,7 +19,7 @@ syntax = "proto2"; package signal; -option java_package = "org.thoughtcrime.securesms.trace"; +option java_package = "org.signal.core.util.tracing"; option java_outer_classname = "TraceProtos"; /*