From 8a625b665cfec91d51d6142324d72a00f0d0b7b5 Mon Sep 17 00:00:00 2001
From: Biswarup Pal <biswarupp@google.com>
Date: Wed, 15 Nov 2023 14:53:32 +0000
Subject: [PATCH] Use libtracing_perfetto for Trace.java calls

Test: atest libtracing_perfetto_tests
Bug: 303199244
Change-Id: I75e4b747e29c3974a8ad0b3753c36692c0c96e03
---
 AconfigFlags.bp                               |   6 +
 core/java/android/os/Trace.java               |  13 +++
 core/java/android/os/flags.aconfig            |   7 ++
 core/jni/Android.bp                           |   2 +
 core/jni/android_os_Trace.cpp                 | 108 ++++++++----------
 .../java/com/android/server/SystemServer.java |   2 +
 6 files changed, 77 insertions(+), 61 deletions(-)

diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index a80194cf53d2..48d6392f8b9b 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -346,6 +346,12 @@ cc_aconfig_library {
     mode: "test",
 }
 
+cc_aconfig_library {
+    name: "android.os.flags-aconfig-cc-host",
+    aconfig_declarations: "android.os.flags-aconfig",
+    host_supported: true,
+}
+
 // VirtualDeviceManager
 cc_aconfig_library {
     name: "android.companion.virtualdevice.flags-aconfig-cc",
diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java
index c0b490929c0a..bebb912bd069 100644
--- a/core/java/android/os/Trace.java
+++ b/core/java/android/os/Trace.java
@@ -164,6 +164,8 @@ 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() {
     }
@@ -523,4 +525,15 @@ public final class Trace {
             nativeTraceCounter(TRACE_TAG_APP, counterName, counterValue);
         }
     }
+
+    /**
+     * Initialize the perfetto SDK. This must be called before any tracing
+     * calls so that perfetto SDK can be used, otherwise libcutils would be
+     * used.
+     *
+     * @hide
+     */
+    public static void registerWithPerfetto() {
+        nativeRegisterWithPerfetto();
+    }
 }
diff --git a/core/java/android/os/flags.aconfig b/core/java/android/os/flags.aconfig
index c2b6aeaa29be..943014caeb09 100644
--- a/core/java/android/os/flags.aconfig
+++ b/core/java/android/os/flags.aconfig
@@ -134,3 +134,10 @@ flag {
      is_fixed_read_only: true
      bug: "324241334"
 }
