项目开发已久,趁空做UI绘制,ANR分析,工具考虑有三
1.Android自带工具profiler(包含内存占用,CPU使用,网速,点击,页面销毁事件等功能)
2.BlockCanary工具(检测UI卡顿工具,基于mainLooper的时间打印)
3.UI过度绘制(手机开发者模式下,打开GPU过度绘制,颜色会由浅到深红,4次以上覆盖绘制,会深红)
1.首先进行profiler相关尝试(studio版本4.0.1)
首先运行你的应用,底边栏会出现
该工具能检测页面的一些事件,内存占用,cpu使用率,网速,点击操作等,
当初的设想是通过最上面的事件时间去监控应用的ANR,但是失败了。原因有以下几点
1.发现打开profiler进程监控之后,所有东西都变卡了,那这还玩个腿?
2.进入某个页面始终报某个so库native里部分东西报错,百度攻略为
----------->studio右边拦deviceFileExplorer,删除data/local/tmp/perfd文件夹,然后重插手机(虽然我失败了,还是不行)
但该工具,做为查看其他几点,memory,网速等效果不错,可以清晰看到内存是否飙升,GC是否频繁,是否内存泄漏等。
2.尝试BlockCanary
先去github看了看,好吧,4年没更新了。。抱着尝试的心态,接入了
1.项目接入(https://github.com/markzhai/AndroidPerformanceMonitor
)
App模块下build.gradle
debugImplementation 'com.github.markzhai:blockcanary-android:1.5.0'
releaseImplementation 'com.github.markzhai:blockcanary-no-op:1.5.0'
在你的项目Application下加入(AppBlockCanaryContext这个类自己去抄吧)
BlockCanary.install(this, new AppBlockCanaryContext()).start();
2.运行尝试,BlockCanary抄了LeakCanary的展示,布局基本一样的,然后随便点击几下其他的地方,到处点啊点,乱点,直到泄漏页面记录下东西。(这边自定义的卡顿监测为大于500ms),能看到如下页面
会报出什么时候有UI卡顿现象,卡顿的时间是多少(UI卡顿时间=主线程开始执行代码到方法结束消耗的时间),例如上图,显示2个time,
1.time=1286,这里是2个System.currentTimeMills()相减得到的
2.thread-time=402,这里是主线程实际运行时间,由2个SystemClock.currentThreadTimeMillis()相减得到
至于后面的堆栈。他把一次运行能打印的都打印了,并不是第一行报出来有问题就是有问题,堆栈信息基本还全,里面会有当次运行的你的各种java代码,view的mesure,draw等等,把block信息归结到一次打印的信息里,让你稍微直观点。慢慢找把。还有一种情况,页面打开时,刚好gc了,这就没办法的,会有误报,频发去解决频繁GC的问题把,内存抖动什么的,看看profiler,内存的上下波动情况
3.UI过度绘制,打开开发者模式,找到GPU过度绘制,点击打开
以微信为例,颜色由浅到深,越深的绘制次数越多,大于4次基本一个颜色了,找到红彤彤的,看看布局,或减少层级,或减少绘制,比较花功夫
周边一圈,貌似也就这些方案,寻高效解决方案