summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java14
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java12
2 files changed, 21 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index 8368b4dfe070..9840e0ff90ce 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -190,6 +190,7 @@ import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate;
public final class ActiveServices {
@@ -220,6 +221,11 @@ public final class ActiveServices {
| ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
| ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION;
+ // Keep track of number of foreground services and number of apps that have foreground
+ // services in the device. This field is made to be directly accessed without holding AMS lock.
+ static final AtomicReference<Pair<Integer, Integer>> sNumForegroundServices =
+ new AtomicReference(new Pair<>(0, 0));
+
// Foreground service is stopped for unknown reason.
static final int FGS_STOP_REASON_UNKNOWN = 0;
// Foreground service is stopped by app calling Service.stopForeground().
@@ -454,6 +460,7 @@ public final class ActiveServices {
final ArrayList<ServiceRecord> mStartingBackground = new ArrayList<>();
final ArrayMap<String, ActiveForegroundApp> mActiveForegroundApps = new ArrayMap<>();
+
boolean mActiveForegroundAppsChanged;
static final int MSG_BG_START_TIMEOUT = 1;
@@ -2025,6 +2032,7 @@ public final class ActiveServices {
logFGSStateChangeLocked(r,
FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER,
0, FGS_STOP_REASON_UNKNOWN);
+ updateNumForegroundServicesLocked();
}
// Even if the service is already a FGS, we need to update the notification,
// so we need to call it again.
@@ -2116,6 +2124,7 @@ public final class ActiveServices {
mAm.updateLruProcessLocked(r.app, false, null);
updateServiceForegroundLocked(r.app.mServices, true);
}
+ updateNumForegroundServicesLocked();
}
}
}
@@ -4784,6 +4793,7 @@ public final class ActiveServices {
}
smap.ensureNotStartingBackgroundLocked(r);
+ updateNumForegroundServicesLocked();
}
private void dropFgsNotificationStateLocked(ServiceRecord r) {
@@ -6975,6 +6985,10 @@ public final class ActiveServices {
fgsStopReasonToString(fgsStopReason));
}
+ private void updateNumForegroundServicesLocked() {
+ sNumForegroundServices.set(mAm.mProcessList.getNumForegroundServices());
+ }
+
boolean canAllowWhileInUsePermissionInFgsLocked(int callingPid, int callingUid,
String callingPackage) {
return shouldAllowFgsWhileInUsePermissionLocked(callingPackage, callingPid, callingUid,
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 720b76fdf4d8..ee36a59583a3 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -814,12 +814,14 @@ public final class ProcessList {
< LmkdStatsReporter.KILL_OCCURRED_MSG_SIZE) {
return false;
}
- Pair<Integer, Integer> temp = getNumForegroundServices();
- final int totalForegroundServices = temp.first;
- final int procsWithForegroundServices = temp.second;
+ // Note: directly access
+ // ActiveServices.sNumForegroundServices, do not try to
+ // hold AMS lock here, otherwise it is a potential deadlock.
+ Pair<Integer, Integer> foregroundServices =
+ ActiveServices.sNumForegroundServices.get();
LmkdStatsReporter.logKillOccurred(inputData,
- totalForegroundServices,
- procsWithForegroundServices);
+ foregroundServices.first,
+ foregroundServices.second);
return true;
case LMK_STATE_CHANGED:
if (receivedLen