diff options
| -rw-r--r-- | core/java/android/tracing/perfetto/TraceFunction.java | 5 | ||||
| -rw-r--r-- | core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java | 132 |
2 files changed, 75 insertions, 62 deletions
diff --git a/core/java/android/tracing/perfetto/TraceFunction.java b/core/java/android/tracing/perfetto/TraceFunction.java index ad84077340ac..13e663d607e9 100644 --- a/core/java/android/tracing/perfetto/TraceFunction.java +++ b/core/java/android/tracing/perfetto/TraceFunction.java @@ -16,8 +16,6 @@ package android.tracing.perfetto; -import java.io.IOException; - /** * The interface for the trace function called from native on a trace call with a context. * @@ -36,6 +34,5 @@ public interface TraceFunction<TlsStateType, IncrementalStateType> { * * @param ctx the tracing context to trace for in the trace function. */ - void trace(TracingContext<TlsStateType, IncrementalStateType> ctx) - throws IOException; + void trace(TracingContext<TlsStateType, IncrementalStateType> ctx); } diff --git a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java index e641155c2316..fca4e91a8ac3 100644 --- a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java @@ -53,6 +53,7 @@ import android.tracing.perfetto.InitArguments; import android.tracing.perfetto.Producer; import android.tracing.perfetto.TracingContext; import android.util.ArrayMap; +import android.util.Log; import android.util.LongArray; import android.util.Slog; import android.util.proto.ProtoInputStream; @@ -67,6 +68,7 @@ import com.android.internal.protolog.common.LogLevel; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; @@ -166,76 +168,90 @@ public class PerfettoProtoLogImpl implements IProtoLog { } mDataSource.trace(ctx -> { - final ProtoOutputStream os = ctx.newTracePacket(); - - os.write(TIMESTAMP, SystemClock.elapsedRealtimeNanos()); + try { + final ProtoOutputStream os = ctx.newTracePacket(); - final long outProtologViewerConfigToken = os.start(PROTOLOG_VIEWER_CONFIG); - while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { - if (pis.getFieldNumber() == (int) MESSAGES) { - final long inMessageToken = pis.start(MESSAGES); - final long outMessagesToken = os.start(MESSAGES); + os.write(TIMESTAMP, SystemClock.elapsedRealtimeNanos()); - while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { - switch (pis.getFieldNumber()) { - case (int) MessageData.MESSAGE_ID: - os.write(MessageData.MESSAGE_ID, - pis.readLong(MessageData.MESSAGE_ID)); - break; - case (int) MESSAGE: - os.write(MESSAGE, pis.readString(MESSAGE)); - break; - case (int) LEVEL: - os.write(LEVEL, pis.readInt(LEVEL)); - break; - case (int) GROUP_ID: - os.write(GROUP_ID, pis.readInt(GROUP_ID)); - break; - default: - throw new RuntimeException( - "Unexpected field id " + pis.getFieldNumber()); - } + final long outProtologViewerConfigToken = os.start(PROTOLOG_VIEWER_CONFIG); + while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { + if (pis.getFieldNumber() == (int) MESSAGES) { + writeViewerConfigMessage(pis, os); } - pis.end(inMessageToken); - os.end(outMessagesToken); + if (pis.getFieldNumber() == (int) GROUPS) { + writeViewerConfigGroup(pis, os); + } } - if (pis.getFieldNumber() == (int) GROUPS) { - final long inGroupToken = pis.start(GROUPS); - final long outGroupToken = os.start(GROUPS); + os.end(outProtologViewerConfigToken); - while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { - switch (pis.getFieldNumber()) { - case (int) ID: - int id = pis.readInt(ID); - os.write(ID, id); - break; - case (int) NAME: - String name = pis.readString(NAME); - os.write(NAME, name); - break; - case (int) TAG: - String tag = pis.readString(TAG); - os.write(TAG, tag); - break; - default: - throw new RuntimeException( - "Unexpected field id " + pis.getFieldNumber()); - } - } + ctx.flush(); + } catch (IOException e) { + Log.e(LOG_TAG, "Failed to read ProtoLog viewer config to dump on tracing end", e); + } + }); - pis.end(inGroupToken); - os.end(outGroupToken); - } + mDataSource.flush(); + } + + private static void writeViewerConfigGroup( + ProtoInputStream pis, ProtoOutputStream os) throws IOException { + final long inGroupToken = pis.start(GROUPS); + final long outGroupToken = os.start(GROUPS); + + while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { + switch (pis.getFieldNumber()) { + case (int) ID: + int id = pis.readInt(ID); + os.write(ID, id); + break; + case (int) NAME: + String name = pis.readString(NAME); + os.write(NAME, name); + break; + case (int) TAG: + String tag = pis.readString(TAG); + os.write(TAG, tag); + break; + default: + throw new RuntimeException( + "Unexpected field id " + pis.getFieldNumber()); } + } - os.end(outProtologViewerConfigToken); + pis.end(inGroupToken); + os.end(outGroupToken); + } - ctx.flush(); - }); + private static void writeViewerConfigMessage( + ProtoInputStream pis, ProtoOutputStream os) throws IOException { + final long inMessageToken = pis.start(MESSAGES); + final long outMessagesToken = os.start(MESSAGES); + + while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { + switch (pis.getFieldNumber()) { + case (int) MessageData.MESSAGE_ID: + os.write(MessageData.MESSAGE_ID, + pis.readLong(MessageData.MESSAGE_ID)); + break; + case (int) MESSAGE: + os.write(MESSAGE, pis.readString(MESSAGE)); + break; + case (int) LEVEL: + os.write(LEVEL, pis.readInt(LEVEL)); + break; + case (int) GROUP_ID: + os.write(GROUP_ID, pis.readInt(GROUP_ID)); + break; + default: + throw new RuntimeException( + "Unexpected field id " + pis.getFieldNumber()); + } + } - mDataSource.flush(); + pis.end(inMessageToken); + os.end(outMessagesToken); } private void logToLogcat(String tag, LogLevel level, long messageHash, |