From 40133ebc95b8a05938a85e012ab1faf37e545383 Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Wed, 9 Feb 2022 00:32:57 -0800 Subject: [PATCH] Add a device config to support config for bg restriction exemption So the exempted packages could be configured via device config update. Bug: 203105544 Test: Manual - Update the device config and check the dumpsys. Test: atest FrameworksMockingServicesTests:BackgroundRestrictionTest Change-Id: I147e899e52f44da0bb98162970879b4ff9345020 --- .../server/am/AppRestrictionController.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java index 376709c42ddec..1129c19bce873 100644 --- a/services/core/java/com/android/server/am/AppRestrictionController.java +++ b/services/core/java/com/android/server/am/AppRestrictionController.java @@ -69,6 +69,7 @@ import static android.os.PowerExemptionManager.REASON_ROLE_EMERGENCY; import static android.os.PowerExemptionManager.REASON_SYSTEM_ALLOW_LISTED; import static android.os.PowerExemptionManager.REASON_SYSTEM_MODULE; import static android.os.PowerExemptionManager.REASON_SYSTEM_UID; +import static android.os.PowerExemptionManager.reasonCodeToString; import static android.os.Process.SYSTEM_UID; import static com.android.internal.notification.SystemNotificationChannels.ABUSIVE_BACKGROUND_APPS; @@ -157,6 +158,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.Consumer; @@ -329,6 +331,8 @@ public final class AppRestrictionController { } } } + pw.print(" effectiveExemption="); + pw.print(reasonCodeToString(getBackgroundRestrictionExemptionReason(mUid))); } String getPackageName() { @@ -555,6 +559,12 @@ public final class AppRestrictionController { static final String KEY_BG_PROMPT_FGS_WITH_NOTIFICATION_TO_BG_RESTRICTED = DEVICE_CONFIG_SUBNAMESPACE_PREFIX + "prompt_fgs_with_noti_to_bg_restricted"; + /** + * The list of packages to be exempted from all these background restrictions. + */ + static final String KEY_BG_RESTRICTION_EXEMPTED_PACKAGES = + DEVICE_CONFIG_SUBNAMESPACE_PREFIX + "restriction_exempted_packages"; + static final boolean DEFAULT_BG_AUTO_RESTRICTED_BUCKET_ON_BG_RESTRICTION = false; static final long DEFAULT_BG_ABUSIVE_NOTIFICATION_MINIMAL_INTERVAL_MS = 24 * 60 * 60 * 1000; @@ -569,6 +579,13 @@ public final class AppRestrictionController { volatile long mBgNotificationMinIntervalMs; + /** + * @see #KEY_BG_RESTRICTION_EXEMPTED_PACKAGES. + * + *

Mutations on them would result in copy-on-write.

+ */ + volatile Set mBgRestrictionExemptedPackages = Collections.emptySet(); + /** * @see #KEY_BG_PROMPT_FGS_WITH_NOTIFICATION_TO_BG_RESTRICTED. */ @@ -596,6 +613,9 @@ public final class AppRestrictionController { case KEY_BG_PROMPT_FGS_WITH_NOTIFICATION_TO_BG_RESTRICTED: updateBgPromptFgsWithNotiToBgRestricted(); break; + case KEY_BG_RESTRICTION_EXEMPTED_PACKAGES: + updateBgRestrictionExemptedPackages(); + break; } AppRestrictionController.this.onPropertiesChanged(name); } @@ -628,6 +648,7 @@ public final class AppRestrictionController { updateBgAutoRestrictedBucketChanged(); updateBgAbusiveNotificationMinimalInterval(); updateBgPromptFgsWithNotiToBgRestricted(); + updateBgRestrictionExemptedPackages(); } private void updateBgAutoRestrictedBucketChanged() { @@ -655,6 +676,23 @@ public final class AppRestrictionController { mDefaultBgPromptFgsWithNotiToBgRestricted); } + private void updateBgRestrictionExemptedPackages() { + final String settings = DeviceConfig.getString( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_BG_RESTRICTION_EXEMPTED_PACKAGES, + null); + if (settings == null) { + mBgRestrictionExemptedPackages = Collections.emptySet(); + return; + } + final String[] settingsList = settings.split(","); + final ArraySet packages = new ArraySet<>(); + for (String pkg : settingsList) { + packages.add(pkg); + } + mBgRestrictionExemptedPackages = Collections.unmodifiableSet(packages); + } + void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.println("BACKGROUND RESTRICTION POLICY SETTINGS:"); @@ -672,6 +710,10 @@ public final class AppRestrictionController { pw.print(KEY_BG_PROMPT_FGS_WITH_NOTIFICATION_TO_BG_RESTRICTED); pw.print('='); pw.println(mBgPromptFgsWithNotiToBgRestricted); + pw.print(prefix); + pw.print(KEY_BG_RESTRICTION_EXEMPTED_PACKAGES); + pw.print('='); + pw.println(mBgRestrictionExemptedPackages.toString()); } } @@ -1727,6 +1769,8 @@ public final class AppRestrictionController { return REASON_CARRIER_PRIVILEGED_APP; } else if (isExemptedFromSysConfig(pkg)) { return REASON_SYSTEM_ALLOW_LISTED; + } else if (mConstantsObserver.mBgRestrictionExemptedPackages.contains(pkg)) { + return REASON_ALLOWLISTED_PACKAGE; } } }