要做到上面的测试环境需要具备以下几点:
(1)adb shell
(2)echo 3>/proc/sys/vm/drop_caches(清除系统cache)
(3)top -d 1 | grep com.baidu.BaiduMap(以百度为例,每一秒打印一次资源利用情况)
由于使用了复合查询”管道符“的方式,所以必须拥有root权限,否则grep的命令无法识别。
在这里我们看到cmd并没有显示出所对应的列的标题,所以我们可以单独通过top命令来了解到:
至于以上各列的含义我不说我想大家也应该猜得到了,在这里仅说一下我们要用到的两个参数,其他的可以再网上查询了解:
|--CPU%:CPU占用率
|--RSS:实际占用的物理内存数,单位KB
我们可以针对不同的业务,打印出不同的“标签”,用于区别现在从事的那个业务,并为后期分析各业务模块中CPU和内存的占用以及对比使用。
ANR本质是一个性能问题,即主线程中的耗时 *** 作造成主线程堵塞,导致应用失去响应能力。用户触摸 *** 作InputEvent:5s内无响应触发ANR提示;
广播Broadcast:前台广播10s和后台广播60s会触发ANR;
服务Service:前台进程Service20s和后台进程Service200s会触发ANR;
而Service和Broadcast只会打印trace信息,不会提示用户ANRd窗,大部分可感知的ANR都是由于InputEvent引起的。
Android应用程序是通过消息来驱动的,Android某种意义上也可以说成是一个以消息驱动的系统,UI、事件和生命周期都和消息处理机制息息相关。Android的ANR监测方案也是一样,大部分就是利用了Android的消息机制。
InputEvent的ANR与上图有些不同,是在Native监控,但同样会堵塞主线程的消息队列。
一般来说有四种,分别为BlockCanay、ANR-WatchDog、SafeLooper和FileObserver。
BlockCanary一种非侵入式的轻量性能监控组件,原理巧妙的利用了Android原生Looper.loop中的一个log打印逻辑
这个log打印逻辑正是在Message消息分发前后,监控这两个逻辑之间的时间差就可以得到当前主线程的卡顿状态,如果超时则获取trace信息并上报,具体实现:
它的思路是开辟一个单独现场向主线程发送一个变量+1 *** 作,自我休眠自定义ANR的阈值,休眠过后判断变量是否+1完成,如果未完成则警告。
它主要是通过反射接管主线程Looper的功能,可以自由定制,但是进行message管理会有很大的性能损耗。
Android手机发生ANR后,会把信息存储在/data/anr/traces.txt文件,我们只需要监听这个文件的变化就可以知道是否发生了ANR。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)