Android中ANR的初步分析
一、 初识ANR
1.1什么是ANR?
ANR(Application Not responding),是指应用程序未响应,应用进程主线程超过一定时间没有执行完成,系统即弹出“应用无响应”对话框。
1.2ANR场景
(1)KeyDispatch Timeout(最常见)
input事件在5S内没有处理完成发生了ANR。
logcat日志关键字:Input event dispatching timed out
frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp
// Amount of time to allow for all pending events to be processed when an app switch
// key is on the way. This is used to preempt input dispatch and drop input events
// when an application takes too long to respond and the user has pressed an app switch key.
constexpr nsecs_t APP_SWITCH_TIMEOUT = 500 * 1000000LL; // 0.5sec
(2) Broadcast Timeout
前台Broadcast:onReceiver在10S内没有处理完成发生ANR。
后台Broadcast:onReceiver在60s内没有处理完成发生ANR。
logcat日志关键字:Timeout of broadcast BroadcastRecord
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
// How long we allow a receiver to run before giving up on it.
static final int BROADCAST_FG_TIMEOUT = 10 * 1000 * Build.HW_TIMEOUT_MULTIPLIER;
static final int BROADCAST_BG_TIMEOUT = 60 * 1000 * Build.HW_TIMEOUT_MULTIPLIER;
(3) Service Timeout
前台Service:onCreate,onStart,onBind等生命周期在20s内没有处理完成发生ANR。
后台Service:onCreate,onStart,onBind等生命周期在200s内没有处理完成发生ANR
logcat日志关键字:Timeout executing service
frameworks/base/services/core/java/com/android/server/am/ActiveServices.java
// How long we wait for a service to finish executing.
static final int SERVICE_TIMEOUT = 20 * 1000 * Build.HW_TIMEOUT_MULTIPLIER;
// How long we wait for a service to finish executing.
static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10;
(4)ContentProvider Timeout
ContentProvider 在10S内没有处理完成发生ANR。
logcat日志关键字:timeout publishing content providers
frameworks/core/java/android/content/ContentResolver.java
public static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT_MILLIS =
10 * 1000 * Build.HW_TIMEOUT_MULTIPLIER;
想要深入理解ANR的触发原理可参考http://gityuan.com/2016/07/02/android-anr/
注意事项:
Input的超时机制与其他的不同,对于input来说即便某次事件执行时间超过timeout时长,只要用户后续在没有再生成输入事件,则不会触发ANR
1.3 ANR出现的原因
(1)主线程频繁进行耗时的IO操作:如数据库读写
(2)多线程操作的死锁,主线程被block;
(3)主线程被Binder 对端block;
(4)System Server中WatchDog出现ANR;
(5)service binder的连接达到上线无法和和System Server通信
(6)系统资源已耗尽(管道、CPU、IO)
1.4 如何分析ANR
(1)日志分析:ANR发生时都会在log中输出错误信息,从log中可以获得ANR的类型,ANR的进程,CPU的使用情况,CPU使用率过高有可能是CPU饥饿导致了ANR。CPU使用率过低说明主线程被block了,如果IOwait高是因为主线程进行I/O操作造成的。
(2)traces文件分析:除了log输出外,你会发现各个应用进程和系统进程的函数堆栈信息都输出到了一个/data/anr/traces.txt的文件中,这个文件是分析ANR原因的关键文件.要获取到该文件可使用adb指令进行赋权后拉出查看调用stack。通过log、trace.text、代码结合分析ANR的成因(iowait?Memoryleak?Block?)
(3)traces文件无法分析的:不过还存在一些ANR问题,trace文件是分析不了的,例如我们的系统上,人脸识别活体攻击的时候,native算法耗尽cpu资源导致其他app无法抢占cpu时间片导致anr,假如ANR的app是你开发的,估计查到死也找不到问题所在
接下来我们将一步一步分析ANR,这个过程能让我们进一步明白如何找到问题、分析问题以及解决问题。
二、ANR发生时的log收集
当ANR发生的时候,系统会调用如下相关的关键函数代码,来将系统当前的关键信息保存到日志当中:
frameworks/base/services/core/java/com/android/server/am/ProcessErrorStateRecord.java#appNotResponding
void appNotResponding(String activityShortComponentName, ApplicationInfo aInfo,
String parentShortComponentName, WindowProcessController parentProcess,
boolean aboveSystem, String annotation, boolean onlyDumpSelf) {
ArrayList<Integer> firstPids = new ArrayList<>(5);
SparseArray<Boolean> lastPids = new SparseArray<>(20);
mApp.getWindowProcessController().appEarlyNotResponding(annotation, () -> {
synchronized (mService) {
// Store annotation here as instance below races with this killLocked.
setAnrAnnotation(annotation);
mApp.killLocked("anr", ApplicationExitInfo.REASON_ANR, true);
}
});
long anrTime = SystemClock.uptimeMillis();
if (isMonitorCpuUsage()) {
mService.updateCpuStatsNow();
}
final boolean isSilentAnr;
final int pid = mApp.getPid();
final UUID errorId;
isSilentAnr = isSilentAnr();
synchronized (mService) {
// Store annotation here as instance above will not be hit on all paths.
setAnrAnnotation(annotation);
// PowerManager.reboot() can block for a long time, so ignore ANRs while shutting down.
if (mService.mAtmInternal.isShuttingDown()) {
Slog.i(TAG, "During shutdown skipping ANR: " + this + " " + annotation);
return;
} else if (isNotResponding()) {
Slog.i(TAG, "Skipping duplicate ANR: " + this + " " + annotation);
return;
} else if (isCrashing()) {
Slog.i(TAG, "Crashing app skipping ANR: " + this + " " + annotation);
return;
} else if (mApp.isKilledByAm()) {
Slog.i(TAG, "App already killed by AM skipping ANR: " + this + " " + annotation);
return;
} else if (mApp.isKilled()) {
Slog.i(TAG, "Skipping died app ANR: " + this + " " + annotation);
return;
}
// In case we come through here for the same app before completing
// this one, mark as anring now so we will bail out.
synchronized (mProcLock) {
setNotResponding(true);
}
// 记录ANR到EventLog
EventLog.writeEvent(EventLogTags.AM_ANR, mApp.userId, pid, mApp.processName,
mApp.info.flags, annotation);
if (mService.mTraceErrorLogger != null
&& mService.mTraceErrorLogger.isAddErrorIdEnabled()) {
errorId = mService.mTraceErrorLogger.generateErrorId();
mService.mTraceErrorLogger.addErrorIdToTrace(mApp.processName, errorId);
mService.mTraceErrorLogger.addSubjectToTrace(annotation, errorId);
} else {
errorId = null;
}
// This atom is only logged with the purpose of triggering Perfetto and the logging
// needs to happen as close as possible to the time when the ANR is detected.
// Also, it needs to be logged after adding the error id to the trace, to make sure
// the error id is present in the trace when the Perfetto trace is captured.
FrameworkStatsLog.write(FrameworkStatsLog.ANR_OCCURRED_PROCESSING_STARTED,
mApp.processName);
// 将当前进程添加到firstPids
firstPids.add(pid);
// Don't dump other PIDs if it's a background ANR or is requested to only dump self.
if (!isSilentAnr && !onlyDumpSelf) {
int parentPid = pid;
if (parentProcess != null && parentProcess.getPid() > 0) {
parentPid = parentProcess.getPid();
}
if (parentPid != pid) firstPids.add(parentPid);
// 将system_server进程添加到firstPids
if (MY_PID != pid && MY_PID != parentPid) firstPids.add(MY_PID);
final int ppid = parentPid;
mService.mProcessList.forEachLruProcessesLOSP(false, r -> {
if (r != null && r.getThread() != null) {
int myPid = r.getPid();
if (myPid > 0 && myPid != pid && myPid != ppid && myPid != MY_PID) {
if (r.isPersistent()) {
firstPids.add(myPid);// 将persistent进程添加到firstPids
if (DEBUG_ANR) Slog.i(TAG, "Adding persistent proc: " + r);
} else if (r.mServices.isTreatedLikeActivity()) {
firstPids.add(myPid);
if (DEBUG_ANR) Slog.i(TAG, "Adding likely IME: " + r);
} else {
lastPids.put(myPid, Boolean.TRUE);// 其他进程添加到lastPids
if (DEBUG_ANR) Slog.i(TAG, "Adding ANR proc: " + r);
}
}
}
});
}
}
// Get critical event log before logging the ANR so that it doesn't occur in the log.
final String criticalEventLog =
CriticalEventLog.getInstance().logLinesForTraceFile(
mApp.getProcessClassEnum(), mApp.processName, mApp.uid);
CriticalEventLog.getInstance().logAnr(annotation, mApp.getProcessClassEnum(),
mApp.processName, mApp.uid, mApp.mPid);
final ProcessRecord parentPro = parentProcess != null
? (ProcessRecord) parentProcess.mOwner : null;
/// M: ANR Debug Mechanism
if (mService.mAnrManager.startAnrDump(mService, this, activityShortComponentName, aInfo,
parentShortComponentName, parentPro, aboveSystem, annotation, isSilentAnr,
anrTime, onlyDumpSelf, errorId , criticalEventLog))
return;
// 记录ANR输出到main log
StringBuilder info = new StringBuilder();
info.setLength(0);
info.append("ANR in ").append(mApp.processName);
if (activityShortComponentName != null) {
info.append(" (").append(activityShortComponentName).append(")");
}
info.append("\n");
info.append("PID: ").append(pid).append("\n");
if (annotation != null) {
info.append("Reason: ").append(annotation).append("\n");
}
if (parentShortComponentName != null
&& parentShortComponentName.equals(activityShortComponentName)) {
info.append("Parent: ").append(parentShortComponentName).append("\n");
}
if (errorId != null) {
info.append("ErrorId: ").append(errorId.toString()).append("\n");
}
info.append("Frozen: ").append(mApp.mOptRecord.isFrozen()).append("\n");
// Retrieve controller with max ANR delay from AnrControllers
// Note that we retrieve the controller before dumping stacks because dumping stacks can
// take a few seconds, after which the cause of the ANR delay might have completed and
// there might no longer be a valid ANR controller to cancel the dialog in that case
AnrController anrController = mService.mActivityTaskManager.getAnrController(aInfo);
long anrDialogDelayMs = 0;
if (anrController != null) {
String packageName = aInfo.packageName;
int uid = aInfo.uid;
anrDialogDelayMs = anrController.getAnrDelayMillis(packageName, uid);
// Might execute an async binder call to a system app to show an interim
// ANR progress UI
anrController.onAnrDelayStarted(packageName, uid);
Slog.i(TAG, "ANR delay of " + anrDialogDelayMs + "ms started for " + packageName);
}
StringBuilder report = new StringBuilder();
report.append(MemoryPressureUtil.currentPsiState());
// 创建CPU tracker对象
ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true);
// don't dump native PIDs for background ANRs unless it is the process of interest
String[] nativeProcs = null;
if (isSilentAnr || onlyDumpSelf) {
for (int i = 0; i < NATIVE_STACKS_OF_INTEREST.length; i++) {
if (NATIVE_STACKS_OF_INTEREST[i].equals(mApp.processName)) {
nativeProcs = new String[] { mApp.processName };
break;
}
}
} else {
nativeProcs = NATIVE_STACKS_OF_INTEREST;
}
int[] pids = nativeProcs == null ? null : Process.getPidsForCommands(nativeProcs);
ArrayList<Integer> nativePids = null;
if (pids != null) {
nativePids = new ArrayList<>(pids.length);
for (int i : pids) {
nativePids.add(i);
}
}
// For background ANRs, don't pass the ProcessCpuTracker to
// avoid spending 1/2 second collecting stats to rank lastPids.
StringWriter tracesFileException = new StringWriter();
// To hold the start and end offset to the ANR trace file respectively.
final long[] offsets = new long[2];
// 输出traces信息
File tracesFile = ActivityManagerService.dumpStackTraces(firstPids,
isSilentAnr ? null : processCpuTracker, isSilentAnr ? null : lastPids,
nativePids, tracesFileException, offsets, annotation, criticalEventLog);
if (isMonitorCpuUsage()) {
mService.updateCpuStatsNow();
mService.mAppProfiler.printCurrentCpuState(report, anrTime);
info.append(processCpuTracker.printCurrentLoad());
info.append(report);
}
report.append(tracesFileException.getBuffer());
info.append(processCpuTracker.printCurrentState(anrTime));
// 输出当前ANR的reason,以及CPU使用率、负载信息
Slog.e(TAG, info.toString());
if (tracesFile == null) {
// There is no trace file, so dump (only) the alleged culprit's threads to the log
Process.sendSignal(pid, Process.SIGNAL_QUIT);
} else if (offsets[1] > 0) {
// We've dumped into the trace file successfully
mService.mProcessList.mAppExitInfoTracker.scheduleLogAnrTrace(
pid, mApp.uid, mApp.getPackageList(), tracesFile, offsets[0], offsets[1]);
}
// Check if package is still being loaded
float loadingProgress = 1;
IncrementalMetrics incrementalMetrics = null;
final PackageManagerInternal packageManagerInternal = mService.getPackageManagerInternal();
if (mApp.info != null && mApp.info.packageName != null && packageManagerInternal != null) {
IncrementalStatesInfo incrementalStatesInfo =
packageManagerInternal.getIncrementalStatesInfo(
mApp.info.packageName, SYSTEM_UID, mApp.userId);
if (incrementalStatesInfo != null) {
loadingProgress = incrementalStatesInfo.getProgress();
}
final String codePath = mApp.info.getCodePath();
if (codePath != null && !codePath.isEmpty()
&& IncrementalManager.isIncrementalPath(codePath)) {
// Report in the main log that the incremental package is still loading
Slog.e(TAG, "App ANR on incremental package " + mApp.info.packageName
+ " which is " + ((int) (loadingProgress * 100)) + "% loaded.");
final IBinder incrementalService = ServiceManager.getService(
Context.INCREMENTAL_SERVICE);
if (incrementalService != null) {
final IncrementalManager incrementalManager = new IncrementalManager(
IIncrementalService.Stub.asInterface(incrementalService));
incrementalMetrics = incrementalManager.getMetrics(codePath);
}
}
}
if (incrementalMetrics != null) {
// Report in the main log about the incremental package
info.append("Package is ").append((int) (loadingProgress * 100)).append("% loaded.\n");
}
FrameworkStatsLog.write(FrameworkStatsLog.ANR_OCCURRED, mApp.uid, mApp.processName,
activityShortComponentName == null ? "unknown" : activityShortComponentName,
annotation,
(mApp.info != null) ? (mApp.info.isInstantApp()
? FrameworkStatsLog.ANROCCURRED__IS_INSTANT_APP__TRUE
: FrameworkStatsLog.ANROCCURRED__IS_INSTANT_APP__FALSE)
: FrameworkStatsLog.ANROCCURRED__IS_INSTANT_APP__UNAVAILABLE,
mApp.isInterestingToUserLocked()
? FrameworkStatsLog.ANROCCURRED__FOREGROUND_STATE__FOREGROUND
: FrameworkStatsLog.ANROCCURRED__FOREGROUND_STATE__BACKGROUND,
mApp.getProcessClassEnum(),
(mApp.info != null) ? mApp.info.packageName : "",
incrementalMetrics != null /* isIncremental */, loadingProgress,
incrementalMetrics != null ? incrementalMetrics.getMillisSinceOldestPendingRead()
: -1,
incrementalMetrics != null ? incrementalMetrics.getStorageHealthStatusCode()
: -1,
incrementalMetrics != null ? incrementalMetrics.getDataLoaderStatusCode()
: -1,
incrementalMetrics != null && incrementalMetrics.getReadLogsEnabled(),
incrementalMetrics != null ? incrementalMetrics.getMillisSinceLastDataLoaderBind()
: -1,
incrementalMetrics != null ? incrementalMetrics.getDataLoaderBindDelayMillis()
: -1,
incrementalMetrics != null ? incrementalMetrics.getTotalDelayedReads()
: -1,
incrementalMetrics != null ? incrementalMetrics.getTotalFailedReads()
: -1,
incrementalMetrics != null ? incrementalMetrics.getLastReadErrorUid()
: -1,
incrementalMetrics != null ? incrementalMetrics.getMillisSinceLastReadError()
: -1,
incrementalMetrics != null ? incrementalMetrics.getLastReadErrorNumber()
: 0,
incrementalMetrics != null ? incrementalMetrics.getTotalDelayedReadsDurationMillis()
: -1);
final ProcessRecord parentPr = parentProcess != null
? (ProcessRecord) parentProcess.mOwner : null;
// 将traces文件 和 CPU使用率信息保存到dropbox,即data/system/dropbox目录
mService.addErrorToDropBox("anr", mApp, mApp.processName, activityShortComponentName,
parentShortComponentName, parentPr, null, report.toString(), tracesFile,
null, new Float(loadingProgress), incrementalMetrics, errorId);
if (mApp.getWindowProcessController().appNotResponding(info.toString(),
() -> {
synchronized (mService) {
mApp.killLocked("anr", ApplicationExitInfo.REASON_ANR, true);
}
},
() -> {
synchronized (mService) {
mService.mServices.scheduleServiceTimeoutLocked(mApp);
}
})) {
return;
}
synchronized (mService) {
// mBatteryStatsService can be null if the AMS is constructed with injector only. This
// will only happen in tests.
if (mService.mBatteryStatsService != null) {
mService.mBatteryStatsService.noteProcessAnr(mApp.processName, mApp.uid);
}
// 后台ANR的情况, 则直接杀掉
if (isSilentAnr() && !mApp.isDebugging()) {
mApp.killLocked("bg anr", ApplicationExitInfo.REASON_ANR, true);
return;
}
synchronized (mProcLock) {
// 设置app的ANR状态,并查询错误报告receiver
makeAppNotRespondingLSP(activityShortComponentName,
annotation != null ? "ANR " + annotation : "ANR", info.toString());
mDialogController.setAnrController(anrController);
}
// mUiHandler can be null if the AMS is constructed with injector only. This will only
// happen in tests.
if (mService.mUiHandler != null) {
// 弹出ANR对话框
Message msg = Message.obtain();
msg.what = ActivityManagerService.SHOW_NOT_RESPONDING_UI_MSG;
msg.obj = new AppNotRespondingDialog.Data(mApp, aInfo, aboveSystem);
// 向ui线程发送,内容为SHOW_NOT_RESPONDING_MSG的消息
mService.mUiHandler.sendMessageDelayed(msg, anrDialogDelayMs);
}
}
}
通过上面的代码我们知道,当ANR发生的时候,会将ANR记录到event log和main log中。
三、日志分析
3.1 分析 Event Log(如果没有找到该文件可以跳过这一步)
查看mobilelog文件夹下的events_log,从日志中搜索关键字:am_anr,找到出现ANR的时间点、进程PID、ANR类型。
09-20 18:34:56.477082 1111 2480 I am_anr : [0,2425,com.lambda.binder,552124230,Input dispatching timed out (b0b09ee com.lambda.binder/com.lambda.binder.activity.MyClientActivity (server) is not responding. Waited 5001ms for MotionEvent(deviceId=3, eventTime=1690116760996000, source=TOUCHSCREEN, displayId=0, action=DOWN, actionButton=0x00000000, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, xCursorPosition=nan, yCursorPosition=nan, pointers=[0: (124.0, 251.0)]), policyFlags=0x62000000)]
从上面的log我们可以看出: 应用com.lambda.binder 在09-20 18:34:56.477082时间,发生了一次KeyDispatchTimeout类型的ANR,它的进程号是2425
把关键的信息整理一下:
ANR时间:09-20 18:34:56.477082
进程pid:2425
进程名:com.lambda.binder
ANR类型:Input dispatching timed
3.2 分析 Android Log:看 MainLog(Android Log) 或者 SystemLog 查看 ANR 详细信息(搜索 ANR in),提取有效的信息 (提取有效信息到单独文件中)
09-20 18:35:00.175020 1111 2480 I AnrManager: ANR in com.lambda.binder (com.lambda.binder/.activity.MyClientActivity), time=1690121894
09-20 18:35:00.175020 1111 2480 I AnrManager: Reason: Input dispatching timed out (b0b09ee com.lambda.binder/com.lambda.binder.activity.MyClientActivity (server) is not responding. Waited 5001ms for MotionEvent(deviceId=3, eventTime=1690116760996000, source=TOUCHSCREEN, displayId=0, action=DOWN, actionButton=0x00000000, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, xCursorPosition=nan, yCursorPosition=nan, pointers=[0: (124.0, 251.0)]), policyFlags=0x62000000)
09-20 18:35:00.175020 1111 2480 I AnrManager: Load: 15.26 / 14.97 / 14.75
09-20 18:35:00.175020 1111 2480 I AnrManager: ----- Output from /proc/pressure/memory -----
09-20 18:35:00.175020 1111 2480 I AnrManager: some avg10=0.00 avg60=0.00 avg300=0.00 total=0
09-20 18:35:00.175020 1111 2480 I AnrManager: full avg10=0.00 avg60=0.00 avg300=0.00 total=0
09-20 18:35:00.175020 1111 2480 I AnrManager: ----- End output from /proc/pressure/memory -----
09-20 18:35:00.175020 1111 2480 I AnrManager:
09-20 18:35:00.175020 1111 2480 I AnrManager: Android time :[2024-09-20 18:35:00.16] [1690125.625]
09-20 18:35:00.175020 1111 2480 I AnrManager: CPU usage from 241819ms to 0ms ago (2024-09-20 18:30:54.635 to 2024-09-20 18:34:56.454):
09-20 18:35:00.175020 1111 2480 I AnrManager: 10% 715/surfaceflinger: 7% user + 3.8% kernel / faults: 3434 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 3.3% 656/android.hardware.graphics.composer@2.3-service: 1.4% user + 1.8% kernel / faults: 153 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 5.4% 1111/system_server: 3.6% user + 1.8% kernel / faults: 86453 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 5.3% 1493/com.android.systemui: 3.2% user + 2% kernel / faults: 24474 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 1.2% 975/emdlogger: 1% user + 0.2% kernel / faults: 6503 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 1.5% 5252/com.DDU.launcher: 1% user + 0.5% kernel / faults: 11152 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.4% 1006/vendor.mediatek.hardware.pq@2.2-service: 0.2% user + 0.2% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 1% 516/logd: 0.3% user + 0.7% kernel / faults: 2904 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.4% 28442/kworker/u17:3-mali_jd: 0% user + 0.4% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.8% 28426/kworker/u17:1: 0% user + 0.8% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.7% 340/irq/308-5-0034: 0% user + 0.7% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.6% 2566/com.DDU.secureguard: 0.2% user + 0.3% kernel / faults: 13116 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.6% 28507/kworker/u16:7-events_unbound: 0% user + 0.6% kernel / faults: 224 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.1% 957/mobile_log_d: 0% user + 0.1% kernel / faults: 7559 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.4% 685/vendor.mediatek.hardware.mtkpower@1.0-service: 0.1% user + 0.2% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.4% 434/charger_thread: 0% user + 0.4% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.1% 392/sf_pf_release_t: 0% user + 0.1% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.3% 28508/kworker/u16:8-events_unbound: 0% user + 0.3% kernel / faults: 28 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.3% 1759/com.android.phone: 0.2% user + 0.1% kernel / faults: 2196 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.1% 2914/com.android.permissioncontroller: 0% user + 0% kernel / faults: 5490 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.3% 28509/kworker/u16:9-fs_suspend_syssync: 0% user + 0.3% kernel / faults: 22 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.1% 131/ion_mm_heap: 0% user + 0.1% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.3% 28570/kworker/1:3-events: 0% user + 0.3% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.2% 1154/mtkfusionrild: 0.1% user + 0.1% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.2% 10/rcu_preempt: 0% user + 0.2% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.1% 16707/adbd: 0% user + 0.1% kernel / faults: 3068 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.2% 407/ipi_cpu_dvfs_rt: 0% user + 0.2% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.1% 28418/kworker/2:0: 0% user + 0.1% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.1% 620/statsd: 0% user + 0% kernel / faults: 83 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.1% 28295/kworker/0:0-events: 0% user + 0.1% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 562/android.system.suspend@1.0-service: 0% user + 0% kernel / faults: 2 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.1% 28427/kworker/3:2-events: 0% user + 0.1% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 335/irq/305-jdcommo: 0% user + 0% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0.1% 487/ueventd: 0% user + 0% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 572/kworker/0:1-events: 0% user + 0% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 28463/com.android.packageinstaller: 0% user + 0% kernel / faults: 5687 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 1088/gsm0710muxd: 0% user + 0% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 219/pbm: 0% user + 0% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 383/mtk_drm_disp_id: 0% user + 0% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 1/init: 0% user + 0% kernel / faults: 266 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 700/audioserver: 0% user + 0% kernel / faults: 14 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 653/android.hardware.graphics.allocator@4.0-service-mediatek: 0% user + 0% kernel / faults: 452 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 2773/com.android.inputmethod.latin: 0% user + 0% kernel / faults: 613 minor
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 518/servicemanager: 0% user + 0% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 717/fuelgauged: 0% user + 0% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 719/ccci_mdinit: 0% user + 0% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 823/sub_wifi_thrd: 0% user + 0% kernel
09-20 18:35:00.175020 1111 2480 I AnrManager: 0% 2199/com.android.nfc: 0% user + 0% kernel / faults: 394 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 670/android.hardware.usb@1.2-service-mediatekv2: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 2035/com.android.cellbroadcastreceiver.module: 0% user + 0% kernel / faults: 282 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 664/android.hardware.sensors@2.0-service.multihal-mediatek: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 1792/android.ext.services: 0% user + 0% kernel / faults: 640 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 3091/com.android.phone: 0% user + 0% kernel / faults: 160 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 658/android.hardware.health@2.1-service: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 11/rcu_sched: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 13/migration/0: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 16/migration/1: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 135/ion_history: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 226/chre_kthread: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 386/disp_echk: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 517/lmkd: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 519/hwservicemanager: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 622/zygote64: 0% user + 0% kernel / faults: 380 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 690/android.hardware.vibrator-service.mediatek: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 986/thermal: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 1105/ff_ta.elf: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 21/migration/2: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 26/migration/3: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 31/migration/4: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 36/migration/5: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 350/battery_thread: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 571/kworker/5:2-events_freezable: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 1965/com.mediatek.ims: 0% user + 0% kernel / faults: 19 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 41/migration/6: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 128/dlpt_notify_thr: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 308/krtatm: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 561/android.hardware.nfc@1.2-service-st: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 660/android.hardware.memtrack@1.0-service: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 818/conninfra_cored: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 820/sub_bt_thrd: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 907/cameraserver: 0% user + 0% kernel / faults: 11 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 920/installd: 0% user + 0% kernel / faults: 64 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 951/media.metrics: 0% user + 0% kernel / faults: 63 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 954/mediaserver: 0% user + 0% kernel / faults: 9 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 1727/com.mediatek.smartratswitch: 0% user + 0% kernel / faults: 21 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 1743/com.android.se: 0% user + 0% kernel / faults: 22 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 15104/com.android.gallery3d: 0% user + 0% kernel / faults: 16 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 28328/kworker/4:2: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 28419/kworker/5:0-events_freezable: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 9/ksoftirqd/0: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 17/ksoftirqd/1: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 22/ksoftirqd/2: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 27/ksoftirqd/3: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 46/migration/7: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 123/watchdogd: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 125/irq/506-mt6358-: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 212/spi1: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 229/ccci_poll1: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 289/wdtk-3: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 291/wdtk-5: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 304/hang_detect: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 349/gauge_coulomb_t: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 384/enable_vblank: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 405/kworker/2:1H-kblockd: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 432/core_ctl_v1/4: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 433/core_ctl_v1/7: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 468/kworker/0:1H-kblockd: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 469/kworker/3:1H-kblockd: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 474/kworker/1:1H-kblockd: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 522/vndservicemanager: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 529/vold: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 548/jbd2/sdc6-8: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 567/keystore2: 0% user + 0% kernel / faults: 12 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 621/netd: 0% user + 0% kernel / faults: 18 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 639/android.hardware.audio.service.mediatek: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 666/android.hardware.thermal@2.0-service.mtk: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 683/lbs_hidl_service: 0% user + 0% kernel / faults: 1 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 755/smartcharging: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 904/mnld: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 922/media.extractor: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 964/netdiag: 0% user + 0% kernel / faults: 47 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 973/storaged: 0% user + 0% kernel
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 1011/media.swcodec: 0% user + 0% kernel / faults: 3 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 1313/connsyslogger: 0% user + 0% kernel / faults: 101 minor
09-20 18:35:00.175613 1111 2480 I AnrManager: 0% 2192/com.android.providers.media.module: 0% user + 0% kernel / faults: 38 minor
09-20 18:35:00.176084 1111 2480 I AnrManager: 0% 5151/com.android.settings: 0% user + 0% kernel / faults: 15 minor
09-20 18:35:00.176084 1111 2480 I AnrManager: 0% 20161/kworker/6:2-ged_notify_sw_vsync: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 0% 22096/kworker/7:0-lt_wq: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 0% 23841/com.android.calendar: 0% user + 0% kernel / faults: 41 minor
09-20 18:35:00.176084 1111 2480 I AnrManager: 0% 24298/android.process.media: 0% user + 0% kernel / faults: 10 minor
09-20 18:35:00.176084 1111 2480 I AnrManager: 0% 28597/kworker/5:4-ged_notify_sw_vsync: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 586/kworker/u17:0-mali_jd: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 587/kworker/u16:0-ged_fence: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 640/kworker/u16:1: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 806/kworker/u17:2-mali_jd: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 870/kbase_event: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 967/com.android.documentsui: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 988/com.android.keychain: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1330/sh: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1348/installer: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1613/kworker/6:0: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1614/com.android.dialer: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1666/android.process.acore: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1683/kbase_event: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1744/kworker/2:1-events: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1747/com.mediatek.engineermode: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1796/kbase_event: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1863/com.debug.loggerui: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 1998/kbase_event: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2138/netdiag: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2140/sh: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2142/trace: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2175/kworker/3:0-events: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2197/kworker/3:1-lt_wq: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2318/kworker/0:2-events: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2319/kworker/5:1-events_freezable: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2326/logcat: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2408/install_server-1e2fcec0: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2425/com.lambda.binder: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: +0% 2456/kbase_event: 0% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 6.8% TOTAL: 3.5% user + 3.1% kernel + 0% iowait + 0.1% softirq
09-20 18:35:00.176084 1111 2480 I AnrManager: CPU usage from 54ms to 325ms later (2024-09-20 18:34:56.508 to 2024-09-20 18:34:56.778):
09-20 18:35:00.176084 1111 2480 I AnrManager: 24% 656/android.hardware.graphics.composer@2.3-service: 12% user + 12% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 8.2% 751/HwBinder:656_1: 4.1% user + 4.1% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 8.2% 856/OverlayEngine_0: 4.1% user + 4.1% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 25% 715/surfaceflinger: 16% user + 8.3% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 16% 715/surfaceflinger: 12% user + 4.1% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 8.3% 966/surfaceflinger: 4.1% user + 4.1% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 4.1% 767/binder:715_2: 4.1% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 4.1% 861/TimerDispatch: 4.1% user + 0% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 22% 2425/com.lambda.binder: 13% user + 9.1% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 18% 2447/RenderThread: 13% user + 4.5% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 9.1% 2467/mali-cmar-backe: 4.5% user + 4.5% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 12% 1111/system_server: 0% user + 12% kernel / faults: 393 minor
09-20 18:35:00.176084 1111 2480 I AnrManager: 8.6% 2480/AnrConsumer: 0% user + 8.6% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 8.2% 586/kworker/u17:0-mali_jd: 0% user + 8.2% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 9.5% 28442/kworker/u17:3-mali_jd: 0% user + 9.5% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 4% 407/ipi_cpu_dvfs_rt: 0% user + 4% kernel
09-20 18:35:00.176084 1111 2480 I AnrManager: 15% TOTAL: 6.2% user + 9% kernel
通过上面所提供的案例我们可以分析出以下几点:
- ANR发生的位置是:com.lambda.binder/.activity.MyClientActivity
- com.lambda.binder占用了22%的CPU,CPU的使用率并不是很高,基本可以排除CPU负载的原因
- Reason提示我们是输入分发超时导致的ANR
3.3 分析ANR traces.txt 文件
APP不响应、响应慢了、或者WatchDog的监视没有得到回应时,系统就会dump出一个traces.txt文件,存放在文件目录:/data/anr/文件夹中,通过traces文件,我们可以拿到线程名、堆栈信息、线程当前状态、binder call等信息。
我们可以通过adb命令获取到该文件夹下面的所有traces文件:adb pull /data/anr
Subject: Input dispatching timed out (b0b09ee com.lambda.binder/com.lambda.binder.activity.MyClientActivity (server) is not responding. Waited 5001ms for MotionEvent(deviceId=3, eventTime=1690116760996000, source=TOUCHSCREEN, displayId=0, action=DOWN, actionButton=0x00000000, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, xCursorPosition=nan, yCursorPosition=nan, pointers=[0: (124.0, 251.0)]), policyFlags=0x62000000)
--- CriticalEventLog ---
capacity: 20
timestamp_ms: 1726828496477
window_ms: 300000
----- pid 2425 at 2024-09-20 18:34:56.790326914+0800 -----
Cmd line: com.lambda.binder
...省略...
suspend all histogram: Sum: 177us 99% C.I. 0.084us-30us Avg: 4.916us Max: 30us
DALVIK THREADS (21):
"Signal Catcher" daemon prio=10 tid=6 Runnable
| group="system" sCount=0 ucsCount=0 flags=0 obj=0x12c401a0 self=0xb4000077c535d2c0
| sysTid=2434 nice=-20 cgrp=default sched=0/0 handle=0x763b519cb0
| state=R schedstat=( 10874846 21308 8 ) utm=0 stm=0 core=6 HZ=100
| stack=0x763b422000-0x763b424000 stackSize=991KB
| held mutexes= "mutator lock"(shared held)
native: #00 pc 00000000005707d4 /apex/com.android.art/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+148) (BuildId: d9102ed243bc60d64307221e9e2c8596)
native: #01 pc 00000000006727a4 /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool, BacktraceMap*, bool) const+340) (BuildId: d9102ed243bc60d64307221e9e2c8596)
native: #02 pc 000000000068f7ac /apex/com.android.art/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+1036) (BuildId: d9102ed243bc60d64307221e9e2c8596)
native: #03 pc 00000000006893e8 /apex/com.android.art/lib64/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+504) (BuildId: d9102ed243bc60d64307221e9e2c8596)
native: #04 pc 00000000006886bc /apex/com.android.art/lib64/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool)+1820) (BuildId: d9102ed243bc60d64307221e9e2c8596)
native: #05 pc 0000000000687e78 /apex/com.android.art/lib64/libart.so (art::ThreadList::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+1400) (BuildId: d9102ed243bc60d64307221e9e2c8596)
native: #06 pc 000000000063a860 /apex/com.android.art/lib64/libart.so (art::Runtime::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+208) (BuildId: d9102ed243bc60d64307221e9e2c8596)
native: #07 pc 000000000064ef7c /apex/com.android.art/lib64/libart.so (art::SignalCatcher::HandleSigQuit()+1372) (BuildId: d9102ed243bc60d64307221e9e2c8596)
native: #08 pc 000000000064e054 /apex/com.android.art/lib64/libart.so (art::SignalCatcher::Run(void*)+340) (BuildId: d9102ed243bc60d64307221e9e2c8596)
native: #09 pc 00000000000c14cc /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+204) (BuildId: 718ecc04753b519b0f6289a7a2fcf117)
native: #10 pc 0000000000054930 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: 718ecc04753b519b0f6289a7a2fcf117)
(no managed stack frames)
"main" prio=5 tid=1 Sleeping
| group="main" sCount=1 ucsCount=0 flags=1 obj=0x72544238 self=0xb4000077c5351010
| sysTid=2425 nice=-10 cgrp=default sched=1073741824/0 handle=0x791c1754f8
| state=S schedstat=( 418048400 41876378 348 ) utm=36 stm=5 core=4 HZ=100
| stack=0x7fe6bcc000-0x7fe6bce000 stackSize=8188KB
| held mutexes=
at java.lang.Thread.sleep(Native method)
- sleeping on <0x0e9904f0> (a java.lang.Object)
at java.lang.Thread.sleep(Thread.java:450)
- locked <0x0e9904f0> (a java.lang.Object)
at java.lang.Thread.sleep(Thread.java:355)
at com.lambda.binder.activity.MyClientActivity.lambda$onCreate$0$com-lambda-binder-activity-MyClientActivity(MyClientActivity.java:102)
at com.lambda.binder.activity.MyClientActivity$$ExternalSyntheticLambda0.onClick(unavailable:2)
at android.view.View.performClick(View.java:7527)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1211)
at android.view.View.performClickInternal(View.java:7500)
at android.view.View.-$$Nest$mperformClickInternal(unavailable:0)
at android.view.View$PerformClick.run(View.java:29538)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7941)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:569)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1019)
看主线程状态:Sleeping
分析是主线程等待超时导致ANR,具体需要结合at com.lambda.binder.activity.MyClientActivity.lambda$onCreate$0$com-lambda-binder-activity-MyClientActivity(MyClientActivity.java:102)
查看修改
四、ANR分析流程总结
4.1 首先我们搜索am_anr,找到出现ANR的时间点、进程PID、ANR类型、然后再找搜索PID,找前5秒左右的日志。
###4.2 过滤ANR IN 查看CPU信息
4.3 接着查看traces.txt,找到java的堆栈信息定位代码位置,最后查看源码,分析与解决问题。
到这里,通过上面三个步骤我们基本就能定位出来大部分ANR的来龙去脉了。