summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2022-05-27 21:11:14 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2022-05-27 21:11:14 +0000
commitf7b82355bc567d15949ad11e5b3b58a2e252a9d1 (patch)
tree7f08330fe9c7410a67f431833c914d9e2f211ed3
parent06057b122f215eeca6b0912eedfe74eab5148940 (diff)
parent81ac10a9deb1b1020622f27116f668309865e742 (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.java14
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java7
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;
}