+
+flag {
+     namespace: "system_performance"
+     name: "perfetto_sdk_tracing"
+     description: "Tracing using Perfetto SDK."
+     bug: "303199244"
+}
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 76e71380017c..a0dc94f22c31 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -93,6 +93,7 @@ cc_library_shared_for_libandroid_runtime {
     shared_libs: [
         "libbase",
         "libcutils",
+        "libtracing_perfetto",
         "libharfbuzz_ng",
         "liblog",
         "libminikin",
@@ -358,6 +359,7 @@ cc_library_shared_for_libandroid_runtime {
                 "libimage_io",
                 "libultrahdr",
                 "libperfetto_c",
+                "libtracing_perfetto",
             ],
             export_shared_lib_headers: [
                 // our headers include libnativewindow's public headers
diff --git a/core/jni/android_os_Trace.cpp b/core/jni/android_os_Trace.cpp
index ffacd9c8a95b..b579daf505e7 100644
--- a/core/jni/android_os_Trace.cpp
+++ b/core/jni/android_os_Trace.cpp
@@ -14,11 +14,11 @@
  * limitations under the License.
  */
 
+#include <cutils/compiler.h>
 #include <jni.h>
-
-#include <cutils/trace.h>
 #include <log/log.h>
 #include <nativehelper/JNIHelp.h>
+#include <tracing_perfetto.h>
 
 #include <array>
 
@@ -59,33 +59,30 @@ inline static void withString(JNIEnv* env, jstring jstr, F callback) {
 
 static void android_os_Trace_nativeTraceCounter(JNIEnv* env, jclass,
         jlong tag, jstring nameStr, jlong value) {
-    withString(env, nameStr, [tag, value](const char* str) {
-        atrace_int64(tag, str, value);
-    });
+    withString(env, nameStr,
+               [tag, value](const char* str) { tracing_perfetto::traceCounter(tag, str, value); });
 }
 
 static void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass,
         jlong tag, jstring nameStr) {
-    withString(env, nameStr, [tag](const char* str) {
-        atrace_begin(tag, str);
-    });
+    withString(env, nameStr, [tag](const char* str) { tracing_perfetto::traceBegin(tag, str); });
 }
 
 static void android_os_Trace_nativeTraceEnd(JNIEnv*, jclass, jlong tag) {
-    atrace_end(tag);
+    tracing_perfetto::traceEnd(tag);
 }
 
 static void android_os_Trace_nativeAsyncTraceBegin(JNIEnv* env, jclass,
         jlong tag, jstring nameStr, jint cookie) {
     withString(env, nameStr, [tag, cookie](const char* str) {
-        atrace_async_begin(tag, str, cookie);
+        tracing_perfetto::traceAsyncBegin(tag, str, cookie);
     });
 }
 
 static void android_os_Trace_nativeAsyncTraceEnd(JNIEnv* env, jclass,
         jlong tag, jstring nameStr, jint cookie) {
     withString(env, nameStr, [tag, cookie](const char* str) {
-        atrace_async_end(tag, str, cookie);
+        tracing_perfetto::traceAsyncEnd(tag, str, cookie);
     });
 }
 
@@ -93,7 +90,7 @@ static void android_os_Trace_nativeAsyncTraceForTrackBegin(JNIEnv* env, jclass,
         jlong tag, jstring trackStr, jstring nameStr, jint cookie) {
     withString(env, trackStr, [env, tag, nameStr, cookie](const char* track) {
         withString(env, nameStr, [tag, track, cookie](const char* name) {
-            atrace_async_for_track_begin(tag, track, name, cookie);
+            tracing_perfetto::traceAsyncBeginForTrack(tag, name, track, cookie);
         });
     });
 }
@@ -101,77 +98,66 @@ static void android_os_Trace_nativeAsyncTraceForTrackBegin(JNIEnv* env, jclass,
 static void android_os_Trace_nativeAsyncTraceForTrackEnd(JNIEnv* env, jclass,
         jlong tag, jstring trackStr, jint cookie) {
     withString(env, trackStr, [tag, cookie](const char* track) {
-        atrace_async_for_track_end(tag, track, cookie);
+        tracing_perfetto::traceAsyncEndForTrack(tag, track, cookie);
     });
 }
 
 static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv*, jclass, jboolean allowed) {
-    atrace_update_tags();
+    // no-op
 }
 
 static void android_os_Trace_nativeSetTracingEnabled(JNIEnv*, jclass, jboolean enabled) {
-    atrace_set_tracing_enabled(enabled);
+    // no-op
 }
 
 static void android_os_Trace_nativeInstant(JNIEnv* env, jclass,
         jlong tag, jstring nameStr) {
-    withString(env, nameStr, [tag](const char* str) {
-        atrace_instant(tag, str);
-    });
+    withString(env, nameStr, [tag](const char* str) { tracing_perfetto::traceInstant(tag, str); });
 }
 
 static void android_os_Trace_nativeInstantForTrack(JNIEnv* env, jclass,
         jlong tag, jstring trackStr, jstring nameStr) {
     withString(env, trackStr, [env, tag, nameStr](const char* track) {
         withString(env, nameStr, [tag, track](const char* name) {
-            atrace_instant_for_track(tag, track, name);
+            tracing_perfetto::traceInstantForTrack(tag, track, name);
         });
     });
 }
 
+static jlong android_os_Trace_nativeGetEnabledTags(JNIEnv* env) {
+    return tracing_perfetto::getEnabledCategories();
+}
+
+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 },
-    { "nativeSetTracingEnabled",
-            "(Z)V",
-            (void*)android_os_Trace_nativeSetTracingEnabled },
-
-    // ----------- @FastNative  ----------------
-
-    { "nativeTraceCounter",
-            "(JLjava/lang/String;J)V",
-            (void*)android_os_Trace_nativeTraceCounter },
-    { "nativeTraceBegin",
-            "(JLjava/lang/String;)V",
-            (void*)android_os_Trace_nativeTraceBegin },
-    { "nativeTraceEnd",
-            "(J)V",
-            (void*)android_os_Trace_nativeTraceEnd },
-    { "nativeAsyncTraceBegin",
-            "(JLjava/lang/String;I)V",
-            (void*)android_os_Trace_nativeAsyncTraceBegin },
-    { "nativeAsyncTraceEnd",
-            "(JLjava/lang/String;I)V",
-            (void*)android_os_Trace_nativeAsyncTraceEnd },
-    { "nativeAsyncTraceForTrackBegin",
-            "(JLjava/lang/String;Ljava/lang/String;I)V",
-            (void*)android_os_Trace_nativeAsyncTraceForTrackBegin },
-    { "nativeAsyncTraceForTrackEnd",
-            "(JLjava/lang/String;I)V",
-            (void*)android_os_Trace_nativeAsyncTraceForTrackEnd },
-    { "nativeInstant",
-            "(JLjava/lang/String;)V",
-            (void*)android_os_Trace_nativeInstant },
-    { "nativeInstantForTrack",
-            "(JLjava/lang/String;Ljava/lang/String;)V",
-            (void*)android_os_Trace_nativeInstantForTrack },
-
-    // ----------- @CriticalNative  ----------------
-    { "nativeGetEnabledTags",
-            "()J",
-            (void*)atrace_get_enabled_tags },
+        /* name, signature, funcPtr */
+        {"nativeSetAppTracingAllowed", "(Z)V", (void*)android_os_Trace_nativeSetAppTracingAllowed},
+        {"nativeSetTracingEnabled", "(Z)V", (void*)android_os_Trace_nativeSetTracingEnabled},
+
+        // ----------- @FastNative  ----------------
+
+        {"nativeTraceCounter", "(JLjava/lang/String;J)V",
+         (void*)android_os_Trace_nativeTraceCounter},
+        {"nativeTraceBegin", "(JLjava/lang/String;)V", (void*)android_os_Trace_nativeTraceBegin},
+        {"nativeTraceEnd", "(J)V", (void*)android_os_Trace_nativeTraceEnd},
+        {"nativeAsyncTraceBegin", "(JLjava/lang/String;I)V",
+         (void*)android_os_Trace_nativeAsyncTraceBegin},
+        {"nativeAsyncTraceEnd", "(JLjava/lang/String;I)V",
+         (void*)android_os_Trace_nativeAsyncTraceEnd},
+        {"nativeAsyncTraceForTrackBegin", "(JLjava/lang/String;Ljava/lang/String;I)V",
+         (void*)android_os_Trace_nativeAsyncTraceForTrackBegin},
+        {"nativeAsyncTraceForTrackEnd", "(JLjava/lang/String;I)V",
+         (void*)android_os_Trace_nativeAsyncTraceForTrackEnd},
+        {"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  ----------------
+        {"nativeGetEnabledTags", "()J", (void*)android_os_Trace_nativeGetEnabledTags},
 };
 
 int register_android_os_Trace(JNIEnv* env) {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 9d95c5b4f649..2112dae0f311 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -76,6 +76,7 @@ import android.os.ServiceManager;
 import android.os.StrictMode;
 import android.os.SystemClock;
 import android.os.SystemProperties;
+import android.os.Trace;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.storage.IStorageManager;
@@ -1089,6 +1090,7 @@ public final class SystemServer implements Dumpable {
 
         final Context systemUiContext = activityThread.getSystemUiContext();
         systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
+        Trace.registerWithPerfetto();
     }
 
     /**
-- 
GitLab