From 2f72aa0bd1b59b6503edc9a8330bc004394d7fee Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 8 Dec 2021 19:50:27 -0800 Subject: [PATCH] Log UI events to traces Add LogBuffer tags to perfetto traces in order to simplify the process of reading them. A new track will indicate the state of notification, lock screen, AOD, etc. Bug: 207049735 Test: atest TraceDevTest Change-Id: I3253c0f5a369ad4a25d6646daa62810644553a36 --- core/java/android/os/Trace.java | 40 +++++++++++++++++++ core/jni/android_os_Trace.cpp | 22 ++++++++++ .../src/com/android/systemui/log/LogBuffer.kt | 6 ++- 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java index ddb6533547bb..d974e0c0713a 100644 --- a/core/java/android/os/Trace.java +++ b/core/java/android/os/Trace.java @@ -131,6 +131,10 @@ public final class Trace { private static native void nativeAsyncTraceBegin(long tag, String name, int cookie); @FastNative private static native void nativeAsyncTraceEnd(long tag, String name, int cookie); + @FastNative + private static native void nativeInstant(long tag, String name); + @FastNative + private static native void nativeInstantForTrack(long tag, String trackName, String name); private Trace() { } @@ -257,6 +261,42 @@ public final class Trace { } } + /** + * Writes a trace message to indicate that a given section of code was invoked. + * + * @param traceTag The trace tag. + * @param methodName The method name to appear in the trace. + * @hide + */ + public static void instant(long traceTag, String methodName) { + if (methodName == null) { + throw new IllegalArgumentException("methodName cannot be null"); + } + if (isTagEnabled(traceTag)) { + nativeInstant(traceTag, methodName); + } + } + + /** + * Writes a trace message to indicate that a given section of code was invoked. + * + * @param traceTag The trace tag. + * @param trackName The track where the event should appear in the trace. + * @param methodName The method name to appear in the trace. + * @hide + */ + public static void instantForTrack(long traceTag, String trackName, String methodName) { + if (trackName == null) { + throw new IllegalArgumentException("trackName cannot be null"); + } + if (methodName == null) { + throw new IllegalArgumentException("methodName cannot be null"); + } + if (isTagEnabled(traceTag)) { + nativeInstantForTrack(traceTag, trackName, methodName); + } + } + /** * Checks whether or not tracing is currently enabled. This is useful to avoid intermediate * string creation for trace sections that require formatting. It is not necessary diff --git a/core/jni/android_os_Trace.cpp b/core/jni/android_os_Trace.cpp index f67007cda209..85fd5d99e473 100644 --- a/core/jni/android_os_Trace.cpp +++ b/core/jni/android_os_Trace.cpp @@ -90,6 +90,22 @@ static void android_os_Trace_nativeSetTracingEnabled(JNIEnv*, jclass, jboolean e atrace_set_tracing_enabled(enabled); } +static void android_os_Trace_nativeInstant(JNIEnv* env, jclass, + jlong tag, jstring nameStr) { + withString(env, nameStr, [tag](char* str) { + atrace_instant(tag, str); + }); +} + +static void android_os_Trace_nativeInstantForTrack(JNIEnv* env, jclass, + jlong tag, jstring trackStr, jstring nameStr) { + withString(env, trackStr, [env, tag, nameStr](char* track) { + withString(env, nameStr, [tag, track](char* name) { + atrace_instant_for_track(tag, track, name); + }); + }); +} + static const JNINativeMethod gTraceMethods[] = { /* name, signature, funcPtr */ { "nativeSetAppTracingAllowed", @@ -116,6 +132,12 @@ static const JNINativeMethod gTraceMethods[] = { { "nativeAsyncTraceEnd", "(JLjava/lang/String;I)V", (void*)android_os_Trace_nativeAsyncTraceEnd }, + { "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", diff --git a/packages/SystemUI/src/com/android/systemui/log/LogBuffer.kt b/packages/SystemUI/src/com/android/systemui/log/LogBuffer.kt index c1db8edf4119..90064172dd36 100644 --- a/packages/SystemUI/src/com/android/systemui/log/LogBuffer.kt +++ b/packages/SystemUI/src/com/android/systemui/log/LogBuffer.kt @@ -16,6 +16,7 @@ package com.android.systemui.log +import android.os.Trace import android.util.Log import com.android.systemui.log.dagger.LogModule import java.io.PrintWriter @@ -169,7 +170,7 @@ class LogBuffer( buffer.add(message as LogMessageImpl) if (logcatEchoTracker.isBufferLoggable(name, message.level) || logcatEchoTracker.isTagLoggable(message.tag, message.level)) { - echoToLogcat(message) + echo(message) } } @@ -219,7 +220,7 @@ class LogBuffer( pw.println(message.printer(message)) } - private fun echoToLogcat(message: LogMessage) { + private fun echo(message: LogMessage) { val strMessage = message.printer(message) when (message.level) { LogLevel.VERBOSE -> Log.v(message.tag, strMessage) @@ -229,6 +230,7 @@ class LogBuffer( LogLevel.ERROR -> Log.e(message.tag, strMessage) LogLevel.WTF -> Log.wtf(message.tag, strMessage) } + Trace.instantForTrack(Trace.TRACE_TAG_APP, "UI Events", strMessage) } }