summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java49
1 files changed, 39 insertions, 10 deletions
diff --git a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
index daf594b755d3..b134b2d6b991 100644
--- a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
@@ -106,6 +106,7 @@ public class PerfettoProtoLogImpl implements IProtoLog {
private final int[] mDefaultLogLevelCounts = new int[LogLevel.values().length];
private final Map<IProtoLogGroup, int[]> mLogLevelCounts = new ArrayMap<>();
+ private final Map<IProtoLogGroup, Integer> mCollectStackTraceGroupCounts = new ArrayMap<>();
private final Lock mBackgroundServiceLock = new ReentrantLock();
private ExecutorService mBackgroundLoggingService = Executors.newSingleThreadExecutor();
@@ -162,8 +163,15 @@ public class PerfettoProtoLogImpl implements IProtoLog {
@Nullable Object[] args) {
if (isProtoEnabled()) {
long tsNanos = SystemClock.elapsedRealtimeNanos();
+ final String stacktrace;
+ if (mCollectStackTraceGroupCounts.getOrDefault(group, 0) > 0) {
+ stacktrace = collectStackTrace();
+ } else {
+ stacktrace = null;
+ }
mBackgroundLoggingService.execute(() ->
- logToProto(level, group, messageHash, paramsMask, args, tsNanos));
+ logToProto(level, group, messageHash, paramsMask, args, tsNanos,
+ stacktrace));
}
if (group.isLogToLogcat()) {
logToLogcat(group.getTag(), level, messageHash, args);
@@ -174,9 +182,15 @@ public class PerfettoProtoLogImpl implements IProtoLog {
public void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object... args) {
if (isProtoEnabled()) {
long tsNanos = SystemClock.elapsedRealtimeNanos();
+ final String stacktrace;
+ if (mCollectStackTraceGroupCounts.getOrDefault(group, 0) > 0) {
+ stacktrace = collectStackTrace();
+ } else {
+ stacktrace = null;
+ }
mBackgroundLoggingService.execute(
() -> logStringMessageToProto(logLevel, group, messageString, args,
- tsNanos));
+ tsNanos, stacktrace));
}
if (group.isLogToLogcat()) {
logToLogcat(group.getTag(), logLevel, messageString, args);
@@ -372,30 +386,32 @@ public class PerfettoProtoLogImpl implements IProtoLog {
}
private void logToProto(LogLevel level, IProtoLogGroup logGroup, long messageHash,
- int paramsMask, Object[] args, long tsNanos) {
+ int paramsMask, Object[] args, long tsNanos, @Nullable String stacktrace) {
Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "logToProto");
try {
- doLogToProto(level, logGroup, new Message(messageHash), paramsMask, args, tsNanos);
+ doLogToProto(level, logGroup, new Message(messageHash), paramsMask, args, tsNanos,
+ stacktrace);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}
}
private void logStringMessageToProto(LogLevel logLevel, IProtoLogGroup group,
- String messageString, Object[] args, long tsNanos) {
+ String messageString, Object[] args, long tsNanos, @Nullable String stacktrace) {
Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "logStringMessageToProto");
try {
- doLogToProto(logLevel, group, messageString, args, tsNanos);
+ doLogToProto(logLevel, group, messageString, args, tsNanos, stacktrace);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
}
}
private void doLogToProto(LogLevel level, IProtoLogGroup logGroup, String messageString,
- Object[] args, long tsNanos) {
+ Object[] args, long tsNanos, @Nullable String stacktrace) {
final List<Integer> argTypes = LogDataType.parseFormatString(messageString);
final int typeMask = LogDataType.logDataTypesToBitMask(argTypes);
- doLogToProto(level, logGroup, new Message(messageString), typeMask, args, tsNanos);
+ doLogToProto(level, logGroup, new Message(messageString), typeMask, args, tsNanos,
+ stacktrace);
}
private static class Message {
@@ -414,7 +430,7 @@ public class PerfettoProtoLogImpl implements IProtoLog {
}
private void doLogToProto(LogLevel level, IProtoLogGroup logGroup, Message message,
- int paramsMask, Object[] args, long tsNanos) {
+ int paramsMask, Object[] args, long tsNanos, @Nullable String stacktrace) {
mDataSource.trace(ctx -> {
final ProtoLogDataSource.TlsState tlsState = ctx.getCustomTlsState();
final LogLevel logFrom = tlsState.getLogFromLevel(logGroup.name());
@@ -442,7 +458,6 @@ public class PerfettoProtoLogImpl implements IProtoLog {
// Intern stackstraces before creating the trace packet for the proto message so
// that the interned stacktrace strings appear before in the trace to make the
// trace processing easier.
- String stacktrace = collectStackTrace();
internedStacktrace = internStacktraceString(ctx, stacktrace);
}
@@ -778,6 +793,11 @@ public class PerfettoProtoLogImpl implements IProtoLog {
for (int i = defaultLogFrom.ordinal(); i < LogLevel.values().length; i++) {
logLevelsCountsForGroup[logFromLevel.ordinal()]++;
}
+
+ if (config.getConfigFor(overriddenGroupTag).collectStackTrace) {
+ mCollectStackTraceGroupCounts.put(group,
+ mCollectStackTraceGroupCounts.getOrDefault(group, 0) + 1);
+ }
}
mCacheUpdater.run();
@@ -805,6 +825,15 @@ public class PerfettoProtoLogImpl implements IProtoLog {
if (Arrays.stream(logLevelsCountsForGroup).allMatch(it -> it == 0)) {
mLogLevelCounts.remove(group);
}
+
+ if (config.getConfigFor(overriddenGroupTag).collectStackTrace) {
+ mCollectStackTraceGroupCounts.put(group,
+ mCollectStackTraceGroupCounts.get(group) - 1);
+
+ if (mCollectStackTraceGroupCounts.get(group) == 0) {
+ mCollectStackTraceGroupCounts.remove(group);
+ }
+ }
}
mCacheUpdater.run();