Merge "Another way to keep track number of foreground services in the device." into tm-qpr-dev

This commit is contained in:
TreeHugger Robot
2022-09-02 17:57:08 +00:00
committed by Android (Google) Code Review
2 changed files with 21 additions and 5 deletions

View File

@@ -190,6 +190,7 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Predicate; import java.util.function.Predicate;
public final class ActiveServices { public final class ActiveServices {
@@ -220,6 +221,11 @@ public final class ActiveServices {
| ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE | ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
| ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION; | 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. // Foreground service is stopped for unknown reason.
static final int FGS_STOP_REASON_UNKNOWN = 0; static final int FGS_STOP_REASON_UNKNOWN = 0;
// Foreground service is stopped by app calling Service.stopForeground(). // Foreground service is stopped by app calling Service.stopForeground().
@@ -454,6 +460,7 @@ public final class ActiveServices {
final ArrayList<ServiceRecord> mStartingBackground = new ArrayList<>(); final ArrayList<ServiceRecord> mStartingBackground = new ArrayList<>();
final ArrayMap<String, ActiveForegroundApp> mActiveForegroundApps = new ArrayMap<>(); final ArrayMap<String, ActiveForegroundApp> mActiveForegroundApps = new ArrayMap<>();
boolean mActiveForegroundAppsChanged; boolean mActiveForegroundAppsChanged;
static final int MSG_BG_START_TIMEOUT = 1; static final int MSG_BG_START_TIMEOUT = 1;
@@ -2025,6 +2032,7 @@ public final class ActiveServices {
logFGSStateChangeLocked(r, logFGSStateChangeLocked(r,
FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER, FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER,
0, FGS_STOP_REASON_UNKNOWN); 0, FGS_STOP_REASON_UNKNOWN);
updateNumForegroundServicesLocked();
} }
// Even if the service is already a FGS, we need to update the notification, // Even if the service is already a FGS, we need to update the notification,
// so we need to call it again. // so we need to call it again.
@@ -2116,6 +2124,7 @@ public final class ActiveServices {
mAm.updateLruProcessLocked(r.app, false, null); mAm.updateLruProcessLocked(r.app, false, null);
updateServiceForegroundLocked(r.app.mServices, true); updateServiceForegroundLocked(r.app.mServices, true);
} }
updateNumForegroundServicesLocked();
} }
} }
} }
@@ -4784,6 +4793,7 @@ public final class ActiveServices {
} }
smap.ensureNotStartingBackgroundLocked(r); smap.ensureNotStartingBackgroundLocked(r);
updateNumForegroundServicesLocked();
} }
private void dropFgsNotificationStateLocked(ServiceRecord r) { private void dropFgsNotificationStateLocked(ServiceRecord r) {
@@ -6975,6 +6985,10 @@ public final class ActiveServices {
fgsStopReasonToString(fgsStopReason)); fgsStopReasonToString(fgsStopReason));
} }
private void updateNumForegroundServicesLocked() {
sNumForegroundServices.set(mAm.mProcessList.getNumForegroundServices());
}
boolean canAllowWhileInUsePermissionInFgsLocked(int callingPid, int callingUid, boolean canAllowWhileInUsePermissionInFgsLocked(int callingPid, int callingUid,
String callingPackage) { String callingPackage) {
return shouldAllowFgsWhileInUsePermissionLocked(callingPackage, callingPid, callingUid, return shouldAllowFgsWhileInUsePermissionLocked(callingPackage, callingPid, callingUid,

View File

@@ -814,12 +814,14 @@ public final class ProcessList {
< LmkdStatsReporter.KILL_OCCURRED_MSG_SIZE) { < LmkdStatsReporter.KILL_OCCURRED_MSG_SIZE) {
return false; return false;
} }
Pair<Integer, Integer> temp = getNumForegroundServices(); // Note: directly access
final int totalForegroundServices = temp.first; // ActiveServices.sNumForegroundServices, do not try to
final int procsWithForegroundServices = temp.second; // hold AMS lock here, otherwise it is a potential deadlock.
Pair<Integer, Integer> foregroundServices =
ActiveServices.sNumForegroundServices.get();
LmkdStatsReporter.logKillOccurred(inputData, LmkdStatsReporter.logKillOccurred(inputData,
totalForegroundServices, foregroundServices.first,
procsWithForegroundServices); foregroundServices.second);
return true; return true;
case LMK_STATE_CHANGED: case LMK_STATE_CHANGED:
if (receivedLen if (receivedLen