Android卡顿优化 | ANR分析与实战(附ANR-WatchDog源码分析及实战、与AndroidPerformanceMonitor的区别)...

本文要点

  • ANR概述
  • 发生ANR后Android系统的执行流程
  • ANR-WatchDog原理与实战
  • ANR的传统解决套路
  • ANR模拟实战
  • 线上ANR监控方案【ANR-WatchDog原理分析】
  • ANR-WatchDog实战
  • ANR-WatchDog总结
  • ANR-WatchDog与AndroidPerformanceMonitor的区别
项目GitHub

ANR概述

  • KeyDispatchTimeout,5s
    即按键或者触摸事件,在特定的时间(一般5s)之内没有响应;

  • BroadcastTimeout,前台10s,后台60s
    BroadReceiver 在特定的时间(一般前台10s,后台60s)之内没有响应完成;

  • ServiceTimeout,前台20s,后台200s
    Service 在特定的时间(一般前台20s,后台200s)之内没有处理完成;

发生ANR后Android系统的执行流程

  • APP发生ANR
  • 进程接收异常终止信号,开始写入进程ANR信息(当时场景,包含当前线程所有堆栈信息、CPU/IO的使用情况等);
  • 弹出ANR提示框,提示用户关闭APP或者继续等待;(不同ROM表现不同,有的手机厂商会去掉这个提示框)

ANR的传统解决套路

  • 【线下】在AS的Terminal中,使用
    adb pull data/anr/traces.txt 要存储在本地的路径
    导出上面提到的ANR现场信息文件
    导出来后,便可对文件内容进行详细分析:从CPU、IO、锁冲突等原因思考;

ANR模拟实战

  • 模拟ANR原因:锁冲突;

    更改代码:
    9125154-5976a8fc742b071a.png
    运行程序,等到程序ANR或崩溃,

    在Terminal使用刚刚提到的命令,导出ANR的信息文件:
    9125154-abbf4725b090eccb.png
    生成文件:
    9125154-372703d127a63e74.png
    打开文件,可以找到原因:
    9125154-f05430ab4bad26a5.png
    上次的BlockCanary同样捕捉到原因:
    9125154-f74744bfab4497ed.png

线下套路其实就是在APP发生ANR时,
导出信息文件,
查看文件,结合代码进行分析;

线上ANR监控方案</

