From af8ff4f2afdfa1acfc7acf73f934434cac97b7a3 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Mon, 4 Jun 2018 14:44:19 -0700 Subject: [PATCH] Allow except-idle whitelisted apps to start BG services in EBS Change-Id: I8dd42f48cf13c97b4e428afbf29838f442d8731b Fixes: 80420676 Test: dumpsys activity processes| grep mDeviceIdle mDeviceIdleWhitelist=[1000, 1001, 2000, 10028, 10035, 10036, 10042, 10053, 10137, 10138, 10139, 10142] mDeviceIdleExceptIdleWhitelist=[1000, 1001, 2000, 10006, 10008, 10014, 10016, 10028, 10035, 10036, 10042, 10047, 10053, 10058, 10060, 10070, 10111, 10137, 10138, 10139, 10142] Test: Manual test with "DEBUG_BACKGROUND_CHECK = true" and am startservice 'com.android.vending/com.google.android.finsky.hygiene.DailyHygiene\$DailyHygieneService' then check the whitelist log. --- .../android/app/ActivityManagerInternal.java | 2 +- .../android/server/DeviceIdleController.java | 10 +++--- .../server/am/ActivityManagerService.java | 36 +++++++++++++------ 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 7338bfea9d4db..1d5f49a879d5d 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -207,7 +207,7 @@ public abstract class ActivityManagerInternal { /** * Allow DeviceIdleController to tell us about what apps are whitelisted. */ - public abstract void setDeviceIdleWhitelist(int[] appids); + public abstract void setDeviceIdleWhitelist(int[] allAppids, int[] exceptIdleAppids); /** * Update information about which app IDs are on the temp whitelist. diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index 0f4702cb8cde0..b8f395b74c595 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -1535,7 +1535,8 @@ public class DeviceIdleController extends SystemService filter.addAction(Intent.ACTION_SCREEN_ON); getContext().registerReceiver(mInteractivityReceiver, filter); - mLocalActivityManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray); + mLocalActivityManager.setDeviceIdleWhitelist( + mPowerSaveWhitelistAllAppIdArray, mPowerSaveWhitelistExceptIdleAppIdArray); mLocalPowerManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray); mLocalActivityManager.registerScreenObserver(mScreenObserver); @@ -2576,11 +2577,8 @@ public class DeviceIdleController extends SystemService mPowerSaveWhitelistUserAppIdArray = buildAppIdArray(null, mPowerSaveWhitelistUserApps, mPowerSaveWhitelistUserAppIds); if (mLocalActivityManager != null) { - if (DEBUG) { - Slog.d(TAG, "Setting activity manager whitelist to " - + Arrays.toString(mPowerSaveWhitelistAllAppIdArray)); - } - mLocalActivityManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray); + mLocalActivityManager.setDeviceIdleWhitelist( + mPowerSaveWhitelistAllAppIdArray, mPowerSaveWhitelistExceptIdleAppIdArray); } if (mLocalPowerManager != null) { if (DEBUG) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e95a9327cfb32..7857f5896fdcc 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1376,10 +1376,15 @@ public class ActivityManagerService extends IActivityManager.Stub DeviceIdleController.LocalService mLocalDeviceIdleController; /** - * Set of app ids that are whitelisted for device idle and thus background check. + * Power-save whitelisted app-ids (not including except-idle-whitelisted ones). */ int[] mDeviceIdleWhitelist = new int[0]; + /** + * Power-save whitelisted app-ids (including except-idle-whitelisted ones). + */ + int[] mDeviceIdleExceptIdleWhitelist = new int[0]; + /** * Set of app ids that are temporarily allowed to escape bg check due to high-pri message */ @@ -9316,7 +9321,7 @@ public class ActivityManagerService extends IActivityManager.Stub // If force-background-check is enabled, restrict all apps that aren't whitelisted. if (mForceBackgroundCheck && !UserHandle.isCore(uid) && - !isOnDeviceIdleWhitelistLocked(uid)) { + !isOnDeviceIdleWhitelistLocked(uid, /*allowExceptIdleToo=*/ true)) { if (DEBUG_BACKGROUND_CHECK) { Slog.i(TAG, "Force background check: " + uid + "/" + packageName + " restricted"); @@ -9354,7 +9359,7 @@ public class ActivityManagerService extends IActivityManager.Stub } // Is this app on the battery whitelist? - if (isOnDeviceIdleWhitelistLocked(uid)) { + if (isOnDeviceIdleWhitelistLocked(uid, /*allowExceptIdleToo=*/ false)) { if (DEBUG_BACKGROUND_CHECK) { Slog.i(TAG, "App " + uid + "/" + packageName + " on idle whitelist; not restricted in background"); @@ -9396,9 +9401,12 @@ public class ActivityManagerService extends IActivityManager.Stub ? appRestrictedInBackgroundLocked(uid, packageName, packageTargetSdk) : appServicesRestrictedInBackgroundLocked(uid, packageName, packageTargetSdk); - if (DEBUG_BACKGROUND_CHECK) Slog.d(TAG, "checkAllowBackground: uid=" + uid - + " pkg=" + packageName + " startMode=" + startMode - + " onwhitelist=" + isOnDeviceIdleWhitelistLocked(uid)); + if (DEBUG_BACKGROUND_CHECK) { + Slog.d(TAG, "checkAllowBackground: uid=" + uid + + " pkg=" + packageName + " startMode=" + startMode + + " onwhitelist=" + isOnDeviceIdleWhitelistLocked(uid, false) + + " onwhitelist(ei)=" + isOnDeviceIdleWhitelistLocked(uid, true)); + } if (startMode == ActivityManager.APP_START_MODE_DELAYED) { // This is an old app that has been forced into a "compatible as possible" // mode of background check. To increase compatibility, we will allow other @@ -9425,9 +9433,14 @@ public class ActivityManagerService extends IActivityManager.Stub /** * @return whether a UID is in the system, user or temp doze whitelist. */ - boolean isOnDeviceIdleWhitelistLocked(int uid) { + boolean isOnDeviceIdleWhitelistLocked(int uid, boolean allowExceptIdleToo) { final int appId = UserHandle.getAppId(uid); - return Arrays.binarySearch(mDeviceIdleWhitelist, appId) >= 0 + + final int[] whitelist = allowExceptIdleToo + ? mDeviceIdleExceptIdleWhitelist + : mDeviceIdleWhitelist; + + return Arrays.binarySearch(whitelist, appId) >= 0 || Arrays.binarySearch(mDeviceIdleTempWhitelist, appId) >= 0 || mPendingTempWhitelist.indexOfKey(uid) >= 0; } @@ -16969,6 +16982,8 @@ public class ActivityManagerService extends IActivityManager.Stub } } pw.println(" mDeviceIdleWhitelist=" + Arrays.toString(mDeviceIdleWhitelist)); + pw.println(" mDeviceIdleExceptIdleWhitelist=" + + Arrays.toString(mDeviceIdleExceptIdleWhitelist)); pw.println(" mDeviceIdleTempWhitelist=" + Arrays.toString(mDeviceIdleTempWhitelist)); if (mPendingTempWhitelist.size() > 0) { pw.println(" mPendingTempWhitelist:"); @@ -26421,9 +26436,10 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public void setDeviceIdleWhitelist(int[] appids) { + public void setDeviceIdleWhitelist(int[] allAppids, int[] exceptIdleAppids) { synchronized (ActivityManagerService.this) { - mDeviceIdleWhitelist = appids; + mDeviceIdleWhitelist = allAppids; + mDeviceIdleExceptIdleWhitelist = exceptIdleAppids; } }