Loading core/java/com/android/internal/protolog/LogcatOnlyProtoLogImpl.java +11 −9 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.internal.protolog; import static com.android.internal.protolog.ProtoLog.REQUIRE_PROTOLOGTOOL; import android.annotation.NonNull; import android.annotation.Nullable; import android.ravenwood.annotation.RavenwoodKeepWholeClass; import android.text.TextUtils; import android.util.Log; Loading @@ -36,7 +37,7 @@ import java.util.List; * the ProtoLog tool, when the tracing to Perfetto flag is off, and the static REQUIRE_PROTOLOGTOOL * boolean is false. In which case we simply want to log protolog message to logcat. Note, that this * means that in such cases there is no real advantage of using protolog over logcat. * * <p> * NOTE: Should not be used in real products as this mostly removes the benefits of protolog. This * is just a temporary class to support a legacy behavior and tests running on the host-side. */ Loading @@ -45,13 +46,14 @@ public class LogcatOnlyProtoLogImpl implements IProtoLog { private static final String LOG_TAG = LogcatOnlyProtoLogImpl.class.getName(); @Override public void log(LogLevel logLevel, IProtoLogGroup group, long messageHash, int paramsMask, Object[] args) { throw new RuntimeException("Not supported when using LogcatOnlyProtoLogImpl"); public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, long messageHash, int paramsMask, @Nullable Object[] args) { throw new UnsupportedOperationException("Not supported when using LogcatOnlyProtoLogImpl"); } @Override public void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object[] args) { public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, @NonNull String messageString, @NonNull Object[] args) { if (REQUIRE_PROTOLOGTOOL && group.isLogToProto()) { Log.w(LOG_TAG, "ProtoLog message not processed. Failed to log it to proto. " + "Logging it below to logcat instead."); Loading @@ -76,17 +78,17 @@ public class LogcatOnlyProtoLogImpl implements IProtoLog { } @Override public int startLoggingToLogcat(String[] groups, ILogger logger) { public int startLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return 0; } @Override public int stopLoggingToLogcat(String[] groups, ILogger logger) { public int stopLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return 0; } @Override public boolean isEnabled(IProtoLogGroup group, LogLevel level) { public boolean isEnabled(@NonNull IProtoLogGroup group, @NonNull LogLevel level) { return true; } Loading @@ -97,7 +99,7 @@ public class LogcatOnlyProtoLogImpl implements IProtoLog { } @Override public void registerGroups(IProtoLogGroup... groups) { public void registerGroups(@NonNull IProtoLogGroup... groups) { // No-op } } core/java/com/android/internal/protolog/NoViewerConfigProtoLogImpl.java +19 −11 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.internal.protolog; import android.annotation.NonNull; import android.annotation.Nullable; import android.text.TextUtils; import android.util.Log; Loading @@ -25,6 +27,7 @@ import com.android.internal.protolog.common.IProtoLogGroup; import com.android.internal.protolog.common.LogLevel; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; Loading @@ -40,15 +43,18 @@ public class NoViewerConfigProtoLogImpl implements IProtoLog { private static final String LOG_TAG = "ProtoLog"; @Override public void log(LogLevel logLevel, IProtoLogGroup group, long messageHash, int paramsMask, Object[] args) { public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, long messageHash, int paramsMask, @Nullable Object[] args) { final var argsString = args == null ? "" : Arrays.stream(args).map(Object::toString).collect(Collectors.joining()); Log.w(LOG_TAG, "ProtoLogging is not available due to missing viewer config file..."); logMessage(logLevel, group.getTag(), "PROTOLOG#" + messageHash + "(" + Arrays.stream(args).map(Object::toString).collect(Collectors.joining()) + ")"); logMessage(logLevel, group.getTag(), "PROTOLOG#" + messageHash + "(" + argsString + ")"); } @Override public void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object... args) { public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, @NonNull String messageString, @NonNull Object... args) { logMessage(logLevel, group.getTag(), TextUtils.formatSimple(messageString, args)); } Loading @@ -58,31 +64,33 @@ public class NoViewerConfigProtoLogImpl implements IProtoLog { } @Override public int startLoggingToLogcat(String[] groups, ILogger logger) { public int startLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return 0; } @Override public int stopLoggingToLogcat(String[] groups, ILogger logger) { public int stopLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return 0; } @Override public boolean isEnabled(IProtoLogGroup group, LogLevel level) { public boolean isEnabled(@NonNull IProtoLogGroup group, @NonNull LogLevel level) { return false; } @Override @NonNull public List<IProtoLogGroup> getRegisteredGroups() { return List.of(); return Collections.emptyList(); } @Override public void registerGroups(IProtoLogGroup... groups) { public void registerGroups(@NonNull IProtoLogGroup... groups) { // No-op } private void logMessage(LogLevel logLevel, String tag, String message) { private void logMessage( @NonNull LogLevel logLevel, @NonNull String tag, @NonNull String message) { switch (logLevel) { case VERBOSE -> Log.v(tag, message); case INFO -> Log.i(tag, message); Loading core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java +42 −38 Original line number Diff line number Diff line Loading @@ -172,7 +172,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } @Override public void registerGroups(IProtoLogGroup... groups) { public void registerGroups(@NonNull IProtoLogGroup... groups) { registerGroupsLocally(groups); if (mConfigurationService != null) { Loading Loading @@ -229,7 +229,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen }); } private void registerGroupsWithConfigurationServiceAsync(IProtoLogGroup... groups) { private void registerGroupsWithConfigurationServiceAsync(@NonNull IProtoLogGroup... groups) { Objects.requireNonNull(mConfigurationService, "A null ProtoLog Configuration Service was provided!"); Loading Loading @@ -288,13 +288,14 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen */ @VisibleForTesting @Override public void log(LogLevel logLevel, IProtoLogGroup group, long messageHash, int paramsMask, @Nullable Object[] args) { public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, long messageHash, int paramsMask, @Nullable Object[] args) { log(logLevel, group, new Message(messageHash, paramsMask), args); } @Override public void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object... args) { public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, @NonNull String messageString, @NonNull Object... args) { try { log(logLevel, group, new Message(messageString), args); } catch (InvalidFormatStringException e) { Loading @@ -307,7 +308,8 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen * SLog wrapper. */ @VisibleForTesting public void passToLogcat(String tag, LogLevel level, String message) { public void passToLogcat( @NonNull String tag, @NonNull LogLevel level, @NonNull String message) { switch (level) { case DEBUG: Slog.d(tag, message); Loading Loading @@ -338,7 +340,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } @Override public void toggleLogcat(boolean enabled, String[] groups) { public void toggleLogcat(boolean enabled, @NonNull String[] groups) { final ILogger logger = (message) -> Log.d(LOG_TAG, message); if (enabled) { startLoggingToLogcat(groups, logger); Loading @@ -353,7 +355,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen * @param logger A logger to write status updates to * @return status code */ public int startLoggingToLogcat(String[] groups, @NonNull ILogger logger) { public int startLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return setTextLogging(true, logger, groups); } Loading @@ -363,12 +365,12 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen * @param logger A logger to write status updates to * @return status code */ public int stopLoggingToLogcat(String[] groups, @NonNull ILogger logger) { public int stopLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return setTextLogging(false, logger, groups); } @Override public boolean isEnabled(IProtoLogGroup group, LogLevel level) { public boolean isEnabled(@NonNull IProtoLogGroup group, @NonNull LogLevel level) { var readLock = mConfigUpdaterLock.readLock(); readLock.lock(); try { Loading @@ -384,7 +386,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen @Override @NonNull public List<IProtoLogGroup> getRegisteredGroups() { return mLogGroups.values().stream().toList(); return List.copyOf(mLogGroups.values()); } private void registerGroupsLocally(@NonNull IProtoLogGroup[] protoLogGroups) { Loading Loading @@ -422,7 +424,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen * Responds to a shell command. */ @Deprecated public int onShellCommand(ShellCommand shell) { public int onShellCommand(@NonNull ShellCommand shell) { PrintWriter pw = shell.getOutPrintWriter(); if (android.tracing.Flags.clientSideProtoLogging()) { Loading Loading @@ -459,8 +461,8 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } } private void log(LogLevel logLevel, IProtoLogGroup group, Message message, @Nullable Object[] args) { private void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, @NonNull Message message, @Nullable Object[] args) { if (isProtoEnabled()) { long tsNanos = SystemClock.elapsedRealtimeNanos(); final String stacktrace; Loading Loading @@ -534,8 +536,8 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen logToLogcat(tag, level, messageString, args); } private void logToLogcat(String tag, LogLevel level, String messageString, @Nullable Object[] args) { private void logToLogcat(@NonNull String tag, @NonNull LogLevel level, @NonNull String messageString, @Nullable Object[] args) { String message; if (args != null) { try { Loading @@ -551,8 +553,9 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen passToLogcat(tag, level, message); } private void logToProto(LogLevel level, IProtoLogGroup logGroup, Message message, Object[] args, long tsNanos, @Nullable String stacktrace) { private void logToProto(@NonNull LogLevel level, @NonNull IProtoLogGroup logGroup, @NonNull Message message, @Nullable Object[] args, long tsNanos, @Nullable String stacktrace) { mDataSource.trace(ctx -> { final ProtoLogDataSource.TlsState tlsState = ctx.getCustomTlsState(); final LogLevel logFrom = tlsState.getLogFromLevel(logGroup.name()); Loading Loading @@ -668,9 +671,9 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } private long internProtoMessage( TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx, LogLevel level, IProtoLogGroup logGroup, String message) { @NonNull TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx, @NonNull LogLevel level, @NonNull IProtoLogGroup logGroup, @NonNull String message) { final ProtoLogDataSource.IncrementalState incrementalState = ctx.getIncrementalState(); if (!incrementalState.clearReported) { Loading Loading @@ -720,9 +723,9 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } private Long hash( LogLevel logLevel, String logGroup, String messageString @NonNull LogLevel logLevel, @NonNull String logGroup, @NonNull String messageString ) { final String fullStringIdentifier = messageString + logLevel + logGroup; return UUID.nameUUIDFromBytes(fullStringIdentifier.getBytes()).getMostSignificantBits(); Loading @@ -730,6 +733,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen private static final int STACK_SIZE_TO_PROTO_LOG_ENTRY_CALL = 6; @NonNull private String collectStackTrace() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); StringWriter sw = new StringWriter(); Loading @@ -742,20 +746,20 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen return sw.toString(); } private int internStacktraceString(TracingContext< private int internStacktraceString(@NonNull TracingContext< ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx, String stacktrace) { @NonNull String stacktrace) { final ProtoLogDataSource.IncrementalState incrementalState = ctx.getIncrementalState(); return internString(ctx, incrementalState.stacktraceInterningMap, PROTOLOG_STACKTRACE, stacktrace); } private int internStringArg( TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, @NonNull TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx, String string @NonNull String string ) { final ProtoLogDataSource.IncrementalState incrementalState = ctx.getIncrementalState(); return internString(ctx, incrementalState.argumentInterningMap, Loading @@ -763,9 +767,9 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } private int internString( TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, @NonNull TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx, Map<String, Integer> internMap, @NonNull Map<String, Integer> internMap, long fieldId, @NonNull String string ) { Loading Loading @@ -793,7 +797,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen return internMap.get(string); } protected boolean validateGroups(ILogger logger, String[] groups) { protected boolean validateGroups(@NonNull ILogger logger, @NonNull String[] groups) { for (int i = 0; i < groups.length; i++) { String group = groups[i]; IProtoLogGroup g = mLogGroups.get(group); Loading @@ -805,7 +809,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen return true; } private int setTextLogging(boolean value, ILogger logger, String... groups) { private int setTextLogging(boolean value, @NonNull ILogger logger, @NonNull String... groups) { if (!validateGroups(logger, groups)) { return -1; } Loading @@ -824,7 +828,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen return 0; } private int unknownCommand(PrintWriter pw) { private int unknownCommand(@NonNull PrintWriter pw) { pw.println("Unknown command"); pw.println("Window manager logging options:"); pw.println(" enable-text [group...]: Enable logcat logging for given groups"); Loading @@ -834,7 +838,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen @Override public void onTracingInstanceStart( int instanceIdx, ProtoLogDataSource.ProtoLogConfig config) { int instanceIdx, @NonNull ProtoLogDataSource.ProtoLogConfig config) { Log.d(LOG_TAG, "Executing onTracingInstanceStart"); var writeLock = mConfigUpdaterLock.writeLock(); Loading @@ -848,7 +852,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen Log.d(LOG_TAG, "Finished onTracingInstanceStart"); } private void onTracingInstanceStartLocked(ProtoLogDataSource.ProtoLogConfig config) { private void onTracingInstanceStartLocked(@NonNull ProtoLogDataSource.ProtoLogConfig config) { final LogLevel defaultLogFrom = config.getDefaultGroupConfig().logFrom; for (int i = defaultLogFrom.ordinal(); i < LogLevel.values().length; i++) { mDefaultLogLevelCounts[i]++; Loading Loading @@ -878,7 +882,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen @Override public synchronized void onTracingInstanceStop( int instanceIdx, ProtoLogDataSource.ProtoLogConfig config) { int instanceIdx, @NonNull ProtoLogDataSource.ProtoLogConfig config) { Log.d(LOG_TAG, "Executing onTracingInstanceStop"); var writeLock = mConfigUpdaterLock.writeLock(); Loading @@ -892,7 +896,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen Log.d(LOG_TAG, "Finished onTracingInstanceStop"); } private void onTracingInstanceStopLocked(ProtoLogDataSource.ProtoLogConfig config) { private void onTracingInstanceStopLocked(@NonNull ProtoLogDataSource.ProtoLogConfig config) { this.mTracingInstances.decrementAndGet(); final LogLevel defaultLogFrom = config.getDefaultGroupConfig().logFrom; Loading Loading @@ -926,7 +930,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen mCacheUpdater.update(this); } private static void logAndPrintln(@Nullable PrintWriter pw, String msg) { private static void logAndPrintln(@Nullable PrintWriter pw, @NonNull String msg) { Slog.i(LOG_TAG, msg); if (pw != null) { pw.println(msg); Loading core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java +4 −3 Original line number Diff line number Diff line Loading @@ -116,7 +116,7 @@ public class ProcessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { * @return status code */ @Override public int startLoggingToLogcat(String[] groups, @NonNull ILogger logger) { public int startLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { if (!validateGroups(logger, groups)) { return -1; } Loading @@ -132,7 +132,7 @@ public class ProcessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { * @return status code */ @Override public int stopLoggingToLogcat(String[] groups, @NonNull ILogger logger) { public int stopLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { if (!validateGroups(logger, groups)) { return -1; } Loading Loading @@ -173,7 +173,8 @@ public class ProcessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { return messageString; } private String getReasonForFailureToGetMessageString(Message message) { @NonNull private String getReasonForFailureToGetMessageString(@NonNull Message message) { if (message.getMessageHash() == null) { return "Trying to get message from null message hash"; } Loading core/java/com/android/internal/protolog/common/IProtoLog.java +12 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,9 @@ package com.android.internal.protolog.common; import android.annotation.NonNull; import android.annotation.Nullable; import java.util.List; /** Loading @@ -31,8 +34,8 @@ public interface IProtoLog { * @param paramsMask The parameters mask of the message. * @param args The arguments of the message. */ void log(LogLevel logLevel, IProtoLogGroup group, long messageHash, int paramsMask, Object[] args); void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, long messageHash, int paramsMask, @Nullable Object[] args); /** * Log a ProtoLog message Loading @@ -41,7 +44,8 @@ public interface IProtoLog { * @param messageString The message string. * @param args The arguments of the message. */ void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object... args); void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, @NonNull String messageString, @NonNull Object... args); /** * Check if ProtoLog is tracing. Loading @@ -54,14 +58,14 @@ public interface IProtoLog { * @param groups Groups to start text logging for * @return status code */ int startLoggingToLogcat(String[] groups, ILogger logger); int startLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger); /** * Stop logging log groups to logcat * @param groups Groups to start text logging for * @return status code */ int stopLoggingToLogcat(String[] groups, ILogger logger); int stopLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger); /** * Should return true iff logging is enabled to ProtoLog or to Logcat for this group and level. Loading @@ -69,11 +73,12 @@ public interface IProtoLog { * @param level ProtoLog level to check for. * @return If we need to log this group and level to either ProtoLog or Logcat. */ boolean isEnabled(IProtoLogGroup group, LogLevel level); boolean isEnabled(@NonNull IProtoLogGroup group, @NonNull LogLevel level); /** * @return an immutable list of the registered ProtoLog groups in this ProtoLog instance. */ @NonNull List<IProtoLogGroup> getRegisteredGroups(); /** Loading @@ -81,5 +86,5 @@ public interface IProtoLog { * Only groups registered with this ProtoLog instance should be logged through this instance. * @param groups The groups to register. */ void registerGroups(IProtoLogGroup... groups); void registerGroups(@NonNull IProtoLogGroup... groups); } Loading
core/java/com/android/internal/protolog/LogcatOnlyProtoLogImpl.java +11 −9 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.internal.protolog; import static com.android.internal.protolog.ProtoLog.REQUIRE_PROTOLOGTOOL; import android.annotation.NonNull; import android.annotation.Nullable; import android.ravenwood.annotation.RavenwoodKeepWholeClass; import android.text.TextUtils; import android.util.Log; Loading @@ -36,7 +37,7 @@ import java.util.List; * the ProtoLog tool, when the tracing to Perfetto flag is off, and the static REQUIRE_PROTOLOGTOOL * boolean is false. In which case we simply want to log protolog message to logcat. Note, that this * means that in such cases there is no real advantage of using protolog over logcat. * * <p> * NOTE: Should not be used in real products as this mostly removes the benefits of protolog. This * is just a temporary class to support a legacy behavior and tests running on the host-side. */ Loading @@ -45,13 +46,14 @@ public class LogcatOnlyProtoLogImpl implements IProtoLog { private static final String LOG_TAG = LogcatOnlyProtoLogImpl.class.getName(); @Override public void log(LogLevel logLevel, IProtoLogGroup group, long messageHash, int paramsMask, Object[] args) { throw new RuntimeException("Not supported when using LogcatOnlyProtoLogImpl"); public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, long messageHash, int paramsMask, @Nullable Object[] args) { throw new UnsupportedOperationException("Not supported when using LogcatOnlyProtoLogImpl"); } @Override public void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object[] args) { public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, @NonNull String messageString, @NonNull Object[] args) { if (REQUIRE_PROTOLOGTOOL && group.isLogToProto()) { Log.w(LOG_TAG, "ProtoLog message not processed. Failed to log it to proto. " + "Logging it below to logcat instead."); Loading @@ -76,17 +78,17 @@ public class LogcatOnlyProtoLogImpl implements IProtoLog { } @Override public int startLoggingToLogcat(String[] groups, ILogger logger) { public int startLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return 0; } @Override public int stopLoggingToLogcat(String[] groups, ILogger logger) { public int stopLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return 0; } @Override public boolean isEnabled(IProtoLogGroup group, LogLevel level) { public boolean isEnabled(@NonNull IProtoLogGroup group, @NonNull LogLevel level) { return true; } Loading @@ -97,7 +99,7 @@ public class LogcatOnlyProtoLogImpl implements IProtoLog { } @Override public void registerGroups(IProtoLogGroup... groups) { public void registerGroups(@NonNull IProtoLogGroup... groups) { // No-op } }
core/java/com/android/internal/protolog/NoViewerConfigProtoLogImpl.java +19 −11 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.internal.protolog; import android.annotation.NonNull; import android.annotation.Nullable; import android.text.TextUtils; import android.util.Log; Loading @@ -25,6 +27,7 @@ import com.android.internal.protolog.common.IProtoLogGroup; import com.android.internal.protolog.common.LogLevel; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; Loading @@ -40,15 +43,18 @@ public class NoViewerConfigProtoLogImpl implements IProtoLog { private static final String LOG_TAG = "ProtoLog"; @Override public void log(LogLevel logLevel, IProtoLogGroup group, long messageHash, int paramsMask, Object[] args) { public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, long messageHash, int paramsMask, @Nullable Object[] args) { final var argsString = args == null ? "" : Arrays.stream(args).map(Object::toString).collect(Collectors.joining()); Log.w(LOG_TAG, "ProtoLogging is not available due to missing viewer config file..."); logMessage(logLevel, group.getTag(), "PROTOLOG#" + messageHash + "(" + Arrays.stream(args).map(Object::toString).collect(Collectors.joining()) + ")"); logMessage(logLevel, group.getTag(), "PROTOLOG#" + messageHash + "(" + argsString + ")"); } @Override public void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object... args) { public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, @NonNull String messageString, @NonNull Object... args) { logMessage(logLevel, group.getTag(), TextUtils.formatSimple(messageString, args)); } Loading @@ -58,31 +64,33 @@ public class NoViewerConfigProtoLogImpl implements IProtoLog { } @Override public int startLoggingToLogcat(String[] groups, ILogger logger) { public int startLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return 0; } @Override public int stopLoggingToLogcat(String[] groups, ILogger logger) { public int stopLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return 0; } @Override public boolean isEnabled(IProtoLogGroup group, LogLevel level) { public boolean isEnabled(@NonNull IProtoLogGroup group, @NonNull LogLevel level) { return false; } @Override @NonNull public List<IProtoLogGroup> getRegisteredGroups() { return List.of(); return Collections.emptyList(); } @Override public void registerGroups(IProtoLogGroup... groups) { public void registerGroups(@NonNull IProtoLogGroup... groups) { // No-op } private void logMessage(LogLevel logLevel, String tag, String message) { private void logMessage( @NonNull LogLevel logLevel, @NonNull String tag, @NonNull String message) { switch (logLevel) { case VERBOSE -> Log.v(tag, message); case INFO -> Log.i(tag, message); Loading
core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java +42 −38 Original line number Diff line number Diff line Loading @@ -172,7 +172,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } @Override public void registerGroups(IProtoLogGroup... groups) { public void registerGroups(@NonNull IProtoLogGroup... groups) { registerGroupsLocally(groups); if (mConfigurationService != null) { Loading Loading @@ -229,7 +229,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen }); } private void registerGroupsWithConfigurationServiceAsync(IProtoLogGroup... groups) { private void registerGroupsWithConfigurationServiceAsync(@NonNull IProtoLogGroup... groups) { Objects.requireNonNull(mConfigurationService, "A null ProtoLog Configuration Service was provided!"); Loading Loading @@ -288,13 +288,14 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen */ @VisibleForTesting @Override public void log(LogLevel logLevel, IProtoLogGroup group, long messageHash, int paramsMask, @Nullable Object[] args) { public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, long messageHash, int paramsMask, @Nullable Object[] args) { log(logLevel, group, new Message(messageHash, paramsMask), args); } @Override public void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object... args) { public void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, @NonNull String messageString, @NonNull Object... args) { try { log(logLevel, group, new Message(messageString), args); } catch (InvalidFormatStringException e) { Loading @@ -307,7 +308,8 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen * SLog wrapper. */ @VisibleForTesting public void passToLogcat(String tag, LogLevel level, String message) { public void passToLogcat( @NonNull String tag, @NonNull LogLevel level, @NonNull String message) { switch (level) { case DEBUG: Slog.d(tag, message); Loading Loading @@ -338,7 +340,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } @Override public void toggleLogcat(boolean enabled, String[] groups) { public void toggleLogcat(boolean enabled, @NonNull String[] groups) { final ILogger logger = (message) -> Log.d(LOG_TAG, message); if (enabled) { startLoggingToLogcat(groups, logger); Loading @@ -353,7 +355,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen * @param logger A logger to write status updates to * @return status code */ public int startLoggingToLogcat(String[] groups, @NonNull ILogger logger) { public int startLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return setTextLogging(true, logger, groups); } Loading @@ -363,12 +365,12 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen * @param logger A logger to write status updates to * @return status code */ public int stopLoggingToLogcat(String[] groups, @NonNull ILogger logger) { public int stopLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { return setTextLogging(false, logger, groups); } @Override public boolean isEnabled(IProtoLogGroup group, LogLevel level) { public boolean isEnabled(@NonNull IProtoLogGroup group, @NonNull LogLevel level) { var readLock = mConfigUpdaterLock.readLock(); readLock.lock(); try { Loading @@ -384,7 +386,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen @Override @NonNull public List<IProtoLogGroup> getRegisteredGroups() { return mLogGroups.values().stream().toList(); return List.copyOf(mLogGroups.values()); } private void registerGroupsLocally(@NonNull IProtoLogGroup[] protoLogGroups) { Loading Loading @@ -422,7 +424,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen * Responds to a shell command. */ @Deprecated public int onShellCommand(ShellCommand shell) { public int onShellCommand(@NonNull ShellCommand shell) { PrintWriter pw = shell.getOutPrintWriter(); if (android.tracing.Flags.clientSideProtoLogging()) { Loading Loading @@ -459,8 +461,8 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } } private void log(LogLevel logLevel, IProtoLogGroup group, Message message, @Nullable Object[] args) { private void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, @NonNull Message message, @Nullable Object[] args) { if (isProtoEnabled()) { long tsNanos = SystemClock.elapsedRealtimeNanos(); final String stacktrace; Loading Loading @@ -534,8 +536,8 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen logToLogcat(tag, level, messageString, args); } private void logToLogcat(String tag, LogLevel level, String messageString, @Nullable Object[] args) { private void logToLogcat(@NonNull String tag, @NonNull LogLevel level, @NonNull String messageString, @Nullable Object[] args) { String message; if (args != null) { try { Loading @@ -551,8 +553,9 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen passToLogcat(tag, level, message); } private void logToProto(LogLevel level, IProtoLogGroup logGroup, Message message, Object[] args, long tsNanos, @Nullable String stacktrace) { private void logToProto(@NonNull LogLevel level, @NonNull IProtoLogGroup logGroup, @NonNull Message message, @Nullable Object[] args, long tsNanos, @Nullable String stacktrace) { mDataSource.trace(ctx -> { final ProtoLogDataSource.TlsState tlsState = ctx.getCustomTlsState(); final LogLevel logFrom = tlsState.getLogFromLevel(logGroup.name()); Loading Loading @@ -668,9 +671,9 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } private long internProtoMessage( TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx, LogLevel level, IProtoLogGroup logGroup, String message) { @NonNull TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx, @NonNull LogLevel level, @NonNull IProtoLogGroup logGroup, @NonNull String message) { final ProtoLogDataSource.IncrementalState incrementalState = ctx.getIncrementalState(); if (!incrementalState.clearReported) { Loading Loading @@ -720,9 +723,9 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } private Long hash( LogLevel logLevel, String logGroup, String messageString @NonNull LogLevel logLevel, @NonNull String logGroup, @NonNull String messageString ) { final String fullStringIdentifier = messageString + logLevel + logGroup; return UUID.nameUUIDFromBytes(fullStringIdentifier.getBytes()).getMostSignificantBits(); Loading @@ -730,6 +733,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen private static final int STACK_SIZE_TO_PROTO_LOG_ENTRY_CALL = 6; @NonNull private String collectStackTrace() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); StringWriter sw = new StringWriter(); Loading @@ -742,20 +746,20 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen return sw.toString(); } private int internStacktraceString(TracingContext< private int internStacktraceString(@NonNull TracingContext< ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx, String stacktrace) { @NonNull String stacktrace) { final ProtoLogDataSource.IncrementalState incrementalState = ctx.getIncrementalState(); return internString(ctx, incrementalState.stacktraceInterningMap, PROTOLOG_STACKTRACE, stacktrace); } private int internStringArg( TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, @NonNull TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx, String string @NonNull String string ) { final ProtoLogDataSource.IncrementalState incrementalState = ctx.getIncrementalState(); return internString(ctx, incrementalState.argumentInterningMap, Loading @@ -763,9 +767,9 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } private int internString( TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, @NonNull TracingContext<ProtoLogDataSource.Instance, ProtoLogDataSource.TlsState, ProtoLogDataSource.IncrementalState> ctx, Map<String, Integer> internMap, @NonNull Map<String, Integer> internMap, long fieldId, @NonNull String string ) { Loading Loading @@ -793,7 +797,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen return internMap.get(string); } protected boolean validateGroups(ILogger logger, String[] groups) { protected boolean validateGroups(@NonNull ILogger logger, @NonNull String[] groups) { for (int i = 0; i < groups.length; i++) { String group = groups[i]; IProtoLogGroup g = mLogGroups.get(group); Loading @@ -805,7 +809,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen return true; } private int setTextLogging(boolean value, ILogger logger, String... groups) { private int setTextLogging(boolean value, @NonNull ILogger logger, @NonNull String... groups) { if (!validateGroups(logger, groups)) { return -1; } Loading @@ -824,7 +828,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen return 0; } private int unknownCommand(PrintWriter pw) { private int unknownCommand(@NonNull PrintWriter pw) { pw.println("Unknown command"); pw.println("Window manager logging options:"); pw.println(" enable-text [group...]: Enable logcat logging for given groups"); Loading @@ -834,7 +838,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen @Override public void onTracingInstanceStart( int instanceIdx, ProtoLogDataSource.ProtoLogConfig config) { int instanceIdx, @NonNull ProtoLogDataSource.ProtoLogConfig config) { Log.d(LOG_TAG, "Executing onTracingInstanceStart"); var writeLock = mConfigUpdaterLock.writeLock(); Loading @@ -848,7 +852,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen Log.d(LOG_TAG, "Finished onTracingInstanceStart"); } private void onTracingInstanceStartLocked(ProtoLogDataSource.ProtoLogConfig config) { private void onTracingInstanceStartLocked(@NonNull ProtoLogDataSource.ProtoLogConfig config) { final LogLevel defaultLogFrom = config.getDefaultGroupConfig().logFrom; for (int i = defaultLogFrom.ordinal(); i < LogLevel.values().length; i++) { mDefaultLogLevelCounts[i]++; Loading Loading @@ -878,7 +882,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen @Override public synchronized void onTracingInstanceStop( int instanceIdx, ProtoLogDataSource.ProtoLogConfig config) { int instanceIdx, @NonNull ProtoLogDataSource.ProtoLogConfig config) { Log.d(LOG_TAG, "Executing onTracingInstanceStop"); var writeLock = mConfigUpdaterLock.writeLock(); Loading @@ -892,7 +896,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen Log.d(LOG_TAG, "Finished onTracingInstanceStop"); } private void onTracingInstanceStopLocked(ProtoLogDataSource.ProtoLogConfig config) { private void onTracingInstanceStopLocked(@NonNull ProtoLogDataSource.ProtoLogConfig config) { this.mTracingInstances.decrementAndGet(); final LogLevel defaultLogFrom = config.getDefaultGroupConfig().logFrom; Loading Loading @@ -926,7 +930,7 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen mCacheUpdater.update(this); } private static void logAndPrintln(@Nullable PrintWriter pw, String msg) { private static void logAndPrintln(@Nullable PrintWriter pw, @NonNull String msg) { Slog.i(LOG_TAG, msg); if (pw != null) { pw.println(msg); Loading
core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java +4 −3 Original line number Diff line number Diff line Loading @@ -116,7 +116,7 @@ public class ProcessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { * @return status code */ @Override public int startLoggingToLogcat(String[] groups, @NonNull ILogger logger) { public int startLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { if (!validateGroups(logger, groups)) { return -1; } Loading @@ -132,7 +132,7 @@ public class ProcessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { * @return status code */ @Override public int stopLoggingToLogcat(String[] groups, @NonNull ILogger logger) { public int stopLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger) { if (!validateGroups(logger, groups)) { return -1; } Loading Loading @@ -173,7 +173,8 @@ public class ProcessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { return messageString; } private String getReasonForFailureToGetMessageString(Message message) { @NonNull private String getReasonForFailureToGetMessageString(@NonNull Message message) { if (message.getMessageHash() == null) { return "Trying to get message from null message hash"; } Loading
core/java/com/android/internal/protolog/common/IProtoLog.java +12 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,9 @@ package com.android.internal.protolog.common; import android.annotation.NonNull; import android.annotation.Nullable; import java.util.List; /** Loading @@ -31,8 +34,8 @@ public interface IProtoLog { * @param paramsMask The parameters mask of the message. * @param args The arguments of the message. */ void log(LogLevel logLevel, IProtoLogGroup group, long messageHash, int paramsMask, Object[] args); void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, long messageHash, int paramsMask, @Nullable Object[] args); /** * Log a ProtoLog message Loading @@ -41,7 +44,8 @@ public interface IProtoLog { * @param messageString The message string. * @param args The arguments of the message. */ void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object... args); void log(@NonNull LogLevel logLevel, @NonNull IProtoLogGroup group, @NonNull String messageString, @NonNull Object... args); /** * Check if ProtoLog is tracing. Loading @@ -54,14 +58,14 @@ public interface IProtoLog { * @param groups Groups to start text logging for * @return status code */ int startLoggingToLogcat(String[] groups, ILogger logger); int startLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger); /** * Stop logging log groups to logcat * @param groups Groups to start text logging for * @return status code */ int stopLoggingToLogcat(String[] groups, ILogger logger); int stopLoggingToLogcat(@NonNull String[] groups, @NonNull ILogger logger); /** * Should return true iff logging is enabled to ProtoLog or to Logcat for this group and level. Loading @@ -69,11 +73,12 @@ public interface IProtoLog { * @param level ProtoLog level to check for. * @return If we need to log this group and level to either ProtoLog or Logcat. */ boolean isEnabled(IProtoLogGroup group, LogLevel level); boolean isEnabled(@NonNull IProtoLogGroup group, @NonNull LogLevel level); /** * @return an immutable list of the registered ProtoLog groups in this ProtoLog instance. */ @NonNull List<IProtoLogGroup> getRegisteredGroups(); /** Loading @@ -81,5 +86,5 @@ public interface IProtoLog { * Only groups registered with this ProtoLog instance should be logged through this instance. * @param groups The groups to register. */ void registerGroups(IProtoLogGroup... groups); void registerGroups(@NonNull IProtoLogGroup... groups); }