<think>我们正在讨论ANR文件的分析ANR代表"Application Not Responding",即应用程序无响应。这种文件通常在Android设备上生成,当应用程序在主线程上阻塞太久时触发。 用户提供的文件名格式为:anr_2025-10-21-10-29-04-308,这是典型的ANR日志文件命名方式(包含时间戳)。 分析ANR文件的主要目标是找出导致主线程阻塞的原因。常见的工具和方法如下: 1. **使用adb命令获取ANR文件**: 通常,我们可以通过adb从设备中提取ANR文件: ``` adb pull /data/anr/anr_2025-10-21-10-29-04-308 ``` 注意:需要设备有root权限,否则可能无法访问/data/anr目录。如果没有root权限,可以尝试使用`adb bugreport`命令生成完整的bug报告,其中会包含ANR文件。 2. **直接查看ANR文件内容**: ANR文件是文本文件,可以用任何文本编辑器打开。关键部分包括: - 导致ANR的进程ID和包名 - 主线程的堆栈跟踪(stack trace),这通常会指出阻塞的位置 - 可能还包括其他线程的状态 3. **使用Android Studio分析**: Android Studio内置了分析工具,可以查看堆栈跟踪。如果ANR文件是来自开发中的应用程序,可以直接在Android Studio的Logcat中查看,或者将文件导入。 4. **使用Traceview或Perfetto**: 有时ANR文件中会包含跟踪信息(trace),我们可以使用Traceview(旧版)或Perfetto(新版)来查看这些跟踪文件,从而分析主线程上的卡顿。 5. **使用第三方工具**: 有一些第三方工具可以辅助分析ANR,比如: - [Android ANR Analyzer](https://github.com/ACRA/acra) (ACRA项目的一部分,但主要用于错误报告,也可以分析ANR) - 在线ANR分析工具(需谨慎,因为上传日志可能涉及隐私) 6. **分析堆栈跟踪的关键点**: 在堆栈跟踪中,我们需要关注主线程(通常名为“main”)的状态。常见的导致ANR的原因有: - 在主线程中进行网络操作 - 主线程中进行文件读写(尤其是大文件) - 主线程中进行复杂的计算 - 死锁 7. **检查CPU使用情况**: ANR文件中通常会包含发生ANR时CPU的使用情况,我们可以查看是否有其他进程或线程占用了大量CPU,导致我们的应用得不到足够的资源。 8. **检查内存信息**: 有时ANR是由内存不足引起的,因此查看内存信息也很重要。 9. **使用`strict mode`预防**: 在开发阶段,我们可以启用严格模式(StrictMode)来帮助检测主线程上的磁盘操作或网络访问。 注意:由于ANR文件名中包含时间戳,我们可以知道问题发生的具体时间,这有助于结合其他日志进行定位。 由于用户的问题是关于特定文件(anr_2025-10-21-10-29-04-308)的分析,因此我们主要关注如何分析这个文件的内容。 步骤建议: 1. 获取文件:通过adb或从设备上直接导出(如果有权限)。 2. 打开文件,查看主线程堆栈,定位到代码中导致阻塞的位置。 3. 分析堆栈,查看是否有明显的长时间操作在主线程中。 4. 检查文件中的CPU负载和内存信息,看是否有系统资源瓶颈。 5. 如果堆栈信息不足以定位,可能需要重现问题并使用调试工具(如Perfetto)进行更详细的跟踪。 注意:如果用户是开发者,那么他们应该能够在自己的代码中找到对应的堆栈位置。如果是系统应用或没有源码,可能需要反编译或者查看系统日志。 由于ANR文件可能包含敏感信息,请确保在安全的环境下处理。 生成相关问题: 1. 如何在没有root权限的情况下获取ANR文件? 2. ANR文件中常见的堆栈信息有哪些模式? 3. 如何预防ANR的发生? 4. 使用Perfetto分析ANR的步骤是什么? </think>### 分析 ANR 文件的方法工具 ANR(Application Not Responding)文件是 Android 系统在应用主线程阻塞超过 5 秒时生成的诊断日志,文件名格式通常为 `anr_年------序列号`(如 `anr_2025-10-21-10-29-04-308`)。以下为分析方法和工具: --- #### **一、核心分析方法** 1. **定位主线程阻塞点** 检查文件中 `"main" pid=XXX` 部分的堆栈跟踪(stack trace),识别阻塞主线程的代码位置,例如: ```plaintext "main" prio=5 tid=1 Native | group="main" sCount=1 dsCount=0 flags=1 obj=0x74e8f7e0 | sysTid=12345 nice=-10 cgrp=default sched=0/0 handle=0x7f8f4e4500 | state=S schedstat=( 123456789 987654321 1234 ) utm=10 stm=15 core=0 HZ=100 | stack=0x7fe9bc4000-0x7fe9bc6000 at com.example.app.MainActivity.longOperation(MainActivity.java:25) <-- 阻塞点 ``` 2. **检查 CPU 负载** 在文件末尾的 `CPU usage` 部分,确认 ANR 发生时: - 应用进程的 CPU 是否达到 100% - 是否有其他进程(如系统服务)过度占用 CPU 3. **分析锁竞争** 搜索文件中 `held by` 关键字,检查线程间死锁或资源争用: ```plaintext "Thread-2" waiting for lock <0x0f1e3d88> held by "main" ``` --- #### **二、专业工具推荐** 1. **Android Studio 内置工具** - **Logcat**:直接解析 ANR 文件堆栈信息 - **Profiler**:结合 CPU 性能分析定位耗时操作 - **Layout Inspector**:检查 UI 线程阻塞(适用于界面卡顿ANR) 2. **命令行工具** - `adb pull /data/anr/anr_2025-10-21-10-29-04-308`:导出文件 - `adb bugreport`:获取完整的系统诊断包(包含所有 ANR 文件) 3. **第三方工具** - **[Perfetto](https://perfetto.dev/)**:可视化分析系统级性能数据 - **[ANR-WatchDog](https://github.com/SalomonBrys/ANR-WatchDog)**(开发阶段预防):主动检测 ANR 4. **在线解析工具** - **[GitHub: ANR analyzer](https://github.com/google/anr-analyzer)**:自动提取关键信息 ```bash java -jar anr-analyzer.jar anr_2025-10-21-10-29-04-308 ``` --- #### **三、操作流程** 1. **导出文件** ```bash adb shell ls /data/anr # 列出 ANR 文件 adb pull /data/anr/anr_2025-10-21-10-29-04-308 # 导出到本地 ``` > 注:需开启 USB 调试且设备已 ROOT,否则通过 `adb bugreport` 导出完整报告后解压提取。 2. **关键检查项** - 主线程堆栈中是否有 `Binder` 调用、文件 I/O 或网络请求 - CPU 使用率是否异常(如系统进程占比 >60%) - 内存不足警告(如 `lowmemorykiller` 日志) 3. **代码修复建议** - 耗时操作移至工作线程(如 `AsyncTask` 或 `Coroutine`) - 避免主线程同步 IPC 调用 - 使用 `StrictMode` 检测磁盘/网络操作[^1] --- #### **四、高级场景** - **系统级 ANR**:若进程名为 `system_server`,需检查系统服务(如 AMS、WMS) - **Native 层阻塞**:文件中出现 `nativePollOnce` 时,需使用 `systrace` 分析 - **后台 ANR**:关注 `BroadcastQueue` 或 `Service` 执行超时
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌川江雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值