临邑网站开发,上海网页设计公司排行,个人网站建设的步骤过程,wordpress 的主题释放双眼#xff0c;带上耳机#xff0c;听听看~#xff01;在Android开发中#xff0c;当程序发生异常时会抛出异常信息#xff0c;先说下三种常见类型#xff1a;列表内容KeyDispatchTimeout(谷歌default 5s#xff0c;MTK平台上是8s) –主要类型按键或触摸事件在特定…释放双眼带上耳机听听看~在Android开发中当程序发生异常时会抛出异常信息先说下三种常见类型列表内容KeyDispatchTimeout(谷歌default 5sMTK平台上是8s) –主要类型按键或触摸事件在特定时间内无响应BroadcastTimeout(10s)BroadcastReceiver在特定时间内无法处理完成ServiceTimeout(20s) –小概率类型Service在特定的时间内无法处理完成一些典型的ANR 问题场景1)最常见错误UI线程等待其它线程释放某个锁导致UI线程无法处理用户输入2)游戏中每帧动画都进行了比较耗时的大量计算导致CPU忙不过来3)Web应用中网络状态不稳定而界面在等待网络数据4)UI线程中进行了一些磁盘IO(包括数据库、SD卡等等)的操作在个别设备上因为硬件损坏等原因阻塞住了5)手机被其他App占用着CPU自己获取不到足够的CPU 时间片纯属误伤。排查分析的思路1、通过ANR 日志定位问题当ANR发生时我们往往通过Logcat和traces文件(目录/data/anr/)的相关信息输出去定位问题。主要包含以下几方面1)基本信息包括进程名、进程号、包名、系统build号、ANR 类型等等2)CPU使用信息包括活跃进程的CPU 平均占用率、IO情况等等3)线程堆栈信息所属进程包括发生ANR的进程、其父进程、最近有活动的3个进程等等。1.1首先通过Log来获取异常信息android系统会自动帮我们生成一个log日志输出文件在data/system/dropbox/下真机测试需要root权限模拟器在DDMS下可以查看。用这种方法出现问题根本不需要断点调试 直接定位到问题屡试不爽 。从LOG可以看出ANR的类型CPU的使用情况一般在如下几种情况会产生log 。1程序异常退出 uncaused exception2程序强制关闭 Force Closed (简称FC)3程序无响应 Application No Response (简称ANR) 顺便一般主线程超过5秒么有处理就会ANR步骤1.打开log文件 由于是ANR错误因此搜索”ANR ” 为何要加空格呢你加上和去掉比较一下就知道了 。 可以屏蔽掉不少保存到anr.log文件的无效信息定位到关键的事件信息如下01-15 16:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms (com.android.mms/.ui.SlideshowActivity)01-15 16:49:02.433 E/ActivityManager( 2466): Reason: keyDispatchingTimedOut01-15 16:49:02.433 E/ActivityManager( 2466): Load: 0.6 / 0.61 / 0.4201-15 16:49:02.433 E/ActivityManager( 2466): CPU usage from 1337225ms to 57ms ago:01-15 16:49:02.433 E/ActivityManager( 2466): sensorserver_ya: 8% 0% user 8% kernel / faults: 40 minor......01-15 16:49:02.433 E/ActivityManager( 2466): -com.android.mms: 0% 0% user 0% kernel01-15 16:49:02.433 E/ActivityManager( 2466): -flush-179:8: 0% 0% user 0% kernel01-15 16:49:02.433 E/ActivityManager( 2466): TOTAL: 25% 10% user 14% kernel 0% iowait 0% irq 0% softirq01-15 16:49:02.436 I/ ( 2466): dumpmesg /data/log/dumpstate_app_anr.log我们用自然语言来描述一下日志01-15 16:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms (com.android.mms/.ui.SlideshowActivity)翻译在16:49分2秒433毫秒的时候 ActivityManager (进程号为2466) 发生了如下错误com.android.mms包下面的.ui.SlideshowActivity 无响应 。01-15 16:49:02.433 E/ActivityManager( 2466): Reason: keyDispatchingTimedOut翻译原因 keyDispatchingTimeOut – 按键分配超时01-15 16:49:02.433 E/ActivityManager( 2466): Load: 0.6 / 0.61 / 0.42翻译5分钟10分钟15分钟内的平均负载分别为0.6 , 0.61 , 0.42我们大概知道问题是什么了问题是在点击按钮某时候可能处理不过来按钮事件导致超时无响应 。但我们不能准确的知道到底问题在哪儿 只是猜测 比如这个应用程序中多个IO操作的地方都在主线程中可能引起问题但不好判断到底是哪个 所以我们目前掌握的信息还不够 。于是我们再分析虚拟机信息 搜索“Dalvik Thread”关键词快速定位到本应用程序的虚拟机信息日志1.2通过分析trace文件得到ANR信息(真机导出模拟机在DDMS下查看)如果ANR发生对应的应用会收到SIGQUIT异常终止信号dalvik虚拟机就会自动在/data/anr/目录下生成trace.txt文件将异常信息写入到traces文件中系统会记录异常的位置、CPU和内存当时的使用情况通过查看日志基本就能判断问题所在。接下来用adb shell命令导出该文件通过shell命令就可以了。adb pull /data/anr/traces.txt d:/ 》意思是将手机上的traces.txt导出到电脑的d目录下或者1、adb shell2、cat /data/anr/xxx /mnt/sdcard/yy/zz.txt3、exit4、adb pull /mnt/sdcard/yy/zz.txt d: ,即可将文件导出到了d盘。在发生ANR时步骤1. 找到ANR关键字(大写匹配)2. 向上查找timeout关键字这个时候能找到ANR的原因如 Application do too much work in main thread 等。3. 查看trace 文件找出出现的最终原因。测试过程发现ANR的现状1、在平常测试中ANR基本测试不到因为ANR基本发生在垃圾设备中弱网络频繁操作。2、问题不必现即使看到了问题定位麻烦要去data/anr.txt 文件里面查找。必须root,没有对应关系分析复杂导出文件就必须依赖手机零距离。由于anr问题不必现因此引入以下ANR检测工具当anr问题出现时自动dump手机中的日志信息如trace文件、堆栈信息基本原理检测到UI主线程卡顿时间超过设定的时间如4s即dump trace文件以及堆栈信息同时抛出异常收集信息根据这些文件信息即可定位到发生anr的原因1.3在源代码中插入ANR检测工具(BlockCanary、StrictMode)1.4使用第三方SDK输出Crach信息到后台服务器如腾讯bugly 和umeng