标签(空格分隔):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)