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

Commit f0c4ba1d authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add @NonNull annotation to IProtoLog API" into main

parents 65b1c341 9a508586
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -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;
@@ -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.
 */
@@ -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.");
@@ -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;
    }

@@ -97,7 +99,7 @@ public class LogcatOnlyProtoLogImpl implements IProtoLog {
    }

    @Override
    public void registerGroups(IProtoLogGroup... groups) {
    public void registerGroups(@NonNull IProtoLogGroup... groups) {
        // No-op
    }
}
+19 −11
Original line number Diff line number Diff line
@@ -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;

@@ -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;

@@ -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));
    }

@@ -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);
+42 −38
Original line number Diff line number Diff line
@@ -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) {
@@ -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!");

@@ -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) {
@@ -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);
@@ -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);
@@ -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);
    }

@@ -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 {
@@ -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) {
@@ -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()) {
@@ -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;
@@ -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 {
@@ -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());
@@ -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) {
@@ -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();
@@ -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();
@@ -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,
@@ -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
    ) {
@@ -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);
@@ -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;
        }
@@ -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");
@@ -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();
@@ -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]++;
@@ -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();
@@ -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;
@@ -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);
+4 −3
Original line number Diff line number Diff line
@@ -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;
        }
@@ -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;
        }
@@ -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";
        }
+12 −7
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.internal.protolog.common;

import android.annotation.NonNull;
import android.annotation.Nullable;

import java.util.List;

/**
@@ -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
@@ -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.
@@ -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.
@@ -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();

    /**
@@ -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);
}