Merge "Allow except-idle whitelisted apps to start BG services in EBS" into pi-dev

This commit is contained in:
Makoto Onuki
2018-06-05 01:29:48 +00:00
committed by Android (Google) Code Review
3 changed files with 31 additions and 17 deletions

View File

@@ -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.

View File

@@ -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) {

View File

@@ -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;
}
}