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

Commit d0ebc270 authored by Kirill Timofeev's avatar Kirill Timofeev Committed by Android (Google) Code Review
Browse files

Merge "Perfetto SDK: use external 'dev.perfetto.sdk' dependency." into main

parents 9e0ad19f c78e267b
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