Merge "Move dumpAnrStateAsync calls after inputDispatchingTimedOut and update the durations array" into udc-dev

This commit is contained in:
Mohamad Mahmoud
2023-05-31 15:30:33 +00:00
committed by Android (Google) Code Review
2 changed files with 47 additions and 14 deletions

View File

@@ -120,6 +120,10 @@ public class AnrLatencyTracker implements AutoCloseable {
private long mPreDumpIfLockTooSlowStartUptime;
private long mPreDumpIfLockTooSlowDuration = 0;
private long mNotifyAppUnresponsiveStartUptime;
private long mNotifyAppUnresponsiveDuration = 0;
private long mNotifyWindowUnresponsiveStartUptime;
private long mNotifyWindowUnresponsiveDuration = 0;
private final int mAnrRecordPlacedOnQueueCookie =
sNextAnrRecordPlacedOnQueueCookieGenerator.incrementAndGet();
@@ -425,11 +429,36 @@ public class AnrLatencyTracker implements AutoCloseable {
anrSkipped("dumpStackTraces");
}
/** Records the start of AnrController#notifyAppUnresponsive. */
public void notifyAppUnresponsiveStarted() {
mNotifyAppUnresponsiveStartUptime = getUptimeMillis();
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "notifyAppUnresponsive()");
}
/** Records the end of AnrController#notifyAppUnresponsive. */
public void notifyAppUnresponsiveEnded() {
mNotifyAppUnresponsiveDuration = getUptimeMillis() - mNotifyAppUnresponsiveStartUptime;
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}
/** Records the start of AnrController#notifyWindowUnresponsive. */
public void notifyWindowUnresponsiveStarted() {
mNotifyWindowUnresponsiveStartUptime = getUptimeMillis();
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "notifyWindowUnresponsive()");
}
/** Records the end of AnrController#notifyWindowUnresponsive. */
public void notifyWindowUnresponsiveEnded() {
mNotifyWindowUnresponsiveDuration = getUptimeMillis()
- mNotifyWindowUnresponsiveStartUptime;
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}
/**
* Returns latency data as a comma separated value string for inclusion in ANR report.
*/
public String dumpAsCommaSeparatedArrayWithHeader() {
return "DurationsV4: " + mAnrTriggerUptime
return "DurationsV5: " + mAnrTriggerUptime
/* triggering_to_app_not_responding_duration = */
+ "," + (mAppNotRespondingStartUptime - mAnrTriggerUptime)
/* app_not_responding_duration = */
@@ -480,6 +509,10 @@ public class AnrLatencyTracker implements AutoCloseable {
+ "," + (mCopyingFirstPidSucceeded ? 1 : 0)
/* preDumpIfLockTooSlow_duration = */
+ "," + mPreDumpIfLockTooSlowDuration
/* notifyAppUnresponsive_duration = */
+ "," + mNotifyAppUnresponsiveDuration
/* notifyWindowUnresponsive_duration = */
+ "," + mNotifyWindowUnresponsiveDuration
+ "\n\n";
}

View File

@@ -68,7 +68,7 @@ class AnrController {
void notifyAppUnresponsive(InputApplicationHandle applicationHandle,
TimeoutRecord timeoutRecord) {
try {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "notifyAppUnresponsive()");
timeoutRecord.mLatencyTracker.notifyAppUnresponsiveStarted();
timeoutRecord.mLatencyTracker.preDumpIfLockTooSlowStarted();
preDumpIfLockTooSlow();
timeoutRecord.mLatencyTracker.preDumpIfLockTooSlowEnded();
@@ -111,7 +111,6 @@ class AnrController {
if (!blamePendingFocusRequest) {
Slog.i(TAG_WM, "ANR in " + activity.getName() + ". Reason: "
+ timeoutRecord.mReason);
dumpAnrStateAsync(activity, null /* windowState */, timeoutRecord.mReason);
mUnresponsiveAppByDisplay.put(activity.getDisplayId(), activity);
}
}
@@ -123,8 +122,13 @@ class AnrController {
} else {
activity.inputDispatchingTimedOut(timeoutRecord, INVALID_PID);
}
if (!blamePendingFocusRequest) {
dumpAnrStateAsync(activity, null /* windowState */, timeoutRecord.mReason);
}
} finally {
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
timeoutRecord.mLatencyTracker.notifyAppUnresponsiveEnded();
}
}
@@ -139,7 +143,7 @@ class AnrController {
void notifyWindowUnresponsive(@NonNull IBinder token, @NonNull OptionalInt pid,
@NonNull TimeoutRecord timeoutRecord) {
try {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "notifyWindowUnresponsive()");
timeoutRecord.mLatencyTracker.notifyWindowUnresponsiveStarted();
if (notifyWindowUnresponsive(token, timeoutRecord)) {
return;
}
@@ -150,7 +154,7 @@ class AnrController {
}
notifyWindowUnresponsive(pid.getAsInt(), timeoutRecord);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
timeoutRecord.mLatencyTracker.notifyWindowUnresponsiveEnded();
}
}
@@ -168,6 +172,7 @@ class AnrController {
final int pid;
final boolean aboveSystem;
final ActivityRecord activity;
final WindowState windowState;
timeoutRecord.mLatencyTracker.waitingOnGlobalLockStarted();
synchronized (mService.mGlobalLock) {
timeoutRecord.mLatencyTracker.waitingOnGlobalLockEnded();
@@ -175,7 +180,7 @@ class AnrController {
if (target == null) {
return false;
}
WindowState windowState = target.getWindowState();
windowState = target.getWindowState();
pid = target.getPid();
// Blame the activity if the input token belongs to the window. If the target is
// embedded, then we will blame the pid instead.
@@ -183,13 +188,13 @@ class AnrController {
? windowState.mActivityRecord : null;
Slog.i(TAG_WM, "ANR in " + target + ". Reason:" + timeoutRecord.mReason);
aboveSystem = isWindowAboveSystem(windowState);
dumpAnrStateAsync(activity, windowState, timeoutRecord.mReason);
}
if (activity != null) {
activity.inputDispatchingTimedOut(timeoutRecord, pid);
} else {
mService.mAmInternal.inputDispatchingTimedOut(pid, aboveSystem, timeoutRecord);
}
dumpAnrStateAsync(activity, windowState, timeoutRecord.mReason);
return true;
}
@@ -199,15 +204,10 @@ class AnrController {
private void notifyWindowUnresponsive(int pid, TimeoutRecord timeoutRecord) {
Slog.i(TAG_WM,
"ANR in input window owned by pid=" + pid + ". Reason: " + timeoutRecord.mReason);
timeoutRecord.mLatencyTracker.waitingOnGlobalLockStarted();
synchronized (mService.mGlobalLock) {
timeoutRecord.mLatencyTracker.waitingOnGlobalLockEnded();
dumpAnrStateAsync(null /* activity */, null /* windowState */, timeoutRecord.mReason);
}
// We cannot determine the z-order of the window, so place the anr dialog as high
// as possible.
mService.mAmInternal.inputDispatchingTimedOut(pid, true /*aboveSystem*/, timeoutRecord);
dumpAnrStateAsync(null /* activity */, null /* windowState */, timeoutRecord.mReason);
}
/**