diff --git a/api/current.txt b/api/current.txt index 52b4741c7eecf..557d5365a92c0 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 cf50b1a1d6e79..6ea5612524039 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. */ @@ -14960,6 +14962,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)) {