[关闭]
@ZeroGeek 2018-07-25T09:53:38.000000Z 字数 1216 阅读 561

性能分析指导篇

Android性能优化


渲染问题

过度绘制

Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源,找出界面滑动不流畅、界面启动速度慢、手机发热。

如何查看过度绘制?

设置 — 开发中选项 — 调试GPU过度绘制

原色:没有过度绘制
紫色:1 次过度绘制
绿色:2 次过度绘制
粉色:3 次过度绘制
红色:4 次及以上过度绘制

总结一下,优化步骤如下:

1、移除或修改Window默认的Background
2、移除XML布局文件中非必需的Background
3、按需显示占位背景图片
4、控制绘制区域

布局优化

布局太过复杂,层级嵌套太深导致绘制操作耗时,且增加内存的消耗。
目标就是,层级扁平化。

布局优化的建议:

第一个建议:可以使用相对布局减少层级的就使用相对布局,否则使用线性布局。
第二个建议:用merge标签来合并布局,这可以减少布局层次。
第三个建议:用include标签来重用布局,抽取通用的布局可以让布局的逻辑更清晰明了,但要避免include乱用。
第四个建议:避免创建不必要的布局层级。(最容易发生的!)
第五个建议:使用惰性控件ViewStub实现布局动态加载(注意:使用ViewStub加载的布局中不能使用merge标签)

工具:
Hierarchy Viewer(DDMS中)

渲染性能

https://blog.csdn.net/gjy211/article/details/52624788

GPU呈现模式分析(大致定位问题)

开发者选项 — GPU呈现模式分析 — 选择“在屏幕上显示为条形图”

工具:
GPU monitor

StrictMode

StrictMode意思为严格模式,是用来检测程序中违例情况的开发者工具。最常用的场景就是检测主线程中本地磁盘和网络读写等耗时的操作。

内存问题

内存浪费

什么时候使用ArrayMap呢?(而不用HashMap)

1、对象个数的数量级最好是千以内,没有频繁的插入删除操作
2、数据组织形式包含Map结构

为了避免Autoboxing行为Android提供了SparseArray,此容器使用于key为int类型。
SparseBooleanMap,SparseIntMap,SparseLongMap等容器,是key为int,value类型相应为boolean、int、long等。

避免使用枚举类型

内存泄露

工具:
Memory monitor
LeakCanary
MAT(Memory Analyzer Tool
GT(应该更适合测试同学测试APP性能)

lint静态代码分析工具

耗电问题

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注