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

Commit 869ebffa authored by Pablo Gamito's avatar Pablo Gamito
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
parent 32b1b355
Loading
Loading
Loading
Loading
+7 −6
Original line number Original line Diff line number Diff line
@@ -55,37 +55,38 @@ import java.util.stream.Collectors;
 * A service for the ProtoLog logging system.
 * A service for the ProtoLog logging system.
 */
 */
public class LegacyProtoLogImpl implements IProtoLog {
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 BUFFER_CAPACITY = 1024 * 1024;
    private static final int PER_CHUNK_SIZE = 1024;
    private static final int PER_CHUNK_SIZE = 1024;
    private static final String TAG = "ProtoLog";
    private static final String TAG = "ProtoLog";
    private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L;
    private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L;
    static final String PROTOLOG_VERSION = "2.0.0";
    static final String PROTOLOG_VERSION = "2.0.0";
    private static final int DEFAULT_PER_CHUNK_SIZE = 0;


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


    private boolean mProtoLogEnabled;
    private boolean mProtoLogEnabled;
    private boolean mProtoLogEnabledLockFree;
    private boolean mProtoLogEnabledLockFree;
    private final Object mProtoLogEnabledLock = new Object();
    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,
        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,
    public LegacyProtoLogImpl(File file, String viewerConfigFilename, int bufferCapacity,
            LegacyProtoLogViewerConfigReader viewerConfig, int perChunkSize) {
            LegacyProtoLogViewerConfigReader viewerConfig, int perChunkSize,
            TreeMap<String, IProtoLogGroup> logGroups) {
        mLogFile = file;
        mLogFile = file;
        mBuffer = new TraceBuffer(bufferCapacity);
        mBuffer = new TraceBuffer(bufferCapacity);
        mLegacyViewerConfigFilename = viewerConfigFilename;
        mLegacyViewerConfigFilename = viewerConfigFilename;
        mViewerConfig = viewerConfig;
        mViewerConfig = viewerConfig;
        mPerChunkSize = perChunkSize;
        mPerChunkSize = perChunkSize;
        this.mLogGroups = logGroups;
    }
    }


    /**
    /**
+13 −7
Original line number Original line 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.InternedString.STR;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.BOOLEAN_PARAMS;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.BOOLEAN_PARAMS;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.DOUBLE_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.MESSAGE_ID;
import static perfetto.protos.PerfettoTrace.ProtoLogMessage.SINT64_PARAMS;
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.ProtoLogMessage.STR_PARAM_IIDS;
import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.GROUPS;
import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.GROUPS;
import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.Group.ID;
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.
 * A service for the ProtoLog logging system.
 */
 */
public class PerfettoProtoLogImpl implements IProtoLog {
public class PerfettoProtoLogImpl implements IProtoLog {
    private final TreeMap<String, IProtoLogGroup> mLogGroups = new TreeMap<>();
    private static final String LOG_TAG = "ProtoLog";
    private static final String LOG_TAG = "ProtoLog";
    private final AtomicInteger mTracingInstances = new AtomicInteger();
    private final AtomicInteger mTracingInstances = new AtomicInteger();


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


    public PerfettoProtoLogImpl(String viewerConfigFilePath) {
    public PerfettoProtoLogImpl(String viewerConfigFilePath,
            TreeMap<String, IProtoLogGroup> logGroups) {
        this(() -> {
        this(() -> {
            try {
            try {
                return new ProtoInputStream(new FileInputStream(viewerConfigFilePath));
                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);
                Slog.w(LOG_TAG, "Failed to load viewer config file " + viewerConfigFilePath, e);
                return null;
                return null;
            }
            }
        });
        }, logGroups);
    }
    }


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


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


    /**
    /**
+9 −4
Original line number Original line 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_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.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 static com.android.internal.protolog.common.ProtoLogToolInjected.Value.VIEWER_CONFIG_PATH;


import android.annotation.Nullable;
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.LogLevel;
import com.android.internal.protolog.common.ProtoLogToolInjected;
import com.android.internal.protolog.common.ProtoLogToolInjected;


import java.util.TreeMap;

/**
/**
 * A service for the ProtoLog logging system.
 * A service for the ProtoLog logging system.
 */
 */
@@ -43,6 +46,9 @@ public class ProtoLogImpl {
    @ProtoLogToolInjected(LEGACY_OUTPUT_FILE_PATH)
    @ProtoLogToolInjected(LEGACY_OUTPUT_FILE_PATH)
    private static String sLegacyOutputFilePath;
    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. */
    /** Used by the ProtoLogTool, do not call directly - use {@code ProtoLog} class instead. */
    public static void d(IProtoLogGroup group, long messageHash, int paramsMask,
    public static void d(IProtoLogGroup group, long messageHash, int paramsMask,
            @Nullable String messageString,
            @Nullable String messageString,
@@ -99,11 +105,10 @@ public class ProtoLogImpl {
    public static synchronized IProtoLog getSingleInstance() {
    public static synchronized IProtoLog getSingleInstance() {
        if (sServiceInstance == null) {
        if (sServiceInstance == null) {
            if (android.tracing.Flags.perfettoProtologTracing()) {
            if (android.tracing.Flags.perfettoProtologTracing()) {
                sServiceInstance =
                sServiceInstance = new PerfettoProtoLogImpl(sViewerConfigPath, sLogGroups);
                        new PerfettoProtoLogImpl(sViewerConfigPath);
            } else {
            } else {
                sServiceInstance =
                sServiceInstance = new LegacyProtoLogImpl(
                        new LegacyProtoLogImpl(sLegacyOutputFilePath, sLegacyViewerConfigPath);
                        sLegacyOutputFilePath, sLegacyViewerConfigPath, sLogGroups);
            }
            }
        }
        }
        return sServiceInstance;
        return sServiceInstance;
+2 −0
Original line number Original line 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;
import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.MESSAGE_ID;
import static perfetto.protos.PerfettoTrace.ProtoLogViewerConfig.MessageData.MESSAGE_ID;


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


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


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


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


@Target({ElementType.FIELD, ElementType.PARAMETER})
@Target({ElementType.FIELD, ElementType.PARAMETER})
public @interface ProtoLogToolInjected {
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();
    Value value();
}
}
Loading