summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2022-11-22 14:51:07 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-11-22 14:51:07 +0000
commitf726d7a90eca7f0681024a722b25846f2ce750c6 (patch)
treecb82db32d5d30bdc00e16c0ca4c155827b750e04
parentb7134cd71d848de8a2c88e2ee40b9cd93422972c (diff)
parent28bc7eed7ae51060e70de240fcb57f3d94c4012d (diff)
Merge "Reduce overhead of writing logcat from protolog method"
-rw-r--r--core/java/com/android/internal/protolog/BaseProtoLogImpl.java14
-rw-r--r--core/java/com/android/internal/protolog/common/LogDataType.java3
-rw-r--r--core/java/com/android/internal/protolog/common/ProtoLog.java7
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ProtoLogIntegrationTest.java10
-rw-r--r--tests/Internal/src/com/android/internal/protolog/ProtoLogImplTest.java8
-rw-r--r--tests/Internal/src/com/android/internal/protolog/common/LogDataTypeTest.java5
-rw-r--r--tools/protologtool/tests/com/android/protolog/tool/LogParserTest.kt16
7 files changed, 31 insertions, 32 deletions
diff --git a/core/java/com/android/internal/protolog/BaseProtoLogImpl.java b/core/java/com/android/internal/protolog/BaseProtoLogImpl.java
index 83309fc61009..cd55d3292217 100644
--- a/core/java/com/android/internal/protolog/BaseProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/BaseProtoLogImpl.java
@@ -32,6 +32,7 @@ import static com.android.internal.protolog.ProtoLogMessage.STR_PARAMS;
import android.annotation.Nullable;
import android.os.ShellCommand;
import android.os.SystemClock;
+import android.text.TextUtils;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
@@ -44,7 +45,6 @@ import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.IllegalFormatConversionException;
import java.util.TreeMap;
import java.util.stream.Collectors;
@@ -108,10 +108,14 @@ public class BaseProtoLogImpl {
messageString = mViewerConfig.getViewerString(messageHash);
}
if (messageString != null) {
- try {
- message = String.format(messageString, args);
- } catch (IllegalFormatConversionException ex) {
- Slog.w(TAG, "Invalid ProtoLog format string.", ex);
+ if (args != null) {
+ try {
+ message = TextUtils.formatSimple(messageString, args);
+ } catch (Exception ex) {
+ Slog.w(TAG, "Invalid ProtoLog format string.", ex);
+ }
+ } else {
+ message = messageString;
}
}
if (message == null) {
diff --git a/core/java/com/android/internal/protolog/common/LogDataType.java b/core/java/com/android/internal/protolog/common/LogDataType.java
index 651932a7ba7e..c05824a58a77 100644
--- a/core/java/com/android/internal/protolog/common/LogDataType.java
+++ b/core/java/com/android/internal/protolog/common/LogDataType.java
@@ -74,13 +74,10 @@ public class LogDataType {
types.add(LogDataType.BOOLEAN);
break;
case 'd':
- case 'o':
case 'x':
types.add(LogDataType.LONG);
break;
case 'f':
- case 'e':
- case 'g':
types.add(LogDataType.DOUBLE);
break;
case 's':
diff --git a/core/java/com/android/internal/protolog/common/ProtoLog.java b/core/java/com/android/internal/protolog/common/ProtoLog.java
index 01cc1ed37ad4..93765cdf0890 100644
--- a/core/java/com/android/internal/protolog/common/ProtoLog.java
+++ b/core/java/com/android/internal/protolog/common/ProtoLog.java
@@ -22,11 +22,12 @@ package com.android.internal.protolog.common;
* a messageString, which is a format string for the log message (has to be a string literal or
* a concatenation of string literals) and a vararg array of parameters for the formatter.
*
- * The syntax for the message string is a subset of {@code java.util.Formatter} syntax.
+ * The syntax for the message string depends on
+ * {@link android.text.TextUtils#formatSimple(String, Object...)}}.
* Supported conversions:
* %b - boolean
- * %d, %o and %x - integral type (Short, Integer or Long)
- * %f, %e and %g - floating point type (Float or Double)
+ * %d %x - integral type (Short, Integer or Long)
+ * %f - floating point type (Float or Double)
* %s - string
* %% - a literal percent character
* The width and precision modifiers are supported, argument_index and flags are not.
diff --git a/services/tests/wmtests/src/com/android/server/wm/ProtoLogIntegrationTest.java b/services/tests/wmtests/src/com/android/server/wm/ProtoLogIntegrationTest.java
index 578a43cba33d..af0d32c764a4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ProtoLogIntegrationTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ProtoLogIntegrationTest.java
@@ -50,17 +50,17 @@ public class ProtoLogIntegrationTest {
ProtoLogImpl mockedProtoLog = mock(ProtoLogImpl.class);
runWith(mockedProtoLog, this::testProtoLog);
verify(mockedProtoLog).log(eq(ProtoLogImpl.LogLevel.ERROR), eq(ProtoLogGroup.TEST_GROUP),
- anyInt(), eq(0b0010101001010111),
+ anyInt(), eq(0b0010010111),
eq(com.android.internal.protolog.ProtoLogGroup.TEST_GROUP.isLogToLogcat()
- ? "Test completed successfully: %b %d %o %x %e %g %f %% %s"
+ ? "Test completed successfully: %b %d %x %f %% %s"
: null),
- eq(new Object[]{true, 1L, 2L, 3L, 0.4, 0.5, 0.6, "ok"}));
+ eq(new Object[]{true, 1L, 2L, 0.3, "ok"}));
}
private void testProtoLog() {
ProtoLog.e(ProtoLogGroup.TEST_GROUP,
- "Test completed successfully: %b %d %o %x %e %g %f %% %s.",
- true, 1, 2, 3, 0.4, 0.5, 0.6, "ok");
+ "Test completed successfully: %b %d %x %f %% %s",
+ true, 1, 2, 0.3, "ok");
}
/**
diff --git a/tests/Internal/src/com/android/internal/protolog/ProtoLogImplTest.java b/tests/Internal/src/com/android/internal/protolog/ProtoLogImplTest.java
index 3db011683a86..2cdb94526839 100644
--- a/tests/Internal/src/com/android/internal/protolog/ProtoLogImplTest.java
+++ b/tests/Internal/src/com/android/internal/protolog/ProtoLogImplTest.java
@@ -201,24 +201,24 @@ public class ProtoLogImplTest {
@Test
public void log_logcatEnabledExternalMessage() {
- when(mReader.getViewerString(anyInt())).thenReturn("test %b %d %% %o %x %e %g %s %f");
+ when(mReader.getViewerString(anyInt())).thenReturn("test %b %d %% 0x%x %s %f");
ProtoLogImpl implSpy = Mockito.spy(mProtoLog);
TestProtoLogGroup.TEST_GROUP.setLogToLogcat(true);
TestProtoLogGroup.TEST_GROUP.setLogToProto(false);
implSpy.log(
ProtoLogImpl.LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, null,
- new Object[]{true, 10000, 20000, 30000, 0.0001, 0.00002, "test", 0.000003});
+ new Object[]{true, 10000, 30000, "test", 0.000003});
verify(implSpy).passToLogcat(eq(TestProtoLogGroup.TEST_GROUP.getTag()), eq(
ProtoLogImpl.LogLevel.INFO),
- eq("test true 10000 % 47040 7530 1.000000e-04 2.00000e-05 test 0.000003"));
+ eq("test true 10000 % 0x7530 test 3.0E-6"));
verify(mReader).getViewerString(eq(1234));
}
@Test
public void log_logcatEnabledInvalidMessage() {
- when(mReader.getViewerString(anyInt())).thenReturn("test %b %d %% %o %x %e %g %s %f");
+ when(mReader.getViewerString(anyInt())).thenReturn("test %b %d %% %x %s %f");
ProtoLogImpl implSpy = Mockito.spy(mProtoLog);
TestProtoLogGroup.TEST_GROUP.setLogToLogcat(true);
TestProtoLogGroup.TEST_GROUP.setLogToProto(false);
diff --git a/tests/Internal/src/com/android/internal/protolog/common/LogDataTypeTest.java b/tests/Internal/src/com/android/internal/protolog/common/LogDataTypeTest.java
index e20ca3df57c7..9c2f74eabe02 100644
--- a/tests/Internal/src/com/android/internal/protolog/common/LogDataTypeTest.java
+++ b/tests/Internal/src/com/android/internal/protolog/common/LogDataTypeTest.java
@@ -36,15 +36,12 @@ import java.util.List;
public class LogDataTypeTest {
@Test
public void parseFormatString() {
- String str = "%b %d %o %x %f %e %g %s %%";
+ String str = "%b %d %x %f %s %%";
List<Integer> out = LogDataType.parseFormatString(str);
assertEquals(Arrays.asList(
LogDataType.BOOLEAN,
LogDataType.LONG,
LogDataType.LONG,
- LogDataType.LONG,
- LogDataType.DOUBLE,
- LogDataType.DOUBLE,
LogDataType.DOUBLE,
LogDataType.STRING
), out);
diff --git a/tools/protologtool/tests/com/android/protolog/tool/LogParserTest.kt b/tools/protologtool/tests/com/android/protolog/tool/LogParserTest.kt
index 67a31da87081..512d90c725fe 100644
--- a/tools/protologtool/tests/com/android/protolog/tool/LogParserTest.kt
+++ b/tools/protologtool/tests/com/android/protolog/tool/LogParserTest.kt
@@ -84,8 +84,8 @@ class LogParserTest {
@Test
fun parse_formatting() {
- config[123] = ViewerConfigParser.ConfigEntry("Test completed successfully: %b %d %% %o" +
- " %x %e %g %s %f", "ERROR", "WindowManager")
+ config[123] = ViewerConfigParser.ConfigEntry("Test completed successfully: %b %d %%" +
+ " %x %s %f", "ERROR", "WindowManager")
val logBuilder = ProtoLogFileProto.newBuilder()
val logMessageBuilder = ProtoLogMessage.newBuilder()
@@ -93,21 +93,21 @@ class LogParserTest {
.setMessageHash(123)
.setElapsedRealtimeNanos(0)
.addBooleanParams(true)
- .addAllSint64Params(listOf(1000, 20000, 300000))
- .addAllDoubleParams(listOf(0.1, 0.00001, 1000.1))
+ .addAllSint64Params(listOf(1000, 20000))
+ .addDoubleParams(1000.1)
.addStrParams("test")
logBuilder.addLog(logMessageBuilder.build())
parser.parse(buildProtoInput(logBuilder), getConfigDummyStream(), printStream)
assertEquals("${testDate(0)} ERROR WindowManager: Test completed successfully: " +
- "true 1000 % 47040 493e0 1.000000e-01 1.00000e-05 test 1000.100000\n",
+ "true 1000 % 4e20 test 1000.100000\n",
outStream.toString())
}
@Test
fun parse_invalidParamsTooMany() {
- config[123] = ViewerConfigParser.ConfigEntry("Test completed successfully: %b %d %% %o",
+ config[123] = ViewerConfigParser.ConfigEntry("Test completed successfully: %b %d %%",
"ERROR", "WindowManager")
val logBuilder = ProtoLogFileProto.newBuilder()
@@ -129,8 +129,8 @@ class LogParserTest {
@Test
fun parse_invalidParamsNotEnough() {
- config[123] = ViewerConfigParser.ConfigEntry("Test completed successfully: %b %d %% %o" +
- " %x %e %g %s %f", "ERROR", "WindowManager")
+ config[123] = ViewerConfigParser.ConfigEntry("Test completed successfully: %b %d %%" +
+ " %x %s %f", "ERROR", "WindowManager")
val logBuilder = ProtoLogFileProto.newBuilder()
val logMessageBuilder = ProtoLogMessage.newBuilder()