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

Commit 79a6d187 authored by Pablo Gamito's avatar Pablo Gamito Committed by Winson Chung
Browse files

Inject log group mapping into ProtoLogImpl generated classes

We then keep track of the logging state of each group that way and in
particular use this to toggle groups to logcat on and off.

Test: adb shell wm logging enable-text WM_DEBUG_WINDOW_TRANSITIONS
Bug: 327491675
Change-Id: I2a2e4cfdc51113a5aaf2adc51aa10f5df47a5051
Merged-In: I2a2e4cfdc51113a5aaf2adc51aa10f5df47a5051
(cherry picked from commit 869ebffa)
parent 6ed9de97
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -55,37 +55,38 @@ import java.util.stream.Collectors;
 * A service for the ProtoLog logging system.
 */
public class LegacyProtoLogImpl implements IProtoLog {
    private final TreeMap<String, IProtoLogGroup> mLogGroups = new TreeMap<>();

    private static final int BUFFER_CAPACITY = 1024 * 1024;
    private static final int PER_CHUNK_SIZE = 1024;
    private static final String TAG = "ProtoLog";
    private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L;
    static final String PROTOLOG_VERSION = "2.0.0";
    private static final int DEFAULT_PER_CHUNK_SIZE = 0;

    private final File mLogFile;
    private final String mLegacyViewerConfigFilename;
    private final TraceBuffer mBuffer;
    private final LegacyProtoLogViewerConfigReader mViewerConfig;
    private final TreeMap<String, IProtoLogGroup> mLogGroups;
    private final int mPerChunkSize;

    private boolean mProtoLogEnabled;
    private boolean mProtoLogEnabledLockFree;
    private final Object mProtoLogEnabledLock = new Object();

    public LegacyProtoLogImpl(String outputFile, String viewerConfigFilename) {
    public LegacyProtoLogImpl(String outputFile, String viewerConfigFilename,
            TreeMap<String, IProtoLogGroup> logGroups) {
        this(new File(outputFile), viewerConfigFilename, BUFFER_CAPACITY,
                new LegacyProtoLogViewerConfigReader(), PER_CHUNK_SIZE);
                new LegacyProtoLogViewerConfigReader(), PER_CHUNK_SIZE, logGroups);
    }

    public LegacyProtoLogImpl(File file, String viewerConfigFilename, int bufferCapacity,
            LegacyProtoLogViewerConfigReader viewerConfig, int perChunkSize) {
            LegacyProtoLogViewerConfigReader viewerConfig, int perChunkSize,
            TreeMap<String, IProtoLogGroup> logGroups) {
        mLogFile = file;
        mBuffer = new TraceBuffer(bufferCapacity);
        mLegacyViewerConfigFilename = viewerConfigFilename;
        mViewerConfig = viewerConfig;
        mPerChunkSize = perChunkSize;
        this.mLogGroups = logGroups;
    }

    /**
+13 −7
Original line number Diff line number Diff line
@@ -22,9 +22,9 @@ import static perfetto.protos.PerfettoTrace.InternedString.IID;
import static perfetto.protos.PerfettoTrace.InternedString.STR;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.BOOLEAN_PARAMS;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.DOUBLE_PARAMS;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.STACKTRACE_IID;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.MESSAGE_ID;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.SINT64_PARAMS;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.STACKTRACE_IID;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.STR_PARAM_IIDS;
import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.GROUPS;
import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.Group.ID;
@@ -78,7 +78,6 @@ import perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData;
 * A service for the ProtoLog logging system.
 */
public class PerfettoProtoLogImpl implements IProtoLog {
    private final TreeMap<String, IProtoLogGroup> mLogGroups = new TreeMap<>();
    private static final String LOG_TAG = "ProtoLog";
    private final AtomicInteger mTracingInstances = new AtomicInteger();

@@ -89,8 +88,10 @@ public class PerfettoProtoLogImpl implements IProtoLog {
    );
    private final ProtoLogViewerConfigReader mViewerConfigReader;
    private final ViewerConfigInputStreamProvider mViewerConfigInputStreamProvider;
    private final TreeMap<String, IProtoLogGroup> mLogGroups;

    public PerfettoProtoLogImpl(String viewerConfigFilePath) {
    public PerfettoProtoLogImpl(String viewerConfigFilePath,
            TreeMap<String, IProtoLogGroup> logGroups) {
        this(() -> {
            try {
                return new ProtoInputStream(new FileInputStream(viewerConfigFilePath));
@@ -98,23 +99,28 @@ public class PerfettoProtoLogImpl implements IProtoLog {
                Slog.w(LOG_TAG, "Failed to load viewer config file " + viewerConfigFilePath, e);
                return null;
            }
        });
        }, logGroups);
    }

