From 60e5470d35e0459cfbf60eed321312e8357bc8fe Mon Sep 17 00:00:00 2001 From: Jing Ji Date: Mon, 6 Jun 2022 15:50:30 -0700 Subject: [PATCH] Add field to note if a process has a foreground service ..into ProcessMemorySnapshot and AppProcessDied Bug: 234618899 Test: statsd_testdrive 10064 Test: statsd_testdrive 373 Test: atest CtsStatsdAtomHostTestCases:ProcessMemoryStatsTests Test: atest CtsAppExitTestCases Change-Id: I1dc3e4ac54d0e46195b508a3e53e287192b3adc9 --- .../java/android/app/ApplicationExitInfo.java | 27 +++++++++++++++++++ core/java/android/app/ProcessMemoryState.java | 7 ++++- .../com/android/server/am/ActiveServices.java | 1 + .../server/am/ActivityManagerService.java | 3 ++- .../android/server/am/AppExitInfoTracker.java | 4 ++- .../server/am/ProcessServiceRecord.java | 13 +++++++++ .../stats/pull/StatsPullAtomService.java | 4 +-- 7 files changed, 54 insertions(+), 5 deletions(-) diff --git a/core/java/android/app/ApplicationExitInfo.java b/core/java/android/app/ApplicationExitInfo.java index 9bdddd037e21b..a8d8c75601aac 100644 --- a/core/java/android/app/ApplicationExitInfo.java +++ b/core/java/android/app/ApplicationExitInfo.java @@ -524,6 +524,13 @@ public final class ApplicationExitInfo implements Parcelable { */ private boolean mLoggedInStatsd; + /** + * Whether or not this process hosts one or more foreground services. + * + * for system internal use only, will not retain across processes. + */ + private boolean mHasForegroundServices; + /** @hide */ @IntDef(prefix = { "REASON_" }, value = { REASON_UNKNOWN, @@ -996,6 +1003,24 @@ public final class ApplicationExitInfo implements Parcelable { mLoggedInStatsd = loggedInStatsd; } + /** + * @see #mHasForegroundServices + * + * @hide + */ + public boolean hasForegroundServices() { + return mHasForegroundServices; + } + + /** + * @see #mHasForegroundServices + * + * @hide + */ + public void setHasForegroundServices(boolean hasForegroundServices) { + mHasForegroundServices = hasForegroundServices; + } + @Override public int describeContents() { return 0; @@ -1060,6 +1085,8 @@ public final class ApplicationExitInfo implements Parcelable { mTraceFile = other.mTraceFile; mAppTraceRetriever = other.mAppTraceRetriever; mNativeTombstoneRetriever = other.mNativeTombstoneRetriever; + mLoggedInStatsd = other.mLoggedInStatsd; + mHasForegroundServices = other.mHasForegroundServices; } private ApplicationExitInfo(@NonNull Parcel in) { diff --git a/core/java/android/app/ProcessMemoryState.java b/core/java/android/app/ProcessMemoryState.java index 24914a6af557b..2c58603ecdb91 100644 --- a/core/java/android/app/ProcessMemoryState.java +++ b/core/java/android/app/ProcessMemoryState.java @@ -28,12 +28,15 @@ public final class ProcessMemoryState implements Parcelable { public final int pid; public final String processName; public final int oomScore; + public final boolean hasForegroundServices; - public ProcessMemoryState(int uid, int pid, String processName, int oomScore) { + public ProcessMemoryState(int uid, int pid, String processName, int oomScore, + boolean hasForegroundServices) { this.uid = uid; this.pid = pid; this.processName = processName; this.oomScore = oomScore; + this.hasForegroundServices = hasForegroundServices; } private ProcessMemoryState(Parcel in) { @@ -41,6 +44,7 @@ public final class ProcessMemoryState implements Parcelable { pid = in.readInt(); processName = in.readString(); oomScore = in.readInt(); + hasForegroundServices = in.readInt() == 1; } public static final @android.annotation.NonNull Creator CREATOR = new Creator() { @@ -66,5 +70,6 @@ public final class ProcessMemoryState implements Parcelable { parcel.writeInt(pid); parcel.writeString(processName); parcel.writeInt(oomScore); + parcel.writeInt(hasForegroundServices ? 1 : 0); } } diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 5026f318e441d..a4eaef98235dc 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -2654,6 +2654,7 @@ public final class ActiveServices { } } mAm.updateProcessForegroundLocked(psr.mApp, anyForeground, fgServiceTypes, oomAdj); + psr.setHasReportedForegroundServices(anyForeground); } private void updateAllowlistManagerLocked(ProcessServiceRecord psr) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 71682f26e6647..71a28487a763e 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -16683,7 +16683,8 @@ public class ActivityManagerService extends IActivityManager.Stub for (int i = 0, size = mPidsSelfLocked.size(); i < size; i++) { final ProcessRecord r = mPidsSelfLocked.valueAt(i); processMemoryStates.add(new ProcessMemoryState( - r.uid, r.getPid(), r.processName, r.mState.getCurAdj())); + r.uid, r.getPid(), r.processName, r.mState.getCurAdj(), + r.mServices.hasForegroundServices())); } } return processMemoryStates; diff --git a/services/core/java/com/android/server/am/AppExitInfoTracker.java b/services/core/java/com/android/server/am/AppExitInfoTracker.java index d84c1fcd54fb4..32d20718c1920 100644 --- a/services/core/java/com/android/server/am/AppExitInfoTracker.java +++ b/services/core/java/com/android/server/am/AppExitInfoTracker.java @@ -893,7 +893,8 @@ public final class AppExitInfoTracker { } FrameworkStatsLog.write(FrameworkStatsLog.APP_PROCESS_DIED, info.getPackageUid(), processName, info.getReason(), info.getSubReason(), - info.getImportance(), (int) info.getPss(), (int) info.getRss()); + info.getImportance(), (int) info.getPss(), (int) info.getRss(), + info.hasForegroundServices()); } @GuardedBy("mLock") @@ -1008,6 +1009,7 @@ public final class AppExitInfoTracker { info.setPss(app.mProfile.getLastPss()); info.setRss(app.mProfile.getLastRss()); info.setTimestamp(timestamp); + info.setHasForegroundServices(app.mServices.hasReportedForegroundServices()); } return info; diff --git a/services/core/java/com/android/server/am/ProcessServiceRecord.java b/services/core/java/com/android/server/am/ProcessServiceRecord.java index 486c8ed725e18..9951e983a752a 100644 --- a/services/core/java/com/android/server/am/ProcessServiceRecord.java +++ b/services/core/java/com/android/server/am/ProcessServiceRecord.java @@ -45,6 +45,11 @@ final class ProcessServiceRecord { */ private boolean mHasForegroundServices; + /** + * Last reported state of whether it's running any services that are foreground. + */ + private boolean mRepHasForegroundServices; + /** * Running any services that are almost perceptible (started with * {@link Context#BIND_ALMOST_PERCEPTIBLE} while the app was on TOP)? @@ -155,6 +160,14 @@ final class ProcessServiceRecord { return mHasForegroundServices; } + void setHasReportedForegroundServices(boolean hasForegroundServices) { + mRepHasForegroundServices = hasForegroundServices; + } + + boolean hasReportedForegroundServices() { + return mRepHasForegroundServices; + } + int getForegroundServiceTypes() { return mHasForegroundServices ? mFgServiceTypes : 0; } diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 06646d30eb7bf..b4b8cf9a9eabb 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -2269,7 +2269,7 @@ public class StatsPullAtomService extends SystemService { managedProcess.processName, managedProcess.pid, managedProcess.oomScore, snapshot.rssInKilobytes, snapshot.anonRssInKilobytes, snapshot.swapInKilobytes, snapshot.anonRssInKilobytes + snapshot.swapInKilobytes, - gpuMemPerPid.get(managedProcess.pid))); + gpuMemPerPid.get(managedProcess.pid), managedProcess.hasForegroundServices)); } // Complement the data with native system processes. Given these measurements can be taken // in response to LMKs happening, we want to first collect the managed app stats (to @@ -2288,7 +2288,7 @@ public class StatsPullAtomService extends SystemService { -1001 /*Placeholder for native processes, OOM_SCORE_ADJ_MIN - 1.*/, snapshot.rssInKilobytes, snapshot.anonRssInKilobytes, snapshot.swapInKilobytes, snapshot.anonRssInKilobytes + snapshot.swapInKilobytes, - gpuMemPerPid.get(pid))); + gpuMemPerPid.get(pid), false /* has_foreground_services */)); } return StatsManager.PULL_SUCCESS; }