0%

Android ANR日志获取并分析

获取trace文件

1、获取ANR日志 adb bugreport,导出trace文件,分析trace, pid, tid

2、解压日志后/data/anr路径下根据发生时间选择对应文件

3、—– pid 17172 at 2025-07-08 15:53:02 —–

根据当前pid分析出17172进程出现问题并且记录发生时间

分析ANR

  1. 通过进程ID17172搜索定位到
1
2
3
4
5
6
"main" prio=5 tid=1 Native 
| group="main" sCount=1 dsCount=0 flags=1 obj=0x7261bba8 self=0x7e35a97c00
| sysTid=17472 nice=-10 cgrp=default sched=0/0 handle=0x7e37005ed0
| state=S schedstat=( 13473368664 317028758 13398 ) utm=1066 stm=281 core=5 HZ=100
| stack=0x7fdb9c2000-0x7fdb9c4000 stackSize=8192KB
| held mutexes=
  1. 解释字段含义
    “main” prio=5 tid=1 Native
    1
    2
    3
    4
    "main":线程名称(主线程)。 
    prio=5:线程优先级(5 是默认优先级,范围 1~10,值越大优先级越高)。
    tid=1:线程 ID(1 通常是主线程)。
    Native:线程当前在执行 本地代码(JNI/NDK),而非 Java/Kotlin 代码。

group=”main” sCount=1 dsCount=0 flags=1 obj=0x7261bba8 self=0x7e35a97c00

1
2
3
4
5
6
group="main":线程所属组(主线程组)。 
sCount=1:线程被挂起(suspend)的次数。
dsCount=0:调试器挂起次数(0 表示未被调试器暂停)。
flags=1:线程状态标志(1 通常表示线程处于活跃状态)。
obj=0x7261bba8:线程关联的 Java 对象地址。
self=0x7e35a97c00:线程本身的 Native 地址。

sysTid=17172 nice=-10 cgrp=default sched=0/0 handle=0x7e37005ed0

1
2
3
4
5
sysTid=17172:系统级线程 ID(与 ps -t 命令看到的 ID 一致)。 
nice=-10:线程的调度优先级(-20~19,值越小优先级越高,0 是默认值)。
cgrp=default:线程所属的 CPU 调度组(默认组)。
sched=0/0:调度策略(0 表示 SCHED_NORMAL,即普通优先级)。
handle=0x7e37005ed0:线程句柄的内存地址。

state=S schedstat=( 13473368664 317028758 13398 ) utm=1066 stm=281 core=5 HZ=100

1
2
3
4
5
state=S:线程当前状态(S 表示休眠/Sleeping,其他常见状态:R=运行中,D=不可中断休眠)。 
schedstat=( 13473368664 317028758 13398 ):调度统计信息,格式为 (运行时间ns, 等待时间ns, 执行次数)。
utm=1066 stm=281:线程在用户态(utm)和内核态(stm)的累计运行时间(单位:jiffies,1 jiffy=10ms)。
core=5:线程最后运行的 CPU 核心编号。
HZ=100:系统时钟频率(100 表示每秒 100 次 tick)。
字段 当前值 正常参考值 问题指示
nice -10 0 异常提高优先级,需审查代码
schedstat 13.47秒运行 <100ms 主线程重度占用 CPU
utm/stm 10.66s/2.81s <1s 存在未异步化的耗时任务