FGS Metrics Logging Improvements
Improving and evolving FGS Metrics logging API.
Test: atest ActivityManagerTest#testNoteForegroundResourceUse
Bug: 271345905
Change-Id: I073f337a306bcd14670a8f01fe6ddb8592a477ce
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index cd96a1e..044a9ba 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -161,7 +161,7 @@
field public static final String LOCAL_MAC_ADDRESS = "android.permission.LOCAL_MAC_ADDRESS";
field public static final String LOCATION_BYPASS = "android.permission.LOCATION_BYPASS";
field public static final String LOCK_DEVICE = "android.permission.LOCK_DEVICE";
- field public static final String LOG_PROCESS_ACTIVITIES = "android.permission.LOG_PROCESS_ACTIVITIES";
+ field public static final String LOG_FOREGROUND_RESOURCE_USE = "android.permission.LOG_FOREGROUND_RESOURCE_USE";
field public static final String LOOP_RADIO = "android.permission.LOOP_RADIO";
field public static final String MANAGE_ACCESSIBILITY = "android.permission.MANAGE_ACCESSIBILITY";
field @Deprecated public static final String MANAGE_ACTIVITY_STACKS = "android.permission.MANAGE_ACTIVITY_STACKS";
@@ -538,15 +538,15 @@
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int);
method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void killProcessesWhenImperceptible(@NonNull int[], @NonNull String);
method @RequiresPermission(android.Manifest.permission.KILL_UID) public void killUid(int, String);
- method @RequiresPermission(android.Manifest.permission.LOG_PROCESS_ACTIVITIES) public void noteForegroundResourceUse(int, int, int, int);
+ method @RequiresPermission(android.Manifest.permission.LOG_FOREGROUND_RESOURCE_USE) public void noteForegroundResourceUseBegin(int, int, int) throws java.lang.SecurityException;
+ method @RequiresPermission(android.Manifest.permission.LOG_FOREGROUND_RESOURCE_USE) public void noteForegroundResourceUseEnd(int, int, int) throws java.lang.SecurityException;
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
method public void setDeviceLocales(@NonNull android.os.LocaleList);
method @RequiresPermission(android.Manifest.permission.RESTRICTED_VR_ACCESS) public static void setPersistentVrThread(int);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}) public boolean startProfile(@NonNull android.os.UserHandle);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS_FULL}) public boolean stopProfile(@NonNull android.os.UserHandle);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean switchUser(@NonNull android.os.UserHandle);
- field public static final int FOREGROUND_SERVICE_API_EVENT_BEGIN = 1; // 0x1
- field public static final int FOREGROUND_SERVICE_API_EVENT_END = 2; // 0x2
+ field public static final int FOREGROUND_SERVICE_API_TYPE_AUDIO = 5; // 0x5
field public static final int FOREGROUND_SERVICE_API_TYPE_BLUETOOTH = 2; // 0x2
field public static final int FOREGROUND_SERVICE_API_TYPE_CAMERA = 1; // 0x1
field public static final int FOREGROUND_SERVICE_API_TYPE_CDM = 9; // 0x9
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index b4068db..ff75098 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -666,6 +666,7 @@
* Used to log FGS API events from Audio API
* @hide
*/
+ @SystemApi
public static final int FOREGROUND_SERVICE_API_TYPE_AUDIO = 5;
/**
* Used to log FGS API events from microphone API
@@ -715,13 +716,11 @@
* Used to log a start event for an FGS API
* @hide
*/
- @SystemApi
public static final int FOREGROUND_SERVICE_API_EVENT_BEGIN = 1;
/**
* Used to log a stop event for an FGS API
* @hide
*/
- @SystemApi
public static final int FOREGROUND_SERVICE_API_EVENT_END = 2;
/**
* Constants used to denote API state
@@ -5617,23 +5616,32 @@
*
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.LOG_PROCESS_ACTIVITIES)
- public void noteForegroundResourceUse(@ForegroundServiceApiType int apiType,
- @ForegroundServiceApiEvent int apiEvent, int uid, int pid) {
+ @RequiresPermission(android.Manifest.permission.LOG_FOREGROUND_RESOURCE_USE)
+ public void noteForegroundResourceUseBegin(@ForegroundServiceApiType int apiType,
+ int uid, int pid) throws SecurityException {
try {
- switch (apiEvent) {
- case FOREGROUND_SERVICE_API_EVENT_BEGIN:
- getService().logFgsApiBegin(apiType, uid, pid);
- break;
- case FOREGROUND_SERVICE_API_EVENT_END:
- getService().logFgsApiEnd(apiType, uid, pid);
- break;
- default:
- throw new IllegalArgumentException("Argument of "
- + apiType + " not supported for foreground resource use logging");
- }
+ getService().logFgsApiBegin(apiType, uid, pid);
} catch (RemoteException e) {
- e.rethrowFromSystemServer();
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Internal method for logging API end. Used with
+ * FGS metrics logging. Is called by APIs that are
+ * used with FGS to log an API event (eg when
+ * the camera starts).
+ * @hide
+ *
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.LOG_FOREGROUND_RESOURCE_USE)
+ public void noteForegroundResourceUseEnd(@ForegroundServiceApiType int apiType,
+ int uid, int pid) throws SecurityException {
+ try {
+ getService().logFgsApiEnd(apiType, uid, pid);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
}
}
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 5c38c42..62298a5 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -870,11 +870,11 @@
boolean shouldServiceTimeOut(in ComponentName className, in IBinder token);
/** Logs start of an API call to associate with an FGS, used for FGS Type Metrics */
- oneway void logFgsApiBegin(int apiType, int appUid, int appPid);
+ void logFgsApiBegin(int apiType, int appUid, int appPid);
/** Logs stop of an API call to associate with an FGS, used for FGS Type Metrics */
- oneway void logFgsApiEnd(int apiType, int appUid, int appPid);
+ void logFgsApiEnd(int apiType, int appUid, int appPid);
/** Logs API state change to associate with an FGS, used for FGS Type Metrics */
- oneway void logFgsApiStateChanged(int apiType, int state, int appUid, int appPid);
+ void logFgsApiStateChanged(int apiType, int state, int appUid, int appPid);
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 5be18fb4..496cc3a 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -7620,8 +7620,8 @@
<!-- @SystemApi Allows to call APIs that log process lifecycle events
@hide -->
- <permission android:name="android.permission.LOG_PROCESS_ACTIVITIES"
- android:protectionLevel="signature|privileged" />
+ <permission android:name="android.permission.LOG_FOREGROUND_RESOURCE_USE"
+ android:protectionLevel="signature|module" />
<!-- @hide Allows an application to get type of any provider uri.
<p>Not for use by third-party applications.
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 4a98c4d..e287867 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -511,6 +511,8 @@
<permission name="android.permission.WRITE_APN_SETTINGS"/>
<!-- Permission required for GTS test - GtsStatsdHostTestCases -->
<permission name="android.permission.READ_RESTRICTED_STATS"/>
+ <!-- Permission required for CTS test -->
+ <permission name="android.permission.LOG_FOREGROUND_RESOURCE_USE"/>
</privapp-permissions>
<privapp-permissions package="com.android.statementservice">
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 8cbf5f8..4c48f0e 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -828,6 +828,8 @@
<!-- Permission required for CTS test - CtsTelephonyProviderTestCases -->
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
+ <uses-permission android:name="android.permission.LOG_FOREGROUND_RESOURCE_USE"/>
+
<application android:label="@string/app_label"
android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:defaultToDeviceProtectedStorage="true"
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index fdd55a8..746ba7b 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -13100,8 +13100,8 @@
@Override
public void logFgsApiBegin(@ForegroundServiceApiType int apiType,
int uid, int pid) {
- enforceCallingPermission(android.Manifest.permission.LOG_PROCESS_ACTIVITIES,
- "logFgsApiStart");
+ enforceCallingPermission(android.Manifest.permission.LOG_FOREGROUND_RESOURCE_USE,
+ "logFgsApiBegin");
synchronized (this) {
mServices.logFgsApiBeginLocked(apiType, uid, pid);
}
@@ -13110,8 +13110,8 @@
@Override
public void logFgsApiEnd(@ForegroundServiceApiType int apiType,
int uid, int pid) {
- enforceCallingPermission(android.Manifest.permission.LOG_PROCESS_ACTIVITIES,
- "logFgsApiStart");
+ enforceCallingPermission(android.Manifest.permission.LOG_FOREGROUND_RESOURCE_USE,
+ "logFgsApiEnd");
synchronized (this) {
mServices.logFgsApiEndLocked(apiType, uid, pid);
}
@@ -13120,8 +13120,8 @@
@Override
public void logFgsApiStateChanged(@ForegroundServiceApiType int apiType,
int state, int uid, int pid) {
- enforceCallingPermission(android.Manifest.permission.LOG_PROCESS_ACTIVITIES,
- "logFgsApiStart");
+ enforceCallingPermission(android.Manifest.permission.LOG_FOREGROUND_RESOURCE_USE,
+ "logFgsApiEvent");
synchronized (this) {
mServices.logFgsApiStateChangedLocked(apiType, uid, pid, state);
}