2015年Google在YouTube上发布了关于Android性能优化典范的专题,通过一系列短视频来帮助开发者创建更快更优秀的Android应用,课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议,地址是:https://www.youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
性能优化方法
主要有:
- 布局优化
- 绘制优化
- 内存泄漏优化
- 响应速度优化
- ListView 优化
- Bitmap 优化
- 线程优化
- 一些性能优化建议
布局优化
思想是减少布局的层级。
有选择的使用一些性能不高的布局:如 RelativeLayout,它的布局需要花费更多的时间。
使用 <inclue>
、<merge>
、和 ViewStub
绘制优化
避免在 onDraw()
中执行大量的操作。
避免在 onDraw()
中创建新的局部对象,因为 onDraw()
会被多次调用,会导致频繁 GC。
不能做耗时操作。
内存泄漏优化
避免写出有内存泄漏的代码,利用 MAT 等工具查找。
- 静态变量
- 单例
- 属性动画
响应速度优化和 ANR 日志分析
避免将耗时操作放在主线程中执行。
Activiy 5s 无法响应屏幕触摸事件就会发生 ANR,BroadcastReceiver 是 10s。
一个进程发生 ANR 后,系统会在 /data/anr 创建一个文件 traces.txt
ListView 和 Bitmap 优化
ListView
- 复用 ViewHolder
- 当列表在滑动时不适合做大量异步认为
- 可以开启硬件加速
Bitmap
通过 BitmapFactory.Options
根据需要对图片进行采样,利用 inSampleSize
进行裁剪减小 Bitmap 的大小。
线程优化
采样线程池,复用线程。控制线程的最大并发数。
一些建议
- 避免创建过多的对象;
- 不要过多使用枚举,枚举占用的内存空间要比整型大;
- 常量请使用static final来修饰;
- 使用一些Android特有的数据结构,比如SparseArray和Pair等,它们都具有更好的性能;
- 适当使用软引用和软引用;
- 采用内存缓存和磁盘缓存;
- 尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露。
MAT 分析工具
全称 Eclipse Memory Analyzer。
下载地址:http://www.eclipse.org/mat/downloads.php
提高程序的可维护性
- 命名规范
- 代码留出适当的空白区分不同的代码块
- 只给关键的地方写注释
一段繁琐的业务逻辑,应该适当拆分为几个小的函数或者类。