安卓性能优化相关

项目开发已久,趁空做UI绘制,ANR分析,工具考虑有三
1.Android自带工具profiler(包含内存占用,CPU使用,网速,点击,页面销毁事件等功能)
2.BlockCanary工具(检测UI卡顿工具,基于mainLooper的时间打印)
3.UI过度绘制(手机开发者模式下,打开GPU过度绘制,颜色会由浅到深红,4次以上覆盖绘制,会深红)

1.首先进行profiler相关尝试(studio版本4.0.1)

首先运行你的应用,底边栏会出现


image.png

该工具能检测页面的一些事件,内存占用,cpu使用率,网速,点击操作等,


image.png

image.png

当初的设想是通过最上面的事件时间去监控应用的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过度绘制,点击打开


image.png

以微信为例,颜色由浅到深,越深的绘制次数越多,大于4次基本一个颜色了,找到红彤彤的,看看布局,或减少层级,或减少绘制,比较花功夫

周边一圈,貌似也就这些方案,寻高效解决方案

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。