From c8e4fad8623c27667b7078722e071e336020dc3a Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 4 May 2018 11:31:09 -0700 Subject: [PATCH] Make android:cantSaveState an optional feature. This doesn't make sense on things like watches and appliances, so make this an optional feature that the device must enable. If the feature is not set, then the system will ignore the app's request. Bug: 76213401 Test: atest CtsAppTestCases:ActivityManagerProcessStateTest Change-Id: I91abf9d86ec14fa632e3bcc83c4a3febade5d2e4 --- api/current.txt | 1 + core/java/android/content/pm/PackageManager.java | 7 +++++++ .../java/com/android/server/am/ActivityManagerService.java | 4 ++++ .../com/android/server/am/ActivityStackSupervisor.java | 3 ++- .../core/java/com/android/server/am/ActivityStarter.java | 3 ++- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/api/current.txt b/api/current.txt index 8703bf41438b1..2a99b5fa7de1e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11274,6 +11274,7 @@ package android.content.pm { field public static final java.lang.String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash"; field public static final java.lang.String FEATURE_CAMERA_FRONT = "android.hardware.camera.front"; field public static final java.lang.String FEATURE_CAMERA_LEVEL_FULL = "android.hardware.camera.level.full"; + field public static final java.lang.String FEATURE_CANT_SAVE_STATE = "android.software.cant_save_state"; field public static final java.lang.String FEATURE_COMPANION_DEVICE_SETUP = "android.software.companion_device_setup"; field public static final java.lang.String FEATURE_CONNECTION_SERVICE = "android.software.connectionservice"; field public static final java.lang.String FEATURE_CONSUMER_IR = "android.hardware.consumerir"; diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 1d497c2fef6e8..34ac9ae6f0f3f 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2281,6 +2281,13 @@ public abstract class PackageManager { */ @SdkConstant(SdkConstantType.FEATURE) public static final String FEATURE_APP_WIDGETS = "android.software.app_widgets"; + /** + * Feature for {@link #getSystemAvailableFeatures} and + * {@link #hasSystemFeature}: The device supports the + * {@link android.R.attr#cantSaveState} API. + */ + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_CANT_SAVE_STATE = "android.software.cant_save_state"; /** * @hide diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a8e63f6695d46..1f00c7d4cf266 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1970,6 +1970,8 @@ public class ActivityManagerService extends IActivityManager.Stub final boolean mPermissionReviewRequired; + boolean mHasHeavyWeightFeature; + /** * Whether to force background check on all apps (for battery saver) or not. */ @@ -15085,6 +15087,8 @@ public class ActivityManagerService extends IActivityManager.Stub return; } + mHasHeavyWeightFeature = mContext.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_CANT_SAVE_STATE); mLocalDeviceIdleController = LocalServices.getService(DeviceIdleController.LocalService.class); mAssistUtils = new AssistUtils(mContext); diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 4ace68947957c..a5dfd8c6c6bde 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1526,7 +1526,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D mService.getLifecycleManager().scheduleTransaction(clientTransaction); - if ((app.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) { + if ((app.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0 + && mService.mHasHeavyWeightFeature) { // This may be a heavy-weight process! Note that the package // manager will ensure that only activity can run in the main // process of the .apk, which is the only thing that will be diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index fb4107cfd221f..3b18d3258237c 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -1023,7 +1023,8 @@ class ActivityStarter { if (aInfo != null && (aInfo.applicationInfo.privateFlags - & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) { + & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0 && + mService.mHasHeavyWeightFeature) { // This may be a heavy-weight process! Check to see if we already // have another, different heavy-weight process running. if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {