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

Commit ea0f2553 authored by Zimuzo Ezeozue's avatar Zimuzo Ezeozue
Browse files

Expose perfetto start and stop sessions

Modified the existing tests to use the APIs instead of
including a separate test native library for this.

The tests also utilize the in-process backend which makes
it a lot easier to verify trace events.

Test: atest PerfettoTraceTest
Bug: 303199244
Flag: android.os.perfetto_sdk_tracing_v2
Change-Id: If3c638a588ef6fe3d9e52728b6be74481c7a2a35
parent cd4b17aa
Loading
Loading
Loading
Loading
+33 −3
Original line number Diff line number Diff line
@@ -154,14 +154,44 @@ public final class PerfettoTrace {
        }
    }

    /**
     * Manages a perfetto tracing session.
     * Constructing this object with a config automatically starts a tracing session. Each session
     * must be closed after use and then the resulting trace bytes can be read.
     *
     * The session could be in process or system wide, depending on {@code isBackendInProcess}.
     * This functionality is intended for testing.
     */
    public static final class Session {
        private final long mPtr;

        /**
         * Session ctor.
         */
        public Session(boolean isBackendInProcess, byte[] config) {
            mPtr = native_start_session(isBackendInProcess, config);
        }

        /**
         * Closes the session and returns the trace.
         */
        public byte[] close() {
            return native_stop_session(mPtr);
        }
    }

    @CriticalNative
    private static native long native_get_process_track_uuid();

    @CriticalNative
    private static native long native_get_thread_track_uuid(long tid);

    @FastNative
    private static native void native_activate_trigger(String name, int ttlMs);
    @FastNative
    private static native void native_register(boolean isBackendInProcess);

    private static native long native_start_session(boolean isBackendInProcess, byte[] config);
    private static native byte[] native_stop_session(long ptr);

    /**
     * Writes a trace message to indicate a given section of code was invoked.
@@ -307,7 +337,7 @@ public final class PerfettoTrace {
    /**
     * Registers the process with Perfetto.
     */
    public static void register() {
        Trace.registerWithPerfetto();
    public static void register(boolean isBackendInProcess) {
        native_register(isBackendInProcess);
    }
}
+1 −3
Original line number Diff line number Diff line
@@ -164,8 +164,6 @@ public final class Trace {
    private static native void nativeInstant(long tag, String name);
    @FastNative
    private static native void nativeInstantForTrack(long tag, String trackName, String name);
    @FastNative
    private static native void nativeRegisterWithPerfetto();

    private Trace() {
    }
@@ -545,6 +543,6 @@ public final class Trace {
     * @hide
     */
    public static void registerWithPerfetto() {
        nativeRegisterWithPerfetto();
        PerfettoTrace.register(false /* isBackendInProcess */);
    }
}
+41 −1
Original line number Diff line number Diff line
@@ -24,9 +24,12 @@
#include <nativehelper/scoped_primitive_array.h>
#include <nativehelper/scoped_utf_chars.h>
#include <nativehelper/utils.h>
#include <tracing_perfetto.h>
#include <tracing_sdk.h>

namespace android {
constexpr int kFlushTimeoutMs = 5000;

template <typename T>
inline static T* toPointer(jlong ptr) {
    return reinterpret_cast<T*>(static_cast<uintptr_t>(ptr));
@@ -51,6 +54,10 @@ static void android_os_PerfettoTrace_activate_trigger(JNIEnv* env, jclass, jstri
    tracing_perfetto::activate_trigger(name_chars.c_str(), static_cast<uint32_t>(ttl_ms));
}

void android_os_PerfettoTrace_register(bool is_backend_in_process) {
    tracing_perfetto::registerWithPerfetto(is_backend_in_process);
}

static jlong android_os_PerfettoTraceCategory_init(JNIEnv* env, jclass, jstring name, jstring tag,
                                                   jstring severity) {
    ScopedUtfChars name_chars = GET_UTF_OR_RETURN(env, name);
@@ -85,6 +92,36 @@ static jlong android_os_PerfettoTraceCategory_get_extra_ptr(jlong ptr) {
    return toJLong(category->get());
}

static jlong android_os_PerfettoTrace_start_session(JNIEnv* env, jclass /* obj */,
                                                    jboolean is_backend_in_process,
                                                    jbyteArray config_bytes) {
    jsize length = env->GetArrayLength(config_bytes);
    std::vector<uint8_t> data;
    data.reserve(length);
    env->GetByteArrayRegion(config_bytes, 0, length, reinterpret_cast<jbyte*>(data.data()));

    tracing_perfetto::Session* session =
            new tracing_perfetto::Session(is_backend_in_process, data.data(), length);

    return reinterpret_cast<long>(session);
}

static jbyteArray android_os_PerfettoTrace_stop_session([[maybe_unused]] JNIEnv* env,
                                                        jclass /* obj */, jlong ptr) {
    tracing_perfetto::Session* session = reinterpret_cast<tracing_perfetto::Session*>(ptr);

    session->FlushBlocking(kFlushTimeoutMs);
    session->StopBlocking();

    std::vector<uint8_t> data = session->ReadBlocking();

    delete session;

    jbyteArray bytes = env->NewByteArray(data.size());
    env->SetByteArrayRegion(bytes, 0, data.size(), reinterpret_cast<jbyte*>(data.data()));
    return bytes;
}

static const JNINativeMethod gCategoryMethods[] = {
        {"native_init", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)J",
         (void*)android_os_PerfettoTraceCategory_init},
@@ -101,7 +138,10 @@ static const JNINativeMethod gTraceMethods[] =
         {"native_get_thread_track_uuid", "(J)J",
          (void*)android_os_PerfettoTrace_get_thread_track_uuid},
         {"native_activate_trigger", "(Ljava/lang/String;I)V",
          (void*)android_os_PerfettoTrace_activate_trigger}};
          (void*)android_os_PerfettoTrace_activate_trigger},
         {"native_register", "(Z)V", (void*)android_os_PerfettoTrace_register},
         {"native_start_session", "(Z[B)J", (void*)android_os_PerfettoTrace_start_session},
         {"native_stop_session", "(J)[B", (void*)android_os_PerfettoTrace_stop_session}};

int register_android_os_PerfettoTrace(JNIEnv* env) {
    int res = jniRegisterNativeMethods(env, "android/os/PerfettoTrace", gTraceMethods,
+0 −5
Original line number Diff line number Diff line
@@ -131,10 +131,6 @@ static jboolean android_os_Trace_nativeIsTagEnabled(jlong tag) {
    return tracing_perfetto::isTagEnabled(tag);
}

static void android_os_Trace_nativeRegisterWithPerfetto(JNIEnv* env) {
    tracing_perfetto::registerWithPerfetto();
}

static const JNINativeMethod gTraceMethods[] = {
        /* name, signature, funcPtr */
        {"nativeSetAppTracingAllowed", "(Z)V", (void*)android_os_Trace_nativeSetAppTracingAllowed},
@@ -157,7 +153,6 @@ static const JNINativeMethod gTraceMethods[] = {
        {"nativeInstant", "(JLjava/lang/String;)V", (void*)android_os_Trace_nativeInstant},
        {"nativeInstantForTrack", "(JLjava/lang/String;Ljava/lang/String;)V",
         (void*)android_os_Trace_nativeInstantForTrack},
        {"nativeRegisterWithPerfetto", "()V", (void*)android_os_Trace_nativeRegisterWithPerfetto},

        // ----------- @CriticalNative  ----------------
        {"nativeIsTagEnabled", "(J)Z", (void*)android_os_Trace_nativeIsTagEnabled},
+0 −1
Original line number Diff line number Diff line
@@ -122,7 +122,6 @@ android_test {
        "android.view.flags-aconfig-java",
    ],
    jni_libs: [
        "libperfetto_trace_test_jni",
        "libpowermanagertest_jni",
        "libviewRootImplTest_jni",
        "libworksourceparceltest_jni",
Loading