summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorHui Yu <huiyu@google.com>2021-02-19 11:38:10 -0800
committerHui Yu <huiyu@google.com>2021-02-24 22:02:09 +0000
commitbd7619635d0d04340cc60548e5650cc77270a371 (patch)
tree30c7b03134df7ffa2a447ff68105d585c24b5c89 /core/java/android
parentd549483e311e3d9765efc21be1524c1ebe96d9a2 (diff)
Log the temp allowlist reason/duration at FGS start.
There are four ways a package can be temp allowlisted: 1. Calling BroadcastOptions#setTemporaryAppWhitelistDuration() to allowlist a BroadcastReceiver, this is a SystemApi. 2. Calling ActivityManagerService#setPendingIntentWhitelistDuration() to allowlist a PendingIntent, this is not an API, it is an internal method. 3. Calling PowerWhitelistManager#whitelistAppTemporarily() to allowlist a package, this is a SystemApi. 4. DeviceIdleController.addPowerSaveTempWhitelistApp(), this is an internal method. Also the package can be permanently allowlsited in ActivityManagerService#mDeviceIdleExceptIdleAllowlist. Move the BG-FGS-launch reasonCode from ActiveService.java to PowerWhitelistManager.java. Define a list of temp allowlist reasonCode in addition to the BG-FGS-launch reasonCode. The reasonCode is passed around in DeviceIdleController and ActivityManagerService, it will be used in statsd FGS metric. At FGS start, check all above allowlists and record the reasonCode/reason/duration in ServiceRecord#mInfoTempAllowListReason field. If mInfoTempAllowListReason is not null, log the reasonCode/reason/duration in "Background started FGS" log message, with key "tempAllowListReason". Bug: 171305836 Test: atest cts/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java Reboot device, observe all "tempAllowListReason" listed above in logcat. BYPASS_INCLUSIVE_LANGUAGE_REASON=existing APIs Change-Id: Ieb52d95aae3258817a67734c093cb12fc78a81fd CTS-Coverage-Bug: 181160445
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/app/ActivityManagerInternal.java39
-rw-r--r--core/java/android/app/BroadcastOptions.java109
-rw-r--r--core/java/android/app/IActivityManager.aidl2
3 files changed, 114 insertions, 36 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index c31c22cca329..71f164f49262 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -30,6 +30,7 @@ import android.content.pm.UserInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
+import android.os.PowerWhitelistManager.ReasonCode;
import android.os.PowerWhitelistManager.TempAllowListType;
import android.os.TransactionTooLargeException;
import android.os.WorkSource;
@@ -102,12 +103,19 @@ public abstract class ActivityManagerInternal {
* Sets how long a {@link PendingIntent} can be temporarily allowlisted to bypass restrictions
* such as Power Save mode.
* @param target
- * @param whitelistToken
+ * @param allowlistToken
* @param duration temp allowlist duration in milliseconds.
* @param type temp allowlist type defined at {@link TempAllowListType}
+ * @param reasonCode one of {@link ReasonCode}
+ * @param reason A human-readable reason for logging purposes.
*/
+ public abstract void setPendingIntentAllowlistDuration(IIntentSender target,
+ IBinder allowlistToken, long duration, @TempAllowListType int type,
+ @ReasonCode int reasonCode, @Nullable String reason);
+
+ @Deprecated
public abstract void setPendingIntentWhitelistDuration(IIntentSender target,
- IBinder whitelistToken, long duration, int type);
+ IBinder allowlistToken, long duration, @TempAllowListType int type);
/**
* Returns the flags set for a {@link PendingIntent}.
@@ -127,20 +135,26 @@ public abstract class ActivityManagerInternal {
IBinder allowlistToken);
/**
- * Allow DeviceIdleController to tell us about what apps are whitelisted.
+ * Allow DeviceIdleController to tell us about what apps are allowlisted.
*/
- public abstract void setDeviceIdleWhitelist(int[] allAppids, int[] exceptIdleAppids);
+ public abstract void setDeviceIdleAllowlist(int[] allAppids, int[] exceptIdleAppids);
/**
- * Update information about which app IDs are on the temp whitelist.
+ * Update information about which app IDs are on the temp allowlist.
* @param appids the updated list of appIds in temp allowlist.
* @param changingUid uid to add or remove to temp allowlist.
* @param adding true to add to temp allowlist, false to remove from temp allowlist.
* @param durationMs when adding is true, the duration to be in temp allowlist.
* @param type temp allowlist type defined at {@link TempAllowListType}.
+ * @param reasonCode one of {@link ReasonCode}
+ * @param reason A human-readable reason for logging purposes.
+ * @param callingUid the callingUid that setup this temp allowlist, only valid when param adding
+ * is true.
*/
- public abstract void updateDeviceIdleTempWhitelist(int[] appids, int changingUid,
- boolean adding, long durationMs, @TempAllowListType int type);
+ public abstract void updateDeviceIdleTempAllowlist(int[] appids, int changingUid,
+ boolean adding, long durationMs, @TempAllowListType int type,
+ @ReasonCode int reasonCode,
+ @Nullable String reason, int callingUid);
/**
* Get the procstate for the UID. The return value will be between
@@ -335,10 +349,11 @@ public abstract class ActivityManagerInternal {
* @param targetUid the UID that is been temp allowlisted.
* @param duration temp allowlist duration in milliseconds.
* @param type temp allowlist type defined at {@link TempAllowListType}
- * @param tag
+ * @param reasonCode one of {@link ReasonCode}
+ * @param reason
*/
- public abstract void tempWhitelistForPendingIntent(int callerPid, int callerUid, int targetUid,
- long duration, int type, String tag);
+ public abstract void tempAllowlistForPendingIntent(int callerPid, int callerUid, int targetUid,
+ long duration, int type, @ReasonCode int reasonCode, String reason);
public abstract int broadcastIntentInPackage(String packageName, @Nullable String featureId,
int uid, int realCallingUid, int realCallingPid, Intent intent, String resolvedType,
@@ -495,9 +510,9 @@ public abstract class ActivityManagerInternal {
/**
* Sends a broadcast, assuming the caller to be the system and allowing the inclusion of an
- * approved whitelist of app Ids >= {@link android.os.Process#FIRST_APPLICATION_UID} that the
+ * approved allowlist of app Ids >= {@link android.os.Process#FIRST_APPLICATION_UID} that the
* broadcast my be sent to; any app Ids < {@link android.os.Process#FIRST_APPLICATION_UID} are
- * automatically whitelisted.
+ * automatically allowlisted.
*
* @see com.android.server.am.ActivityManagerService#broadcastIntentWithFeature(
* IApplicationThread, String, Intent, String, IIntentReceiver, int, String, Bundle,
diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java
index 445fdd83f34a..2e06e9b80595 100644
--- a/core/java/android/app/BroadcastOptions.java
+++ b/core/java/android/app/BroadcastOptions.java
@@ -16,11 +16,13 @@
package android.app;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerWhitelistManager;
+import android.os.PowerWhitelistManager.ReasonCode;
import android.os.PowerWhitelistManager.TempAllowListType;
/**
@@ -31,8 +33,11 @@ import android.os.PowerWhitelistManager.TempAllowListType;
*/
@SystemApi
public class BroadcastOptions {
- private long mTemporaryAppWhitelistDuration;
- private @TempAllowListType int mTemporaryAppWhitelistType;
+ private long mTemporaryAppAllowlistDuration;
+ private @TempAllowListType int mTemporaryAppAllowlistType;
+ private @ReasonCode int mTemporaryAppAllowlistReasonCode =
+ PowerWhitelistManager.REASON_UNKNOWN;
+ private @Nullable String mTemporaryAppAllowlistReason;
private int mMinManifestReceiverApiLevel = 0;
private int mMaxManifestReceiverApiLevel = Build.VERSION_CODES.CUR_DEVELOPMENT;
private boolean mDontSendToRestrictedApps = false;
@@ -42,11 +47,17 @@ public class BroadcastOptions {
* How long to temporarily put an app on the power allowlist when executing this broadcast
* to it.
*/
- static final String KEY_TEMPORARY_APP_WHITELIST_DURATION
- = "android:broadcast.temporaryAppWhitelistDuration";
+ static final String KEY_TEMPORARY_APP_ALLOWLIST_DURATION
+ = "android:broadcast.temporaryAppAllowlistDuration";
- static final String KEY_TEMPORARY_APP_WHITELIST_TYPE
- = "android:broadcast.temporaryAppWhitelistType";
+ static final String KEY_TEMPORARY_APP_ALLOWLIST_TYPE
+ = "android:broadcast.temporaryAppAllowlistType";
+
+ static final String KEY_TEMPORARY_APP_ALLOWLIST_REASON_CODE =
+ "android:broadcast.temporaryAppAllowlistReasonCode";
+
+ static final String KEY_TEMPORARY_APP_ALLOWLIST_REASON =
+ "android:broadcast.temporaryAppAllowlistReason";
/**
* Corresponds to {@link #setMinManifestReceiverApiLevel}.
@@ -80,6 +91,7 @@ public class BroadcastOptions {
@Deprecated
public static final int TEMPORARY_WHITELIST_TYPE_FOREGROUND_SERVICE_ALLOWED =
PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
+
/**
* @hide
* @deprecated Use {@link android.os.PowerWhitelistManager#
@@ -99,8 +111,11 @@ public class BroadcastOptions {
/** @hide */
public BroadcastOptions(Bundle opts) {
- mTemporaryAppWhitelistDuration = opts.getLong(KEY_TEMPORARY_APP_WHITELIST_DURATION);
- mTemporaryAppWhitelistType = opts.getInt(KEY_TEMPORARY_APP_WHITELIST_TYPE);
+ mTemporaryAppAllowlistDuration = opts.getLong(KEY_TEMPORARY_APP_ALLOWLIST_DURATION);
+ mTemporaryAppAllowlistType = opts.getInt(KEY_TEMPORARY_APP_ALLOWLIST_TYPE);
+ mTemporaryAppAllowlistReasonCode = opts.getInt(KEY_TEMPORARY_APP_ALLOWLIST_REASON_CODE,
+ PowerWhitelistManager.REASON_UNKNOWN);
+ mTemporaryAppAllowlistReason = opts.getString(KEY_TEMPORARY_APP_ALLOWLIST_REASON);
mMinManifestReceiverApiLevel = opts.getInt(KEY_MIN_MANIFEST_RECEIVER_API_LEVEL, 0);
mMaxManifestReceiverApiLevel = opts.getInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL,
Build.VERSION_CODES.CUR_DEVELOPMENT);
@@ -113,14 +128,16 @@ public class BroadcastOptions {
* Set a duration for which the system should temporary place an application on the
* power allowlist when this broadcast is being delivered to it.
* @param duration The duration in milliseconds; 0 means to not place on allowlist.
+ * @deprecated use {@link #setTemporaryAppAllowlist(long, int, int, String)} instead.
*/
+ @Deprecated
@RequiresPermission(anyOf = {android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST,
android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND,
android.Manifest.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND})
public void setTemporaryAppWhitelistDuration(long duration) {
- mTemporaryAppWhitelistDuration = duration;
- mTemporaryAppWhitelistType =
- PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED;
+ setTemporaryAppAllowlist(duration,
+ PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED,
+ PowerWhitelistManager.REASON_UNKNOWN, null);
}
/**
@@ -129,29 +146,69 @@ public class BroadcastOptions {
* type.
* @param type one of {@link TempAllowListType}
* @param duration the duration in milliseconds; 0 means to not place on allowlist.
+ * @deprecated use {@link #setTemporaryAppAllowlist(long, int, int, String)} instead.
*/
+ @Deprecated
@RequiresPermission(anyOf = {android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST,
android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND,
android.Manifest.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND})
public void setTemporaryAppWhitelistDuration(@TempAllowListType int type, long duration) {
- mTemporaryAppWhitelistDuration = duration;
- mTemporaryAppWhitelistType = type;
+ setTemporaryAppAllowlist(duration, type,
+ PowerWhitelistManager.REASON_UNKNOWN, null);
}
/**
- * Return {@link #setTemporaryAppWhitelistDuration}.
+ * Set a duration for which the system should temporary place an application on the
+ * power allowlist when this broadcast is being delivered to it, specify the temp allowlist
+ * type.
+ * @param duration the duration in milliseconds; 0 means to not place on allowlist.
+ * @param type one of {@link TempAllowListType}
+ * @param reasonCode one of {@link ReasonCode}, use
+ * {@link PowerWhitelistManager#REASON_UNKNOWN} if not sure.
+ * @param reason A human-readable reason explaining why the app is temp allowlisted. Only
+ * used for logging purposes. Could be null or empty string.
+ */
+ @RequiresPermission(anyOf = {android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST,
+ android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND,
+ android.Manifest.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND})
+ public void setTemporaryAppAllowlist(long duration, @TempAllowListType int type,
+ @ReasonCode int reasonCode, @Nullable String reason) {
+ mTemporaryAppAllowlistDuration = duration;
+ mTemporaryAppAllowlistType = type;
+ mTemporaryAppAllowlistReasonCode = reasonCode;
+ mTemporaryAppAllowlistReason = reason;
+ }
+
+ /**
+ * Return {@link #setTemporaryAppAllowlist}.
+ * @hide
+ */
+ public long getTemporaryAppAllowlistDuration() {
+ return mTemporaryAppAllowlistDuration;
+ }
+
+ /**
+ * Return {@link #mTemporaryAppAllowlistType}.
* @hide
*/
- public long getTemporaryAppWhitelistDuration() {
- return mTemporaryAppWhitelistDuration;
+ public @TempAllowListType int getTemporaryAppAllowlistType() {
+ return mTemporaryAppAllowlistType;
}
/**
- * Return {@link #mTemporaryAppWhitelistType}.
+ * Return {@link #mTemporaryAppAllowlistReasonCode}.
* @hide
*/
- public @TempAllowListType int getTemporaryAppWhitelistType() {
- return mTemporaryAppWhitelistType;
+ public @ReasonCode int getTemporaryAppAllowlistReasonCode() {
+ return mTemporaryAppAllowlistReasonCode;
+ }
+
+ /**
+ * Return {@link #mTemporaryAppAllowlistReason}.
+ * @hide
+ */
+ public @Nullable String getTemporaryAppAllowlistReason() {
+ return mTemporaryAppAllowlistReason;
}
/**
@@ -236,11 +293,17 @@ public class BroadcastOptions {
*/
public Bundle toBundle() {
Bundle b = new Bundle();
- if (mTemporaryAppWhitelistDuration > 0) {
- b.putLong(KEY_TEMPORARY_APP_WHITELIST_DURATION, mTemporaryAppWhitelistDuration);
+ if (mTemporaryAppAllowlistDuration > 0) {
+ b.putLong(KEY_TEMPORARY_APP_ALLOWLIST_DURATION, mTemporaryAppAllowlistDuration);
+ }
+ if (mTemporaryAppAllowlistType != 0) {
+ b.putInt(KEY_TEMPORARY_APP_ALLOWLIST_TYPE, mTemporaryAppAllowlistType);
+ }
+ if (mTemporaryAppAllowlistReasonCode != PowerWhitelistManager.REASON_UNKNOWN) {
+ b.putInt(KEY_TEMPORARY_APP_ALLOWLIST_REASON_CODE, mTemporaryAppAllowlistReasonCode);
}
- if (mTemporaryAppWhitelistType != 0) {
- b.putInt(KEY_TEMPORARY_APP_WHITELIST_TYPE, mTemporaryAppWhitelistType);
+ if (mTemporaryAppAllowlistReason != null) {
+ b.putString(KEY_TEMPORARY_APP_ALLOWLIST_REASON, mTemporaryAppAllowlistReason);
}
if (mMinManifestReceiverApiLevel != 0) {
b.putInt(KEY_MIN_MANIFEST_RECEIVER_API_LEVEL, mMinManifestReceiverApiLevel);
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 4ad13e1932dd..7c717719e7a8 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -552,7 +552,7 @@ interface IActivityManager {
/**
* Add a bare uid to the background restrictions whitelist. Only the system uid may call this.
*/
- void backgroundWhitelistUid(int uid);
+ void backgroundAllowlistUid(int uid);
// Start of P transactions
/**