diff options
| author | 2022-05-27 21:11:14 +0000 | |
|---|---|---|
| committer | 2022-05-27 21:11:14 +0000 | |
| commit | f7b82355bc567d15949ad11e5b3b58a2e252a9d1 (patch) | |
| tree | 7f08330fe9c7410a67f431833c914d9e2f211ed3 | |
| parent | 06057b122f215eeca6b0912eedfe74eab5148940 (diff) | |
| parent | 81ac10a9deb1b1020622f27116f668309865e742 (diff) | |
Merge "Defuse notification race around app stops" into tm-dev am: 81ac10a9de
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18624638
Change-Id: I6adc06db3eed43b4e9e3f58c1f34adb33d054304
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | services/core/java/com/android/server/am/ActiveServices.java | 14 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 7 |
2 files changed, 17 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index e9eebbf322bc..38d0e3051899 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -5183,7 +5183,7 @@ public final class ActiveServices { } boolean bringDownDisabledPackageServicesLocked(String packageName, Set<String> filterByClasses, - int userId, boolean evenPersistent, boolean doit) { + int userId, boolean evenPersistent, boolean fullStop, boolean doit) { boolean didSomething = false; if (mTmpCollectionResults != null) { @@ -5221,6 +5221,18 @@ public final class ActiveServices { if (size > 0) { mAm.updateOomAdjPendingTargetsLocked(OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE); } + if (fullStop && !mTmpCollectionResults.isEmpty()) { + // if we're tearing down the app's entire service state, account for possible + // races around FGS notifications by explicitly tidying up in a separate + // pass post-shutdown + final ArrayList<ServiceRecord> allServices = + (ArrayList<ServiceRecord>) mTmpCollectionResults.clone(); + mAm.mHandler.postDelayed(() -> { + for (int i = 0; i < allServices.size(); i++) { + allServices.get(i).cancelNotification(); + } + }, 250L); + } mTmpCollectionResults.clear(); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index ec928d563224..a2106f9326a0 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -4361,7 +4361,8 @@ public class ActivityManagerService extends IActivityManager.Stub // Clean-up disabled services. mServices.bringDownDisabledPackageServicesLocked( - packageName, disabledClasses, userId, false /* evenPersistent */, true /* doIt */); + packageName, disabledClasses, userId, false /* evenPersistent */, + false /* fullStop */, true /* doIt */); // Clean-up disabled providers. ArrayList<ContentProviderRecord> providers = new ArrayList<>(); @@ -4436,7 +4437,7 @@ public class ActivityManagerService extends IActivityManager.Stub } mServices.bringDownDisabledPackageServicesLocked( - packageName, null, userId, false, true); + packageName, null, userId, false, true, true); if (mBooted) { mAtmInternal.resumeTopActivities(true); @@ -4489,7 +4490,7 @@ public class ActivityManagerService extends IActivityManager.Stub } if (mServices.bringDownDisabledPackageServicesLocked( - packageName, null /* filterByClasses */, userId, evenPersistent, doit)) { + packageName, null /* filterByClasses */, userId, evenPersistent, true, doit)) { if (!doit) { return true; } |