Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c78e267b authored by Kirill Timofeev's avatar Kirill Timofeev
Browse files

Perfetto SDK: use external 'dev.perfetto.sdk' dependency.

We want to use the same Perfetto Java SDK code both for the 3P
users and in Framework,the same way we are already doing
for the Perfetto C API.

We add a dependency to the external java and jni code.
We guard the new usage with a flag `perfetto_sdk_tracing_v3`.
We will delete the android.os.PerfettoTrace code in the future.

I've updated the 'TracePerfTest' with a 'V3' test versions,
to make sure we have no perf regressions.
I've also add tests to make sure the 'V3' version init and works fine.

Test: atest TracePerfTest
Test: atest FrameworksCoreTests:PerfettoTraceV3InitializationTest
Test: atest FrameworksCoreTests:PerfettoTraceMessageQueueTest
Bug: 303199244
Flag: android.os.perfetto_sdk_tracing_v3
Change-Id: Ie25bb90850f028fd6e5a345340b1359d214a7017
parent b250bf93
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -425,6 +425,7 @@ java_defaults {
        "perfetto_trace_javastream_protos_jarjar",
        "libaconfig_java_proto_nano",
        "aconfig_device_paths_java",
        "perfetto_trace_lib_framework_java",
    ],
}

+90 −0
Original line number Diff line number Diff line
@@ -46,7 +46,14 @@ public class TracePerfTest {

    private static final String FOO = "foo";
    private static final Category FOO_CATEGORY = new Category(FOO);
    private static final com.android.internal.dev.perfetto.sdk.PerfettoTrace.Category
            FOO_CATEGORY_V3 = new com.android.internal.dev.perfetto.sdk.PerfettoTrace.Category(FOO);
    private static final Category UNREGISTERED_CATEGORY = new Category("unregistered");
    private static final com.android.internal.dev.perfetto.sdk.PerfettoTrace.Category
            UNREGISTERED_CATEGORY_V3 =
                    new com.android.internal.dev.perfetto.sdk.PerfettoTrace.Category(
                            "unregistered");

    private static PerfettoTrace.Session sPerfettoSession;

    @BeforeClass
@@ -54,6 +61,7 @@ public class TracePerfTest {
        ShellHelper.runShellCommandRaw("atrace -c --async_start -a *");
        PerfettoTrace.register(false /* isBackendInProcess */);
        FOO_CATEGORY.register();
        FOO_CATEGORY_V3.register();
        sPerfettoSession = new PerfettoTrace.Session(false /* isBackendInProcess */,
                                                      getTraceConfig(FOO).toByteArray());
    }
@@ -188,6 +196,88 @@ public class TracePerfTest {
        }
    }

    @Test
    public void testInstantPerfettoV3() {
        com.android.internal.dev.perfetto.sdk.PerfettoTrace.instant(FOO_CATEGORY_V3, "testInstantP")
                .emit();

        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
            com.android.internal.dev.perfetto.sdk.PerfettoTrace.instant(
                            FOO_CATEGORY_V3, "testInstantP")
                    .emit();
        }
    }

    @Test
    public void testInstantPerfettoV3WithArgs() {
        com.android.internal.dev.perfetto.sdk.PerfettoTrace.instant(FOO_CATEGORY_V3, "testInstantP")
                .addArg("foo", "bar")
                .setFlow(1)
                .emit();

        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
            com.android.internal.dev.perfetto.sdk.PerfettoTrace.instant(
                            FOO_CATEGORY_V3, "testInstantP")
                    .addArg("foo", "bar")
                    .setFlow(1)
                    .emit();
        }
    }

    @Test
    public void testInstantPerfettoV3WithProto() {
        com.android.internal.dev.perfetto.sdk.PerfettoTrace.begin(
                        FOO_CATEGORY_V3, "message_queue_receive")
                .beginProto()
                .beginNested(2004 /* message_queue */)
                .addField(1 /* sending_thread_name */, "foo")
                .endNested()
                .endProto()
                .setTerminatingFlow(5)
                .emit();

        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
            com.android.internal.dev.perfetto.sdk.PerfettoTrace.begin(
                            FOO_CATEGORY_V3, "message_queue_receive")
                    .beginProto()
                    .beginNested(2004 /* message_queue */)
                    .addField(1 /* sending_thread_name */, "foo")
                    .endNested()
                    .endProto()
                    .setTerminatingFlow(5)
                    .emit();
        }
    }

    @Test
    public void testInstantPerfettoV3WithProtoUnregistered() {
        com.android.internal.dev.perfetto.sdk.PerfettoTrace.begin(
                        UNREGISTERED_CATEGORY_V3, "message_queue_receive")
                .beginProto()
                .beginNested(2004 /* message_queue */)
                .addField(1 /* sending_thread_name */, "foo")
                .endNested()
                .endProto()
                .setTerminatingFlow(5)
                .emit();

        BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
        while (state.keepRunning()) {
            com.android.internal.dev.perfetto.sdk.PerfettoTrace.begin(
                            UNREGISTERED_CATEGORY_V3, "message_queue_receive")
                    .beginProto()
                    .beginNested(2004 /* message_queue */)
                    .addField(1 /* sending_thread_name */, "foo")
                    .endNested()
                    .endProto()
                    .setTerminatingFlow(5)
                    .emit();
        }
    }

    private static TraceConfig getTraceConfig(String cat) {
        BufferConfig bufferConfig = BufferConfig.newBuilder().setSizeKb(1024).build();
        TrackEventConfig trackEventConfig = TrackEventConfig
+42 −0
Original line number Diff line number Diff line
@@ -32,6 +32,48 @@ HSPLjava/util/concurrent/ConcurrentSkipListMap$KeyIterator;->*
HSPLjava/util/concurrent/ConcurrentSkipListMap$KeySet;->*
HSPLjava/util/concurrent/ConcurrentSkipListSet;->*

# For now, also compile all method in the 'com.android.internal.dev.perfetto.sdk' Perfetto Trace API.
# Similar to the existing Trace APIs, these new APIs can impact the performance
# of many subsystems including MessageQueue. This also keeps benchmark
# comparisons between both APIs fair.
# The list is generated from the
# 'out/soong/.intermediates/external/perfetto/perfetto_trace_lib_framework_java/android_common/jarjar/perfetto_trace_lib_framework_java.jar'
# jar file, using the following command:
# ```
# jar tvf \
# out/soong/.intermediates/external/perfetto/perfetto_trace_lib_framework_java/android_common/jarjar/perfetto_trace_lib_framework_java.jar \
# | awk '$8 ~ /\.class$/ {sub(/\.class$/, "", $8); print "HSPL" $8 ";->*"}'
# ```
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$Proto;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$PerfettoPointer;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$NamedTrack;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$Flow;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$FieldString;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$FieldNested;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$FieldInt64;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$FieldDouble;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$FieldContainer;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$CounterTrack;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$CounterInt64;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$CounterDouble;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$ArgString;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$ArgInt64;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$ArgDouble;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventExtra$ArgBool;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventBuilder;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventBuilder$RingBuffer;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventBuilder$Pool;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventBuilder$ObjectsPool;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventBuilder$ObjectsCache;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrackEventBuilder$LazyInitObjects;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrace;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrace$Session;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoTrace$Category;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoNativeMemoryCleaner;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoNativeMemoryCleaner$FreeNativeMemoryRunnable;->*
HSPLcom/android/internal/dev/perfetto/sdk/PerfettoNativeMemoryCleaner$AllocationStats;->*

# While the SystemFeaturesMetadata static cache isn't heavyweight, ensure it's
# pre-initialized in the boot image to avoid redundant per-process overhead.
# TODO(b/326623529): Consider removing this after the feature has fully ramped
+36 −16
Original line number Diff line number Diff line
@@ -43,7 +43,6 @@ import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.atomic.AtomicInteger;
@@ -245,19 +244,32 @@ public final class MessageQueue {

    private void decAndTraceMessageCount() {
        mMessageCount.decrementAndGet();
        if (PerfettoTrace.MQ_CATEGORY.isEnabled()) {
        if (PerfettoTrace.isMQCategoryEnabled()) {
            traceMessageCount();
        }
    }

    private void incAndTraceMessageCount(Message msg, long when) {
        mMessageCount.incrementAndGet();
        if (PerfettoTrace.MQ_CATEGORY.isEnabled()) {
        if (PerfettoTrace.isMQCategoryEnabled()) {
            msg.sendingThreadName = Thread.currentThread().getName();
            final long eventId = msg.eventId = PerfettoTrace.getFlowId();

            traceMessageCount();
            final long messageDelayMs = Math.max(0L, when - SystemClock.uptimeMillis());
            if (PerfettoTrace.IS_USE_SDK_TRACING_API_V3) {
                com.android.internal.dev.perfetto.sdk.PerfettoTrace.instant(
                                PerfettoTrace.MQ_CATEGORY_V3, "message_queue_send")
                        .setFlow(eventId)
                        .beginProto()
                        .beginNested(2004 /* message_queue */)
                        .addField(2 /* receiving_thread_name */, mThreadName)
                        .addField(3 /* message_code */, msg.what)
                        .addField(4 /* message_delay_ms */, messageDelayMs)
                        .endNested()
                        .endProto()
                        .emit();
            } else {
                PerfettoTrace.instant(PerfettoTrace.MQ_CATEGORY, "message_queue_send")
                        .setFlow(eventId)
                        .beginProto()
@@ -270,12 +282,20 @@ public final class MessageQueue {
                        .emit();
            }
        }
    }

    private void traceMessageCount() {
        if (PerfettoTrace.IS_USE_SDK_TRACING_API_V3) {
            com.android.internal.dev.perfetto.sdk.PerfettoTrace.counter(
                            PerfettoTrace.MQ_CATEGORY_V3, mMessageCount.get())
                    .usingThreadCounterTrack(mTid, mThreadName)
                    .emit();
        } else {
            PerfettoTrace.counter(PerfettoTrace.MQ_CATEGORY, mMessageCount.get())
                    .usingThreadCounterTrack(mTid, mThreadName)
                    .emit();
        }
    }

    // Disposes of the underlying message queue.
    // Must only be called on the looper thread or the finalizer.
+29 −11
Original line number Diff line number Diff line
@@ -200,7 +200,18 @@ public final class Looper {
            return false;
        }

        if (PerfettoTrace.MQ_CATEGORY.isEnabled()) {
        if (PerfettoTrace.isMQCategoryEnabled()) {
            if (PerfettoTrace.IS_USE_SDK_TRACING_API_V3) {
                com.android.internal.dev.perfetto.sdk.PerfettoTrace.begin(
                                PerfettoTrace.MQ_CATEGORY_V3, "message_queue_receive")
                        .beginProto()
                        .beginNested(2004 /* message_queue */)
                        .addField(1 /* sending_thread_name */, msg.sendingThreadName)
                        .endNested()
                        .endProto()
                        .setTerminatingFlow(msg.eventId)
                        .emit();
            } else {
                PerfettoTrace.begin(PerfettoTrace.MQ_CATEGORY, "message_queue_receive")
                        .beginProto()
                        .beginNested(2004 /* message_queue */)
@@ -210,6 +221,7 @@ public final class Looper {
                        .setTerminatingFlow(msg.eventId)
                        .emit();
            }
        }

        // This must be in a local variabe, in case a UI event sets the logger
        final Printer logging = me.mLogging;
@@ -300,9 +312,15 @@ public final class Looper {
                    + msg.target.getClass().getName() + " "
                    + msg.callback + " what=" + msg.what);
        }
        if (PerfettoTrace.MQ_CATEGORY.isEnabled()) {
        if (PerfettoTrace.isMQCategoryEnabled()) {
            if (PerfettoTrace.IS_USE_SDK_TRACING_API_V3) {
                com.android.internal.dev.perfetto.sdk.PerfettoTrace.end(
                                PerfettoTrace.MQ_CATEGORY_V3)
                        .emit();
            } else {
                PerfettoTrace.end(PerfettoTrace.MQ_CATEGORY).emit();
            }
        }

        msg.recycleUnchecked();

Loading