    public PerfettoProtoLogImpl(ViewerConfigInputStreamProvider viewerConfigInputStreamProvider) {
    public PerfettoProtoLogImpl(
            ViewerConfigInputStreamProvider viewerConfigInputStreamProvider,
            TreeMap<String, IProtoLogGroup> logGroups
    ) {
        this(viewerConfigInputStreamProvider,
                new ProtoLogViewerConfigReader(viewerConfigInputStreamProvider));
                new ProtoLogViewerConfigReader(viewerConfigInputStreamProvider), logGroups);
    }

    @VisibleForTesting
    public PerfettoProtoLogImpl(
            ViewerConfigInputStreamProvider viewerConfigInputStreamProvider,
            ProtoLogViewerConfigReader viewerConfigReader
            ProtoLogViewerConfigReader viewerConfigReader,
            TreeMap<String, IProtoLogGroup> logGroups
    ) {
        Producer.init(InitArguments.DEFAULTS);
        mDataSource.register(DataSourceParams.DEFAULTS);
        this.mViewerConfigInputStreamProvider = viewerConfigInputStreamProvider;
        this.mViewerConfigReader = viewerConfigReader;
        this.mLogGroups = logGroups;
    }

    /**
+9 −4
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.internal.protolog;

import static com.android.internal.protolog.common.ProtoLogToolInjected.Value.LEGACY_OUTPUT_FILE_PATH;
import static com.android.internal.protolog.common.ProtoLogToolInjected.Value.LEGACY_VIEWER_CONFIG_PATH;
import static com.android.internal.protolog.common.ProtoLogToolInjected.Value.LOG_GROUPS;
import static com.android.internal.protolog.common.ProtoLogToolInjected.Value.VIEWER_CONFIG_PATH;

import android.annotation.Nullable;
@@ -28,6 +29,8 @@ import com.android.internal.protolog.common.IProtoLogGroup;
import com.android.internal.protolog.common.LogLevel;
import com.android.internal.protolog.common.ProtoLogToolInjected;

import java.util.TreeMap;

/**
 * A service for the ProtoLog logging system.
 */
@@ -43,6 +46,9 @@ public class ProtoLogImpl {
    @ProtoLogToolInjected(LEGACY_OUTPUT_FILE_PATH)
    private static String sLegacyOutputFilePath;

    @ProtoLogToolInjected(LOG_GROUPS)
    private static TreeMap<String, IProtoLogGroup> sLogGroups;

    /** Used by the ProtoLogTool, do not call directly - use {@code ProtoLog} class instead. */
    public static void d(IProtoLogGroup group, long messageHash, int paramsMask,
            @Nullable String messageString,
@@ -99,11 +105,10 @@ public class ProtoLogImpl {
    public static synchronized IProtoLog getSingleInstance() {
        if (sServiceInstance == null) {
            if (android.tracing.Flags.perfettoProtologTracing()) {
                sServiceInstance =
                        new PerfettoProtoLogImpl(sViewerConfigPath);
                sServiceInstance = new PerfettoProtoLogImpl(sViewerConfigPath, sLogGroups);
            } else {
                sServiceInstance =
                        new LegacyProtoLogImpl(sLegacyOutputFilePath, sLegacyViewerConfigPath);
                sServiceInstance = new LegacyProtoLogImpl(
                        sLegacyOutputFilePath, sLegacyViewerConfigPath, sLogGroups);
            }
        }
        return sServiceInstance;
+2 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MESSAGES;
import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.MESSAGE;
import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.MESSAGE_ID;

import android.util.ArrayMap;
import android.util.proto.ProtoInputStream;

import com.android.internal.protolog.common.ILogger;
@@ -57,6 +58,7 @@ public class ProtoLogViewerConfigReader {
    }

    private void doLoadViewerConfig() throws IOException {
        mLogMessageMap = new ArrayMap<>();
        final ProtoInputStream pis = mViewerConfigInputStreamProvider.getInputStream();

        while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) {
+3 −1
Original line number Diff line number Diff line
@@ -22,7 +22,9 @@ import java.lang.annotation.Target;

@Target({ElementType.FIELD, ElementType.PARAMETER})
public @interface ProtoLogToolInjected {
    enum Value { VIEWER_CONFIG_PATH, LEGACY_OUTPUT_FILE_PATH, LEGACY_VIEWER_CONFIG_PATH }
    enum Value {
        VIEWER_CONFIG_PATH, LEGACY_OUTPUT_FILE_PATH, LEGACY_VIEWER_CONFIG_PATH, LOG_GROUPS
    }

    Value value();
}
Loading