本帖最后由 Android_Robot 于 2016-10-26 15:15 编辑
初探百度Android性能测试之ANR
1.2 如何避免ANR?
1) 运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)
2) 应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。(此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver,关于原因后续会有介绍,此处不是本文重点)
3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。
TraceView是android SDK中自带的一个性能测试工具,可以在Tools目录下找到。TraceView能很精确的查看到每一个类,每一个类方法的执行时间。APP卡顿我们只需要保留当时的traceview文件,通过查看该文件,就可以定位绝大部分问题。
通过Debug.startMethodTracing(String FileName)和Debug.stopMethodTracing()来记录一段时间内方法执行情况。
在主线程中不停的插入一个轻量级别的操作,如果该变量在指定的时间内,没有改变,则说明此刻APP卡顿。卡顿工具工具就是根据[url=]https://github.com/SalomonBrys/ANR-WatchDog[/url]项目改进而成的。把ANR这种警告变成错误让APP闪退,持久化当时信息。
原理图: 问题背景:
百度国际化浏览器初次安装App,点击icon后,明显卡顿或者ANR,QA手工测试无法定位,RD优化代码多次依旧找不到问题的节点。
测试方法: 百度国际化浏览器加入卡顿工具jar,代码中初始化。测试结果分析。
在打开traceview 文件后,通过 real Time/Call 从大到小排序,找到对应的与代码相关消耗时间最大的方法。 我们能够看到很明显的看出FrameWindow.initDataBase()方法占用CPU过长达到3S左右了,距离5S很接近,通过查看代码,结合业务逻辑,得知此处为数据库初始化,并且主要是标签数据库初始化。
从整个APP来看,启动页面初始化标签数据库并没有错,但是此刻本身逻辑就非常多,标签数据库初始化后并没有马上使用到,而是到二级页面才有查询动作,总的来说,就是增加资源紧张。
建议:标签数据库什么时候使用,什么时候初始化。建议放到二级页面初始化,减少页面App页面启动的负荷,减少冷启动时间,避免卡顿和ANR。并且标签数据库初始化放在线程中。
其他精华资源推荐:
|