From 240bea3f476cde215948f00e41c5ee5db4e762f0 Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Fri, 1 May 2020 05:13:51 -0700 Subject: [PATCH 1/3] ActivityManager API to check availability of app freezer A method to verify the availability of the app freezer is required for configuration code running in places like the Settings app Bug: 155465196 Change-Id: I5779d263536091689a099eec0815f207dfbbf6ad Test: verified its workings through the developer options CL --- core/java/android/app/IActivityManager.aidl | 5 +++++ .../com/android/server/am/ActivityManagerService.java | 11 +++++++++++ .../com/android/server/am/CachedAppOptimizer.java | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 833bfed573b2d..496ad0c99dfe6 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -673,4 +673,9 @@ interface IActivityManager { * @param state The customized state data */ void setProcessStateSummary(in byte[] state); + + /** + * Return whether the app freezer is supported (true) or not (false) by this system. + */ + boolean isAppFreezerSupported(); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 0bd134c8dfaca..edf986a763ec6 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -20171,4 +20171,15 @@ public class ActivityManagerService extends IActivityManager.Stub mUsageStatsService.reportLocusUpdate(activity, userId, locusId, appToken); } } + + @Override + public boolean isAppFreezerSupported() { + final long token = Binder.clearCallingIdentity(); + + try { + return mOomAdjuster.mCachedAppOptimizer.isFreezerSupported(); + } finally { + Binder.restoreCallingIdentity(token); + } + } } diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 86d9028f53dca..35d2653483b95 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -407,7 +407,7 @@ public final class CachedAppOptimizer { /** * Determines whether the freezer is correctly supported by this system */ - public boolean isFreezerSupported() { + public static boolean isFreezerSupported() { boolean supported = false; FileReader fr = null; From 74f01594251d424ea85fbcd1c773491aa086c63c Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Fri, 1 May 2020 05:19:10 -0700 Subject: [PATCH 2/3] Settings option to enable/disable the app freezer The new setting option allows for a local configuration to override the Device Config flag. Device Config and experiments will be honored by default. Bug: 155465196 Change-Id: I978a7b6bd75d9daab3fafed58b7f3c6417e0adab Test: the option is correctly read and written by the companion CLs --- core/java/android/provider/Settings.java | 8 ++++++++ core/proto/android/providers/settings/global.proto | 3 ++- .../providers/settings/SettingsProtoDumpUtil.java | 3 +++ .../test/src/android/provider/SettingsBackupTest.java | 3 ++- .../java/com/android/server/am/CachedAppOptimizer.java | 9 ++++++++- 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index b280c5d63cd7a..9a9485325e753 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -14024,6 +14024,14 @@ public final class Settings { public static final String ZRAM_ENABLED = "zram_enabled"; + /** + * Whether the app freezer is enabled on this device. + * The value of "enabled" enables the app freezer, "disabled" disables it and + * "device_default" will let the system decide whether to enable the freezer or not + * @hide + */ + public static final String CACHED_APPS_FREEZER_ENABLED = "cached_apps_freezer"; + /** * Configuration flags for smart replies in notifications. * This is encoded as a key=value list, separated by commas. Ex: diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index d5384a1c2fdd1..762895b6320fb 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -169,6 +169,7 @@ message GlobalSettingsProto { optional SettingProto boot_count = 22 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto bugreport_in_power_menu = 23 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto cached_apps_freezer_enabled = 152 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto call_auto_retry = 24 [ (android.privacy).dest = DEST_AUTOMATIC ]; message CaptivePortal { @@ -1059,5 +1060,5 @@ message GlobalSettingsProto { // Please insert fields in alphabetical order and group them into messages // if possible (to avoid reaching the method limit). - // Next tag = 152; + // Next tag = 153; } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index a5dce6da348f0..3d7559b2c1a6d 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -375,6 +375,9 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Global.BUGREPORT_IN_POWER_MENU, GlobalSettingsProto.BUGREPORT_IN_POWER_MENU); + dumpSetting(s, p, + Settings.Global.CACHED_APPS_FREEZER_ENABLED, + GlobalSettingsProto.CACHED_APPS_FREEZER_ENABLED); dumpSetting(s, p, Settings.Global.CALL_AUTO_RETRY, GlobalSettingsProto.CALL_AUTO_RETRY); diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index f5589d713bf72..6c9380739456a 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -586,7 +586,8 @@ public class SettingsBackupTest { Settings.Global.POWER_BUTTON_LONG_PRESS, Settings.Global.POWER_BUTTON_VERY_LONG_PRESS, Settings.Global.INTEGRITY_CHECK_INCLUDES_RULE_PROVIDER, - Settings.Global.ADVANCED_BATTERY_USAGE_AMOUNT); + Settings.Global.ADVANCED_BATTERY_USAGE_AMOUNT, + Settings.Global.CACHED_APPS_FREEZER_ENABLED); private static final Set BACKUP_BLACKLISTED_SECURE_SETTINGS = newHashSet( diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 35d2653483b95..f9d204fa008e2 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -33,6 +33,7 @@ import android.os.Trace; import android.provider.DeviceConfig; import android.provider.DeviceConfig.OnPropertiesChangedListener; import android.provider.DeviceConfig.Properties; +import android.provider.Settings; import android.text.TextUtils; import android.util.EventLog; import android.util.Slog; @@ -443,7 +444,13 @@ public final class CachedAppOptimizer { */ @GuardedBy("mPhenotypeFlagLock") private void updateUseFreezer() { - if (DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, + final String configOverride = Settings.Global.getString(mAm.mContext.getContentResolver(), + Settings.Global.CACHED_APPS_FREEZER_ENABLED); + + if ("disabled".equals(configOverride)) { + mUseFreezer = false; + } else if ("enabled".equals(configOverride) + || DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, KEY_USE_FREEZER, DEFAULT_USE_FREEZER)) { mUseFreezer = isFreezerSupported(); } From 6623918e2f7645dc09d5217ab74c14dcb5c54a2f Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Fri, 1 May 2020 05:32:59 -0700 Subject: [PATCH 3/3] Resources and strings for freezer settings Resources to be visualized in the developer settings section related to the app freezer. Bug: 155465196 Change-Id: I47ab84b248911ce66422ac3a50a5be77711a6d4f Test: visually checked resource rendering on a flame with R --- packages/SettingsLib/res/values/arrays.xml | 14 ++++++++++++++ packages/SettingsLib/res/values/strings.xml | 8 ++++++++ 2 files changed, 22 insertions(+) diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml index 7b58937049d1a..d59d698efba20 100644 --- a/packages/SettingsLib/res/values/arrays.xml +++ b/packages/SettingsLib/res/values/arrays.xml @@ -633,4 +633,18 @@ @color/bt_color_bg_7 + + + @string/cached_apps_freezer_device_default + @string/cached_apps_freezer_enabled + @string/cached_apps_freezer_disabled + + + + + device_default + enabled + disabled + + diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 7ca0e809143a1..934f61091bcc2 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1365,4 +1365,12 @@ Guest + + Device default + + Disabled + + Enabled + + Your device must be rebooted for this change to apply. Reboot now or cancel.