Loading core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java +1 −88 Original line number Original line Diff line number Diff line Loading @@ -34,7 +34,6 @@ import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.Gro import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MESSAGES; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MESSAGES; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.GROUP_ID; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.GROUP_ID; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LEVEL; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LEVEL; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LOCATION; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.INTERNED_DATA; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.INTERNED_DATA; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.PROTOLOG_MESSAGE; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.PROTOLOG_MESSAGE; Loading Loading @@ -72,7 +71,6 @@ import com.android.internal.protolog.common.LogLevel; import java.io.FileInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.io.PrintWriter; import java.io.StringWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.ArrayList; Loading Loading @@ -472,96 +470,11 @@ public class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProto Log.d(LOG_TAG, "Dumping viewer config to trace"); Log.d(LOG_TAG, "Dumping viewer config to trace"); mDataSource.trace(ctx -> { Utils.dumpViewerConfig(mDataSource, mViewerConfigInputStreamProvider); try { ProtoInputStream pis = mViewerConfigInputStreamProvider.getInputStream(); final ProtoOutputStream os = ctx.newTracePacket(); os.write(TIMESTAMP, SystemClock.elapsedRealtimeNanos()); final long outProtologViewerConfigToken = os.start(PROTOLOG_VIEWER_CONFIG); while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { if (pis.getFieldNumber() == (int) MESSAGES) { writeViewerConfigMessage(pis, os); } if (pis.getFieldNumber() == (int) GROUPS) { writeViewerConfigGroup(pis, os); } } os.end(outProtologViewerConfigToken); } catch (IOException e) { Log.e(LOG_TAG, "Failed to read ProtoLog viewer config to dump on tracing end", e); } }); Log.d(LOG_TAG, "Dumped viewer config to trace"); Log.d(LOG_TAG, "Dumped viewer config to trace"); } } 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()); } } pis.end(inGroupToken); os.end(outGroupToken); } 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; case (int) LOCATION: os.write(LOCATION, pis.readString(LOCATION)); break; default: throw new RuntimeException( "Unexpected field id " + pis.getFieldNumber()); } } pis.end(inMessageToken); os.end(outMessagesToken); } private void logToLogcat(String tag, LogLevel level, Message message, private void logToLogcat(String tag, LogLevel level, Message message, @Nullable Object[] args) { @Nullable Object[] args) { String messageString; String messageString; Loading core/java/com/android/internal/protolog/ProtoLogConfigurationService.java +2 −24 Original line number Original line Diff line number Diff line Loading @@ -26,8 +26,6 @@ import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.Mes import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LOCATION; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LOCATION; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE_ID; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE_ID; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.PROTOLOG_VIEWER_CONFIG; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.TIMESTAMP; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; Loading @@ -36,7 +34,6 @@ import android.content.Context; import android.os.RemoteException; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.ShellCallback; import android.os.SystemClock; import android.tracing.perfetto.DataSourceParams; import android.tracing.perfetto.DataSourceParams; import android.tracing.perfetto.InitArguments; import android.tracing.perfetto.InitArguments; import android.tracing.perfetto.Producer; import android.tracing.perfetto.Producer; Loading Loading @@ -374,32 +371,13 @@ public final class ProtoLogConfigurationService extends IProtoLogConfigurationSe private static void dumpTransitionTraceConfig(@NonNull ProtoLogDataSource dataSource, private static void dumpTransitionTraceConfig(@NonNull ProtoLogDataSource dataSource, @NonNull String viewerConfigFilePath) { @NonNull String viewerConfigFilePath) { dataSource.trace(ctx -> { Utils.dumpViewerConfig(dataSource, () -> { final ProtoInputStream pis; try { try { pis = new ProtoInputStream(new FileInputStream(viewerConfigFilePath)); return new ProtoInputStream(new FileInputStream(viewerConfigFilePath)); } catch (FileNotFoundException e) { } catch (FileNotFoundException e) { throw new RuntimeException( throw new RuntimeException( "Failed to load viewer config file " + viewerConfigFilePath, e); "Failed to load viewer config file " + viewerConfigFilePath, e); } } try { final ProtoOutputStream os = ctx.newTracePacket(); os.write(TIMESTAMP, SystemClock.elapsedRealtimeNanos()); final long outProtologViewerConfigToken = os.start(PROTOLOG_VIEWER_CONFIG); while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { switch (pis.getFieldNumber()) { case (int) MESSAGES -> writeViewerConfigMessage(pis, os); case (int) GROUPS -> writeViewerConfigGroup(pis, os); } } os.end(outProtologViewerConfigToken); } catch (IOException e) { Log.e(LOG_TAG, "Failed to read ProtoLog viewer config to dump on tracing end", e); } }); }); } } Loading core/java/com/android/internal/protolog/Utils.java 0 → 100644 +133 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.protolog; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.GROUPS; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.Group.ID; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.Group.NAME; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.Group.TAG; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MESSAGES; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.GROUP_ID; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LEVEL; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LOCATION; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.PROTOLOG_VIEWER_CONFIG; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.TIMESTAMP; import android.annotation.NonNull; import android.internal.perfetto.protos.Protolog; import android.os.SystemClock; import android.util.Log; import android.util.proto.ProtoInputStream; import android.util.proto.ProtoOutputStream; import java.io.IOException; public class Utils { private static final String LOG_TAG = "ProtoLogUtils"; public static void dumpViewerConfig(@NonNull ProtoLogDataSource dataSource, @NonNull ViewerConfigInputStreamProvider viewerConfigInputStreamProvider) { dataSource.trace(ctx -> { try { ProtoInputStream pis = viewerConfigInputStreamProvider.getInputStream(); final ProtoOutputStream os = ctx.newTracePacket(); os.write(TIMESTAMP, SystemClock.elapsedRealtimeNanos()); final long outProtologViewerConfigToken = os.start(PROTOLOG_VIEWER_CONFIG); while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { if (pis.getFieldNumber() == (int) MESSAGES) { writeViewerConfigMessage(pis, os); } if (pis.getFieldNumber() == (int) GROUPS) { writeViewerConfigGroup(pis, os); } } os.end(outProtologViewerConfigToken); } catch (IOException e) { Log.e(LOG_TAG, "Failed to read ProtoLog viewer config to dump to datasource", e); } }); } private static void writeViewerConfigGroup( @NonNull ProtoInputStream pis, @NonNull 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()); } } pis.end(inGroupToken); os.end(outGroupToken); } 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) Protolog.ProtoLogViewerConfig.MessageData.MESSAGE_ID: os.write(Protolog.ProtoLogViewerConfig.MessageData.MESSAGE_ID, pis.readLong(Protolog.ProtoLogViewerConfig.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; case (int) LOCATION: os.write(LOCATION, pis.readString(LOCATION)); break; default: throw new RuntimeException( "Unexpected field id " + pis.getFieldNumber()); } } pis.end(inMessageToken); os.end(outMessagesToken); } } Loading
core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java +1 −88 Original line number Original line Diff line number Diff line Loading @@ -34,7 +34,6 @@ import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.Gro import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MESSAGES; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MESSAGES; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.GROUP_ID; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.GROUP_ID; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LEVEL; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LEVEL; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LOCATION; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.INTERNED_DATA; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.INTERNED_DATA; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.PROTOLOG_MESSAGE; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.PROTOLOG_MESSAGE; Loading Loading @@ -72,7 +71,6 @@ import com.android.internal.protolog.common.LogLevel; import java.io.FileInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.io.PrintWriter; import java.io.StringWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.ArrayList; Loading Loading @@ -472,96 +470,11 @@ public class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProto Log.d(LOG_TAG, "Dumping viewer config to trace"); Log.d(LOG_TAG, "Dumping viewer config to trace"); mDataSource.trace(ctx -> { Utils.dumpViewerConfig(mDataSource, mViewerConfigInputStreamProvider); try { ProtoInputStream pis = mViewerConfigInputStreamProvider.getInputStream(); final ProtoOutputStream os = ctx.newTracePacket(); os.write(TIMESTAMP, SystemClock.elapsedRealtimeNanos()); final long outProtologViewerConfigToken = os.start(PROTOLOG_VIEWER_CONFIG); while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { if (pis.getFieldNumber() == (int) MESSAGES) { writeViewerConfigMessage(pis, os); } if (pis.getFieldNumber() == (int) GROUPS) { writeViewerConfigGroup(pis, os); } } os.end(outProtologViewerConfigToken); } catch (IOException e) { Log.e(LOG_TAG, "Failed to read ProtoLog viewer config to dump on tracing end", e); } }); Log.d(LOG_TAG, "Dumped viewer config to trace"); Log.d(LOG_TAG, "Dumped viewer config to trace"); } } 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()); } } pis.end(inGroupToken); os.end(outGroupToken); } 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; case (int) LOCATION: os.write(LOCATION, pis.readString(LOCATION)); break; default: throw new RuntimeException( "Unexpected field id " + pis.getFieldNumber()); } } pis.end(inMessageToken); os.end(outMessagesToken); } private void logToLogcat(String tag, LogLevel level, Message message, private void logToLogcat(String tag, LogLevel level, Message message, @Nullable Object[] args) { @Nullable Object[] args) { String messageString; String messageString; Loading
core/java/com/android/internal/protolog/ProtoLogConfigurationService.java +2 −24 Original line number Original line Diff line number Diff line Loading @@ -26,8 +26,6 @@ import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.Mes import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LOCATION; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LOCATION; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE_ID; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE_ID; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.PROTOLOG_VIEWER_CONFIG; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.TIMESTAMP; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; Loading @@ -36,7 +34,6 @@ import android.content.Context; import android.os.RemoteException; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.ShellCallback; import android.os.SystemClock; import android.tracing.perfetto.DataSourceParams; import android.tracing.perfetto.DataSourceParams; import android.tracing.perfetto.InitArguments; import android.tracing.perfetto.InitArguments; import android.tracing.perfetto.Producer; import android.tracing.perfetto.Producer; Loading Loading @@ -374,32 +371,13 @@ public final class ProtoLogConfigurationService extends IProtoLogConfigurationSe private static void dumpTransitionTraceConfig(@NonNull ProtoLogDataSource dataSource, private static void dumpTransitionTraceConfig(@NonNull ProtoLogDataSource dataSource, @NonNull String viewerConfigFilePath) { @NonNull String viewerConfigFilePath) { dataSource.trace(ctx -> { Utils.dumpViewerConfig(dataSource, () -> { final ProtoInputStream pis; try { try { pis = new ProtoInputStream(new FileInputStream(viewerConfigFilePath)); return new ProtoInputStream(new FileInputStream(viewerConfigFilePath)); } catch (FileNotFoundException e) { } catch (FileNotFoundException e) { throw new RuntimeException( throw new RuntimeException( "Failed to load viewer config file " + viewerConfigFilePath, e); "Failed to load viewer config file " + viewerConfigFilePath, e); } } try { final ProtoOutputStream os = ctx.newTracePacket(); os.write(TIMESTAMP, SystemClock.elapsedRealtimeNanos()); final long outProtologViewerConfigToken = os.start(PROTOLOG_VIEWER_CONFIG); while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { switch (pis.getFieldNumber()) { case (int) MESSAGES -> writeViewerConfigMessage(pis, os); case (int) GROUPS -> writeViewerConfigGroup(pis, os); } } os.end(outProtologViewerConfigToken); } catch (IOException e) { Log.e(LOG_TAG, "Failed to read ProtoLog viewer config to dump on tracing end", e); } }); }); } } Loading
core/java/com/android/internal/protolog/Utils.java 0 → 100644 +133 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.protolog; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.GROUPS; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.Group.ID; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.Group.NAME; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.Group.TAG; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MESSAGES; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.GROUP_ID; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LEVEL; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.LOCATION; import static android.internal.perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.MESSAGE; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.PROTOLOG_VIEWER_CONFIG; import static android.internal.perfetto.protos.TracePacketOuterClass.TracePacket.TIMESTAMP; import android.annotation.NonNull; import android.internal.perfetto.protos.Protolog; import android.os.SystemClock; import android.util.Log; import android.util.proto.ProtoInputStream; import android.util.proto.ProtoOutputStream; import java.io.IOException; public class Utils { private static final String LOG_TAG = "ProtoLogUtils"; public static void dumpViewerConfig(@NonNull ProtoLogDataSource dataSource, @NonNull ViewerConfigInputStreamProvider viewerConfigInputStreamProvider) { dataSource.trace(ctx -> { try { ProtoInputStream pis = viewerConfigInputStreamProvider.getInputStream(); final ProtoOutputStream os = ctx.newTracePacket(); os.write(TIMESTAMP, SystemClock.elapsedRealtimeNanos()); final long outProtologViewerConfigToken = os.start(PROTOLOG_VIEWER_CONFIG); while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { if (pis.getFieldNumber() == (int) MESSAGES) { writeViewerConfigMessage(pis, os); } if (pis.getFieldNumber() == (int) GROUPS) { writeViewerConfigGroup(pis, os); } } os.end(outProtologViewerConfigToken); } catch (IOException e) { Log.e(LOG_TAG, "Failed to read ProtoLog viewer config to dump to datasource", e); } }); } private static void writeViewerConfigGroup( @NonNull ProtoInputStream pis, @NonNull 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()); } } pis.end(inGroupToken); os.end(outGroupToken); } 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) Protolog.ProtoLogViewerConfig.MessageData.MESSAGE_ID: os.write(Protolog.ProtoLogViewerConfig.MessageData.MESSAGE_ID, pis.readLong(Protolog.ProtoLogViewerConfig.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; case (int) LOCATION: os.write(LOCATION, pis.readString(LOCATION)); break; default: throw new RuntimeException( "Unexpected field id " + pis.getFieldNumber()); } } pis.end(inMessageToken); os.end(outMessagesToken); } }