Remove registerGroups interface
Instead we will have a static init call that is used to register all protolog groups on initialization of ProtoLog in a new process.
Test: atest com.android.internal.protolog.ProtoLogServiceTest
Bug: 352538294
Flag: EXEMPT refactor
Change-Id: I733481640e89aa6394ea33e01436db01aa5824f9
diff --git a/core/java/com/android/internal/protolog/LegacyProtoLogImpl.java b/core/java/com/android/internal/protolog/LegacyProtoLogImpl.java
index fcc3023..2feb3d5 100644
--- a/core/java/com/android/internal/protolog/LegacyProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/LegacyProtoLogImpl.java
@@ -419,7 +419,6 @@
return group.isLogToLogcat() || (group.isLogToProto() && isProtoEnabled());
}
- @Override
public void registerGroups(IProtoLogGroup... protoLogGroups) {
for (IProtoLogGroup group : protoLogGroups) {
mLogGroups.put(group.name(), group);
diff --git a/core/java/com/android/internal/protolog/LogcatOnlyProtoLogImpl.java b/core/java/com/android/internal/protolog/LogcatOnlyProtoLogImpl.java
index ebdad6d..e8d5195 100644
--- a/core/java/com/android/internal/protolog/LogcatOnlyProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/LogcatOnlyProtoLogImpl.java
@@ -79,9 +79,4 @@
public boolean isEnabled(IProtoLogGroup group, LogLevel level) {
return true;
}
-
- @Override
- public void registerGroups(IProtoLogGroup... protoLogGroups) {
- // Does nothing
- }
}
diff --git a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
index 79a5469..7d12d49 100644
--- a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java
@@ -89,6 +89,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
+import java.util.stream.Stream;
/**
* A service for the ProtoLog logging system.
@@ -125,17 +126,18 @@
private final Lock mBackgroundServiceLock = new ReentrantLock();
private ExecutorService mBackgroundLoggingService = Executors.newSingleThreadExecutor();
- public PerfettoProtoLogImpl() {
- this(null, null, null, () -> {});
+ public PerfettoProtoLogImpl(@NonNull IProtoLogGroup[] groups) {
+ this(null, null, null, () -> {}, groups);
}
- public PerfettoProtoLogImpl(@NonNull Runnable cacheUpdater) {
- this(null, null, null, cacheUpdater);
+ public PerfettoProtoLogImpl(@NonNull Runnable cacheUpdater, @NonNull IProtoLogGroup[] groups) {
+ this(null, null, null, cacheUpdater, groups);
}
public PerfettoProtoLogImpl(
@NonNull String viewerConfigFilePath,
- @NonNull Runnable cacheUpdater) {
+ @NonNull Runnable cacheUpdater,
+ @NonNull IProtoLogGroup[] groups) {
this(viewerConfigFilePath,
null,
new ProtoLogViewerConfigReader(() -> {
@@ -146,22 +148,24 @@
"Failed to load viewer config file " + viewerConfigFilePath, e);
}
}),
- cacheUpdater);
+ cacheUpdater, groups);
}
@VisibleForTesting
public PerfettoProtoLogImpl(
@Nullable ViewerConfigInputStreamProvider viewerConfigInputStreamProvider,
@Nullable ProtoLogViewerConfigReader viewerConfigReader,
- @NonNull Runnable cacheUpdater) {
- this(null, viewerConfigInputStreamProvider, viewerConfigReader, cacheUpdater);
+ @NonNull Runnable cacheUpdater,
+ @NonNull IProtoLogGroup[] groups) {
+ this(null, viewerConfigInputStreamProvider, viewerConfigReader, cacheUpdater, groups);
}
private PerfettoProtoLogImpl(
@Nullable String viewerConfigFilePath,
@Nullable ViewerConfigInputStreamProvider viewerConfigInputStreamProvider,
@Nullable ProtoLogViewerConfigReader viewerConfigReader,
- @NonNull Runnable cacheUpdater) {
+ @NonNull Runnable cacheUpdater,
+ @NonNull IProtoLogGroup[] groups) {
if (viewerConfigFilePath != null && viewerConfigInputStreamProvider != null) {
throw new RuntimeException("Only one of viewerConfigFilePath and "
+ "viewerConfigInputStreamProvider can be set");
@@ -179,6 +183,8 @@
this.mViewerConfigReader = viewerConfigReader;
this.mCacheUpdater = cacheUpdater;
+ registerGroupsLocally(groups);
+
if (android.tracing.Flags.clientSideProtoLogging()) {
mProtoLogService =
IProtoLogService.Stub.asInterface(ServiceManager.getService(PROTOLOG_SERVICE));
@@ -192,6 +198,12 @@
args.setViewerConfigFile(viewerConfigFilePath);
}
+ final var groupArgs = Stream.of(groups)
+ .map(group -> new ProtoLogService.RegisterClientArgs.GroupConfig(
+ group.name(), group.isLogToLogcat()))
+ .toArray(ProtoLogService.RegisterClientArgs.GroupConfig[]::new);
+ args.setGroups(groupArgs);
+
mProtoLogService.registerClient(this, args);
} catch (RemoteException e) {
throw new RuntimeException("Failed to register ProtoLog client");
@@ -294,19 +306,18 @@
|| group.isLogToLogcat();
}
- @Override
- public void registerGroups(IProtoLogGroup... protoLogGroups) {
+ private void registerGroupsLocally(@NonNull IProtoLogGroup[] protoLogGroups) {
+ final var groupsLoggingToLogcat = new ArrayList<String>();
for (IProtoLogGroup protoLogGroup : protoLogGroups) {
mLogGroups.put(protoLogGroup.name(), protoLogGroup);
+
+ if (protoLogGroup.isLogToLogcat()) {
+ groupsLoggingToLogcat.add(protoLogGroup.name());
+ }
}
- final String[] groupsLoggingToLogcat = Arrays.stream(protoLogGroups)
- .filter(IProtoLogGroup::isLogToLogcat)
- .map(IProtoLogGroup::name)
- .toArray(String[]::new);
-
if (mViewerConfigReader != null) {
- mViewerConfigReader.loadViewerConfig(groupsLoggingToLogcat);
+ mViewerConfigReader.loadViewerConfig(groupsLoggingToLogcat.toArray(new String[0]));
}
}
diff --git a/core/java/com/android/internal/protolog/ProtoLog.java b/core/java/com/android/internal/protolog/ProtoLog.java
index 87678e5..f9b9894 100644
--- a/core/java/com/android/internal/protolog/ProtoLog.java
+++ b/core/java/com/android/internal/protolog/ProtoLog.java
@@ -50,6 +50,24 @@
private static IProtoLog sProtoLogInstance;
/**
+ * Initialize ProtoLog in this process.
+ * <p>
+ * This method MUST be called before any protologging is performed in this process.
+ * Ensure that all groups that will be used for protologging are registered.
+ *
+ * @param groups The ProtoLog groups that will be used in the process.
+ */
+ public static void init(IProtoLogGroup... groups) {
+ if (android.tracing.Flags.perfettoProtologTracing()) {
+ sProtoLogInstance = new PerfettoProtoLogImpl(groups);
+ } else {
+ // The first call to ProtoLog is likely to flip REQUIRE_PROTOLOGTOOL, which is when this
+ // static block will be executed before REQUIRE_PROTOLOGTOOL is actually set.
+ sProtoLogInstance = new LogcatOnlyProtoLogImpl();
+ }
+ }
+
+ /**
* DEBUG level log.
*
* @param group {@code IProtoLogGroup} controlling this log call.
@@ -150,14 +168,6 @@
return sProtoLogInstance;
}
- /**
- * Registers available protolog groups. A group must be registered before it can be used.
- * @param protoLogGroups The groups to register for use in protolog.
- */
- public static void registerGroups(IProtoLogGroup... protoLogGroups) {
- sProtoLogInstance.registerGroups(protoLogGroups);
- }
-
private static void logStringMessage(LogLevel logLevel, IProtoLogGroup group,
String stringMessage, Object... args) {
if (sProtoLogInstance == null) {
@@ -169,14 +179,4 @@
sProtoLogInstance.log(logLevel, group, stringMessage, args);
}
}
-
- static {
- if (android.tracing.Flags.perfettoProtologTracing()) {
- sProtoLogInstance = new PerfettoProtoLogImpl();
- } else {
- // The first call to ProtoLog is likely to flip REQUIRE_PROTOLOGTOOL, which is when this
- // static block will be executed before REQUIRE_PROTOLOGTOOL is actually set.
- sProtoLogInstance = new LogcatOnlyProtoLogImpl();
- }
- }
}
diff --git a/core/java/com/android/internal/protolog/ProtoLogImpl.java b/core/java/com/android/internal/protolog/ProtoLogImpl.java
index 8659a8f..da6d8cf 100644
--- a/core/java/com/android/internal/protolog/ProtoLogImpl.java
+++ b/core/java/com/android/internal/protolog/ProtoLogImpl.java
@@ -93,35 +93,30 @@
}
/**
- * Registers available protolog groups. A group must be registered before it can be used.
- * @param protoLogGroups The groups to register for use in protolog.
- */
- public static void registerGroups(IProtoLogGroup... protoLogGroups) {
- getSingleInstance().registerGroups(protoLogGroups);
- }
-
- /**
* Returns the single instance of the ProtoLogImpl singleton class.
*/
public static synchronized IProtoLog getSingleInstance() {
if (sServiceInstance == null) {
+ final var groups = sLogGroups.values().toArray(new IProtoLogGroup[0]);
+
if (android.tracing.Flags.perfettoProtologTracing()) {
File f = new File(sViewerConfigPath);
if (!ProtoLog.REQUIRE_PROTOLOGTOOL && !f.exists()) {
// TODO(b/353530422): Remove - temporary fix to unblock b/352290057
- // In so tests the viewer config file might not exist in which we don't
+ // In some tests the viewer config file might not exist in which we don't
// want to provide config path to the user
- sServiceInstance = new PerfettoProtoLogImpl(sCacheUpdater);
+ sServiceInstance = new PerfettoProtoLogImpl(sCacheUpdater, groups);
} else {
- sServiceInstance = new PerfettoProtoLogImpl(sViewerConfigPath, sCacheUpdater);
+ sServiceInstance =
+ new PerfettoProtoLogImpl(sViewerConfigPath, sCacheUpdater, groups);
}
} else {
- sServiceInstance = new LegacyProtoLogImpl(
+ var protologImpl = new LegacyProtoLogImpl(
sLegacyOutputFilePath, sLegacyViewerConfigPath, sCacheUpdater);
+ protologImpl.registerGroups(groups);
+ sServiceInstance = protologImpl;
}
- IProtoLogGroup[] groups = sLogGroups.values().toArray(new IProtoLogGroup[0]);
- sServiceInstance.registerGroups(groups);
sCacheUpdater.run();
}
return sServiceInstance;
diff --git a/core/java/com/android/internal/protolog/common/IProtoLog.java b/core/java/com/android/internal/protolog/common/IProtoLog.java
index f5695ac..d5c2ac1 100644
--- a/core/java/com/android/internal/protolog/common/IProtoLog.java
+++ b/core/java/com/android/internal/protolog/common/IProtoLog.java
@@ -68,10 +68,4 @@
* @return If we need to log this group and level to either ProtoLog or Logcat.
*/
boolean isEnabled(IProtoLogGroup group, LogLevel level);
-
- /**
- * Registers available protolog groups. A group must be registered before it can be used.
- * @param protoLogGroups The groups to register for use in protolog.
- */
- void registerGroups(IProtoLogGroup... protoLogGroups);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellInit.java b/libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellInit.java
index 287e779..1140c82 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellInit.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/sysui/ShellInit.java
@@ -48,7 +48,7 @@
public ShellInit(ShellExecutor mainExecutor) {
mMainExecutor = mainExecutor;
- ProtoLog.registerGroups(ShellProtoLogGroup.values());
+ ProtoLog.init(ShellProtoLogGroup.values());
}
/**
diff --git a/tests/Internal/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java b/tests/Internal/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java
index 4b745b2..4826f42 100644
--- a/tests/Internal/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java
+++ b/tests/Internal/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java
@@ -43,7 +43,6 @@
import android.tracing.perfetto.DataSource;
import android.util.proto.ProtoInputStream;
-import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.internal.protolog.common.IProtoLogGroup;
@@ -73,7 +72,6 @@
* Test class for {@link ProtoLogImpl}.
*/
@SuppressWarnings("ConstantConditions")
-@SmallTest
@Presubmit
@RunWith(JUnit4.class)
public class PerfettoProtoLogImplTest {
@@ -166,8 +164,7 @@
mReader = Mockito.spy(new ProtoLogViewerConfigReader(viewerConfigInputStreamProvider));
mProtoLog = new PerfettoProtoLogImpl(
viewerConfigInputStreamProvider, mReader,
- () -> mCacheUpdater.run());
- mProtoLog.registerGroups(TestProtoLogGroup.values());
+ () -> mCacheUpdater.run(), TestProtoLogGroup.values());
}
@After
diff --git a/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt
index 3c99e68..c3595b7 100644
--- a/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt
+++ b/tools/protologtool/src/com/android/protolog/tool/ProtoLogCallProcessorImpl.kt
@@ -120,7 +120,7 @@
logCallVisitor?.processCall(call, messageString, getLevelForMethodName(
call.name.toString(), call, context), groupMap.getValue(groupName))
- } else if (call.name.id == "initialize") {
+ } else if (call.name.id == "init") {
// No processing
} else {
// Process non-log message calls