Android アプリで ANR が発生した際の解析方法をメモします。
ANR の解析には Bugreport を使用します。
adb bugreport
bugreport コマンドを実行すると、下記のような zip ファイルが生成されます。
bugreport-sdk_phone_x86-RSR1.210210.001.A1-2022-09-10-15-05-50.zip
zip ファイルを解凍すると、下記のファイルが生成されています。
bugreport-sdk_phone_x86-RSR1.210210.001.A1-2022-09-10-15-05-50/FS/data/anr/anr_2022-09-10-15-05-30-781
※ファイル名は ANR が発生した日時になります。
ファイルを開くと下記のような、メインスレッドで何の処理が行われていたかが出力されています。
"main" prio=5 tid=1 Sleeping
| group="main" sCount=1 dsCount=0 flags=1 obj=0x70e9b058 self=0xe0804610
| sysTid=9121 nice=-10 cgrp=top-app sched=0/0 handle=0xeedbf478
| state=S schedstat=( 3911734179 4176691909 1541 ) utm=230 stm=160 core=0 HZ=100
| stack=0xff0ae000-0xff0b0000 stackSize=8192KB
| held mutexes=
at java.lang.Thread.sleep(Native method)
- sleeping on <0x03003049> (a java.lang.Object)
at java.lang.Thread.sleep(Thread.java:442)
- locked <0x03003049> (a java.lang.Object)
at java.lang.Thread.sleep(Thread.java:358)
at com.ykato.sample.kotlin.MainActivity.onStart(MainActivity.kt:76)
上記の場合は、MainActivity.onStart(MainActivity.kt:76) で処理が止まり、ANR が発生したことがわかります。