ANR定位解决实战

作者: 奔跑吧李博 | 来源:发表于2023-11-04 00:43 被阅读0次

开始了,这里随便制造一个ANR。

        findViewById(R.id.tv_click).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    Thread.sleep(6000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
1.发生ANR
2. adb命令查看 data/anr目录下的ANR文件
adb shell ls /data/anr/
3. 导出bug文件

使用用于生成 bug 文件的命令

adb bugreport /Users/Libo/Desktop/bugReport

此时需要耐心等待导出进度条


4.打开文件查看ANR文件内容

打开其中的一个anr日志如下:

----- pid 23004 at 2023-11-04 23:32:04.239566780+0800 -----
Cmd line: com.example.onlyfortest
Build fingerprint: 'Xiaomi/star/star:13/TKQ1.220829.002/V14.0.9.0.TKACNXM:user/release-keys'
ABI: 'arm64'
Build type: optimized
Zygote loaded classes=20900 post zygote classes=1320
Dumping registered class loaders
[/data/app/~~NcJvErjtctDrtRo6jyhFMg==/com.example.onlyfortest-XO4snvMjZmyObpZv2EYzGQ==/base.apk!classes3.dex:/data/app/~~NcJvErjtctDrtRo6jyhFMg==/com.example.onlyfortest-XO4snvMjZmyObpZv2EYzGQ==/base.apk!classes2.dex:/data/app/~~NcJvErjtctDrtRo6jyhFMg==/com.example.onlyfortest-XO4snvMjZmyObpZv2EYzGQ==/base.apk], parent #1
Done dumping class loaders

...

"main" prio=5 tid=1 Sleeping
  | group="main" sCount=1 ucsCount=0 flags=1 obj=0x718c2eb8 self=0xb400007c14642c00
  | sysTid=23004 nice=-10 cgrp=top-app sched=0/0 handle=0x7cbce424f8
  | state=S schedstat=( 1869109042 3774518520 32803 ) utm=36 stm=150 core=5 HZ=100
  | stack=0x7ffc03b000-0x7ffc03d000 stackSize=8188KB
  | held mutexes=
  at java.lang.Thread.sleep(Native method)
  - sleeping on <0x0fb52838> (a java.lang.Object)
  at java.lang.Thread.sleep(Thread.java:450)
  - locked <0x0fb52838> (a java.lang.Object)
  at java.lang.Thread.sleep(Thread.java:355)
  at com.example.onlyfortest.MainActivity$1.onClick(MainActivity.java:18)
  at android.view.View.performClick(View.java:7548)
  at android.view.View.performClickInternal(View.java:7525)
  at android.view.View.-$$Nest$mperformClickInternal(unavailable:0)
  at android.view.View$PerformClick.run(View.java:29562)
  at android.os.Handler.handleCallback(Handler.java:942)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loopOnce(Looper.java:210)
  at android.os.Looper.loop(Looper.java:299)
  at android.app.ActivityThread.main(ActivityThread.java:8261)
  at java.lang.reflect.Method.invoke(Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:559)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:954)
Traces.txt文件内容:

在文件中搜索"main",获取主线程报错的位置,这里找到了耗时ANR的原因,MainAcyivity里面的onClick方法使用了Thread.sleep导致的耗时。

参考:

https://www.freesion.com/article/17131069107/

相关文章

网友评论

    本文标题:ANR定位解决实战

    本文链接:https://www.haomeiwen.com/subject/xkcnidtx.html