1.渲染优化
- 使用Hierarchy Viewer 确保view在16ms完成渲染
- 开发者选项中打开Overdraw,尽量减少红色区域,增加蓝色区域
- 开发者选项打开Profile GPU Rendering,确保现状图大部分在绿色横线下
- 尽量少用透明度,带透明度的view会至少渲染两次
2.内存优化
工具:Memory Monitor,Allocation Tracker,Heap Tool
- 避免频繁GC
避免在for循环里面分配对象占用内存,需要尝试把对象的创建移到循环体之外,自定义View中的onDraw方法也需要引起注意,每次屏幕发生绘制以及动画执行过程中,onDraw方法都会被调用到,避免在onDraw方法里面执行复杂的操作,避免创建对象。对于那些无法避免需要创建对象的情况,我们可以考虑对象池模型,通过对象池来解决频繁创建与销毁的问题,但是这里需要注意结束使用之后,需要手动释放对象池中的对象。 - 避免内存泄露
(1). 注意加载大图时可能导致的OOM
(2). 可以使用第三方库 LeakCandary检查内存泄露 - 做好应用缓存
3.电量优化
- 尽量减少唤醒屏幕的次数与持续的时间,使用WakeLock来处理唤醒的问题,能够正确执行唤醒操作并根据设定及时关闭操作进入睡眠状态。
- 某些非必须马上执行的操作,例如上传歌曲,图片处理等,可以使用JobScheduler API进行定时任务,等到设备处于充电状态、或者电量充足或者是连接到WiFi的时候来处理。
- 把零散的网络请求打包进行一次操作。
4.代码优化
- 使用Lint检查代码
- 不在主线程做耗时操作,以免发生ANR
- 开发调试时打开 Strict Mode
自定义View优化
(1). Useless calls to onDraw():我们知道调用View.invalidate()会触发View的重绘,有两个原则需要遵守,第1个是仅仅在View的内容发生改变的时候才去触发invalidate方法,第2个是尽量使用ClipRect等方法来提高绘制的性能。
(2). Useless pixels:减少绘制时不必要的绘制元素,对于那些不可见的元素,我们需要尽量避免重绘。
(3). Wasted CPU cycles:对于不在屏幕上的元素,可以使用Canvas.quickReject把他们给剔除,避免浪费CPU资源。另外尽量使用GPU来进行UI的渲染,这样能够极大的提高程序的整体表现性能。使用SparseArray中的数据结构,比如ArrayMap,代替HashMap
- 使用普通static常量代替Enum
- onTrimMemory()中释放当前不需要的资源
- 避免异步回调
- 尽量避免使用static对象
- 避免把View添加到没有清除机制的容器里面
- 避免调用requestLayout()方法
- 尽量使用IntentService代替Service
5.App启动优化
- Application 的oncreate()中不要做耗时操作
- 某些库的初始化可以放到具体调用之前
- 添加启动闪屏页
6.apk体积优化
- 图片压缩,格式处理
- 如果只使用第三方库的少部分功能,采用更轻量的库
- 启用Proguard混淆来瘦身
- 开启shrinkResources,移除无用资源
- 使用Vertor Drawable替代传统的PNG/JPEG图片
更多类容查看:
胡凯性能优化系列:http://www.youkuaiyun.com/article/2015-01-20/2823621-android-performance-patterns
谷歌官方性能优化系列视频:https://www.youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE