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的来龙去脉了。

参考资料

ANR系列之一:ANR显示和日志生成原理讲解
ANR日志分析全面解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值