summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/Watchdog.java2
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java49
-rw-r--r--services/core/java/com/android/server/am/AppProfiler.java3
-rw-r--r--services/core/java/com/android/server/am/ProcessErrorStateRecord.java7
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java2
5 files changed, 51 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index 62651dd80cd9..a81bba816b4c 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -935,7 +935,7 @@ public class Watchdog implements Dumpable {
mActivity.addErrorToDropBox(
dropboxTag, null, "system_server", null, null, null,
null, report.toString(), stack, null, null, null,
- errorId);
+ errorId, null);
}
}
};
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index aadb416f55f2..7ca70b2fa383 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2112,6 +2112,34 @@ public class ActivityManagerService extends IActivityManager.Stub
mVoiceInteractionManagerProvider = provider;
}
+ /**
+ * Represents volatile states associated with a Dropbox entry.
+ * <p>
+ * These states, such as the process frozen state, can change quickly over time and thus
+ * should be captured as soon as possible to ensure accurate state. If a state is undefined,
+ * it means that the state was not read early and a fallback value can be used.
+ * </p>
+ */
+ static class VolatileDropboxEntryStates {
+ private final Boolean mIsProcessFrozen;
+
+ private VolatileDropboxEntryStates(Boolean frozenState) {
+ this.mIsProcessFrozen = frozenState;
+ }
+
+ public static VolatileDropboxEntryStates withProcessFrozenState(boolean frozenState) {
+ return new VolatileDropboxEntryStates(frozenState);
+ }
+
+ public static VolatileDropboxEntryStates emptyVolatileDropboxEnytyStates() {
+ return new VolatileDropboxEntryStates(null);
+ }
+
+ public Boolean isProcessFrozen() {
+ return mIsProcessFrozen;
+ }
+ }
+
static class MemBinder extends Binder {
ActivityManagerService mActivityManagerService;
private final PriorityDump.PriorityDumper mPriorityDumper =
@@ -8888,7 +8916,7 @@ public class ActivityManagerService extends IActivityManager.Stub
addErrorToDropBox(
eventType, r, processName, null, null, null, null, null, null, crashInfo,
- new Float(loadingProgress), incrementalMetrics, null);
+ new Float(loadingProgress), incrementalMetrics, null, null);
// For GWP-ASan recoverable crashes, don't make the app crash (the whole point of
// 'recoverable' is that the app doesn't crash). Normally, for nonrecoreable native crashes,
@@ -8997,7 +9025,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final StringBuilder sb = new StringBuilder(1024);
synchronized (sb) {
- appendDropBoxProcessHeaders(process, processName, sb);
+ appendDropBoxProcessHeaders(process, processName, null, sb);
sb.append("Build: ").append(Build.FINGERPRINT).append("\n");
sb.append("System-App: ").append(isSystemApp).append("\n");
sb.append("Uptime-Millis: ").append(info.violationUptimeMillis).append("\n");
@@ -9100,7 +9128,7 @@ public class ActivityManagerService extends IActivityManager.Stub
callingPid, (r != null) ? r.getProcessClassEnum() : 0);
addErrorToDropBox("wtf", r, processName, null, null, null, tag, null, null, crashInfo,
- null, null, null);
+ null, null, null, null);
return r;
}
@@ -9125,7 +9153,7 @@ public class ActivityManagerService extends IActivityManager.Stub
for (Pair<String, ApplicationErrorReport.CrashInfo> p = list.poll();
p != null; p = list.poll()) {
addErrorToDropBox("wtf", proc, "system_server", null, null, null, p.first, null, null,
- p.second, null, null, null);
+ p.second, null, null, null, null);
}
}
@@ -9148,7 +9176,7 @@ public class ActivityManagerService extends IActivityManager.Stub
* to append various headers to the dropbox log text.
*/
void appendDropBoxProcessHeaders(ProcessRecord process, String processName,
- final StringBuilder sb) {
+ final VolatileDropboxEntryStates volatileStates, final StringBuilder sb) {
// Watchdog thread ends up invoking this function (with
// a null ProcessRecord) to add the stack file to dropbox.
// Do not acquire a lock on this (am) in such cases, as it
@@ -9167,7 +9195,12 @@ public class ActivityManagerService extends IActivityManager.Stub
sb.append("PID: ").append(process.getPid()).append("\n");
sb.append("UID: ").append(process.uid).append("\n");
if (process.mOptRecord != null) {
- sb.append("Frozen: ").append(process.mOptRecord.isFrozen()).append("\n");
+ // Use 'isProcessFrozen' from 'volatileStates' if it'snon-null (present),
+ // otherwise use 'isFrozen' from 'mOptRecord'.
+ sb.append("Frozen: ").append(
+ (volatileStates != null && volatileStates.isProcessFrozen() != null)
+ ? volatileStates.isProcessFrozen() : process.mOptRecord.isFrozen()
+ ).append("\n");
}
int flags = process.info.flags;
final IPackageManager pm = AppGlobals.getPackageManager();
@@ -9275,7 +9308,7 @@ public class ActivityManagerService extends IActivityManager.Stub
String subject, final String report, final File dataFile,
final ApplicationErrorReport.CrashInfo crashInfo,
@Nullable Float loadingProgress, @Nullable IncrementalMetrics incrementalMetrics,
- @Nullable UUID errorId) {
+ @Nullable UUID errorId, @Nullable VolatileDropboxEntryStates volatileStates) {
// NOTE -- this must never acquire the ActivityManagerService lock,
// otherwise the watchdog may be prevented from resetting the system.
@@ -9297,7 +9330,7 @@ public class ActivityManagerService extends IActivityManager.Stub
if (rateLimitResult.shouldRateLimit()) return;
final StringBuilder sb = new StringBuilder(1024);
- appendDropBoxProcessHeaders(process, processName, sb);
+ appendDropBoxProcessHeaders(process, processName, volatileStates, sb);
if (process != null) {
sb.append("Foreground: ")
.append(process.isInterestingToUserLocked() ? "Yes" : "No")
diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java
index 16f222697646..a44a9222af29 100644
--- a/services/core/java/com/android/server/am/AppProfiler.java
+++ b/services/core/java/com/android/server/am/AppProfiler.java
@@ -1838,7 +1838,8 @@ public class AppProfiler {
dropBuilder.append(catSw.toString());
FrameworkStatsLog.write(FrameworkStatsLog.LOW_MEM_REPORTED);
mService.addErrorToDropBox("lowmem", null, "system_server", null,
- null, null, tag.toString(), dropBuilder.toString(), null, null, null, null, null);
+ null, null, tag.toString(), dropBuilder.toString(), null, null, null, null, null,
+ null);
synchronized (mService) {
long now = SystemClock.uptimeMillis();
if (mLastMemUsageReportTime < now) {
diff --git a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
index 753fdaed2fe6..667e883c35aa 100644
--- a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
+++ b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java
@@ -297,6 +297,7 @@ class ProcessErrorStateRecord {
ArrayList<Integer> firstPids = new ArrayList<>(5);
SparseBooleanArray lastPids = new SparseBooleanArray(20);
+ ActivityManagerService.VolatileDropboxEntryStates volatileDropboxEntriyStates = null;
mApp.getWindowProcessController().appEarlyNotResponding(annotation, () -> {
latencyTracker.waitingOnAMSLockStarted();
@@ -341,6 +342,9 @@ class ProcessErrorStateRecord {
synchronized (mProcLock) {
latencyTracker.waitingOnProcLockEnded();
setNotResponding(true);
+ volatileDropboxEntriyStates =
+ ActivityManagerService.VolatileDropboxEntryStates
+ .withProcessFrozenState(mApp.mOptRecord.isFrozen());
}
// Log the ANR to the event log.
@@ -618,7 +622,8 @@ class ProcessErrorStateRecord {
? (ProcessRecord) parentProcess.mOwner : null;
mService.addErrorToDropBox("anr", mApp, mApp.processName, activityShortComponentName,
parentShortComponentName, parentPr, null, report.toString(), tracesFile,
- null, new Float(loadingProgress), incrementalMetrics, errorId);
+ null, new Float(loadingProgress), incrementalMetrics, errorId,
+ volatileDropboxEntriyStates);
if (mApp.getWindowProcessController().appNotResponding(info.toString(),
() -> {
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index acd9771c7750..b0f77604319b 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -5622,7 +5622,7 @@ public final class ProcessList {
if (logToDropbox) {
final long now = SystemClock.elapsedRealtime();
final StringBuilder sb = new StringBuilder();
- mService.appendDropBoxProcessHeaders(app, app.processName, sb);
+ mService.appendDropBoxProcessHeaders(app, app.processName, null, sb);
sb.append("Reason: " + reason).append("\n");
sb.append("Requester UID: " + requester).append("\n");
dbox.addText(DROPBOX_TAG_IMPERCEPTIBLE_KILL, sb.toString());