查看ANR日志

标签(空格分隔):Android改Bug技巧

【Android】抓取log(anr)

1、anr问题的log一般都在/data/anr/目录下,使用如下命令即可导出log
adb pull /data/anr/traces.txt d:/ =》意思是将手机上的traces.txt导出到电脑的d目录下,traces.txt有可能会有好几个文件

但是也会有该命令失效的时候。你能adb shell ls /data/anr/ 看到该文件,但是导出时会提示该文件不存在,原因没有去跟,但是导出的方式可以如下:
1、adb shell
2、cat /data/anr/xxx >/mnt/sdcard/yy/zz.txt
3、exit
4、adb pull /mnt/sdcard/yy/zz.txt d: ,即可将文件导出到了d盘。

情况分析

在如下情况下,Android会报出ANR错误:

– 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件
– BroadcastReceiver 没有在10秒内完成返回
通常情况下,下面这些做法会导致ANR
1、在主线程内进行网络操作
2、在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询)

如何避免KeyDispatchTimeout

1:UI线程尽量只做跟UI相关的工作
2:耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理
3:尽量用Handler来处理UIthread和别的thread之间的交互
(推荐使用RxAndroid和Agera)

ANR日志分析

找到以下字段
Cmd line:+包名
再寻找到SUSPENDED这个关键字进行查看

event_dispatcher" prio=5 tid=12 SUSPENDED
  | group="main" sCount=1 dsCount=0 obj=0x421996b0 self=0x5fd6e390
  | sysTid=19172 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1607919592
  | state=S schedstat=( 10429693196 5198577853 74520 ) utm=887 stm=155 core=1
  at java.lang.String.format(String.java:~1994)
  at java.lang.String.format(String.java:1973)
  at me.ele.okhttp.OkHttpFactory.getUserAgent(OkHttpFactory.java:90)
  at me.ele.gandalf.UploadLogTask.sendToServer(UploadLogTask.java:41)
  at me.ele.gandalf.UploadLogTask.upload(UploadLogTask.java:74)
  at me.ele.gandalf.EventQueue$2.run(EventQueue.java:138)
  at android.os.Handler.handleCallback(Handler.java:733)
  at android.os.Handler.dispatchMessage(Handler.java:95)
  at android.os.Looper.loop(Looper.java:136)
  at android.os.HandlerThread.run(HandlerThread.java:61)
    原文作者:饿o_o狼
    原文地址: https://www.jianshu.com/p/58a1921174e3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