1、Android性能优化包括:
布局优化、绘制优化、内存优化、响应速度优化、bitmap优化、线程优化等
2、布局优化的思想很简单,就是尽量减少布局文件的层级,减少Android绘制时的工作量
布局优化的方法:
1、删除布局中无用的控件和层级,有选择性地使用性能较低的ViewGroup。例如:布局中既可以使用LinearLayout又可以使用RelativeLayout的时候,采用LinearLayout;但是单纯地通过一个LinearLayout无法实现产品效果,需要通过嵌套的方式来完成的时候,还是采用RelativeLayout。
2、采用<include>标签、<merge>标签和ViewStub。include主要用于布局重用,merge标签一般和include标签配合使用,可以减少布局的层级,ViewStub则是提供了按需加载的功能,当需要的时候才会将ViewStub中的布局加载到内存,这样可以提高程序的初始化效率。
merge主要依赖于include它的父布局,如果父布局是一个垂直方向的LinearLayout,include里的布局也是LinearLayout的话,就可以用merge标签来代替,这样可以减少一层布局层级,但是merge标签必须是根节点。
ViewStub继承了View,它非常轻量级且宽高都是0,因此本身不参与任何布局和绘制的过程,存在的意义在于按需加载。比如网络异常时的界面、进度条等,没有必要在整个界面初始化的时候将其加载进来的,通过ViewStub可以做到在使用的时候再加载,调用的方法是inflate(),提高了程序的初始化性能。
ViewStub使用的注意事项:
- ViewStub标签需要必须通过android:layout属性指定待加载的视图资源文件ID,否则会抛异常(在inflate方法被调用前,通过setLayoutResource也可以设置待加载的视图资源文件ID,但不建议这样做)。
- ViewStub标签的所有android:layout_打头的属性,都会替换待加载视图的跟布局对应属性
- 最好通过ViewStub的inflate方法加载视图,该方法会返回视图根节点。
- inflate方法只能调用一次,不建议通过setVisibility加载视图
- 如果需要通过findViewById查找待加载视图中的节点,需要在inflate方法执行之后,否则会找不到
3、绘制优化
绘制优化指的是View的onDraw方法要避免执行大量的操作:1、在onDraw中不要创建新的局部对象,2、onDraw方法中不要做耗时任务,也不要执行成千上万次循环。谷歌给出的View的绘制帧率是60帧,也就是每帧绘制时间不要超过16ms(1000/60=16ms)。
4、内存泄漏优化
静态变量导致内存泄漏、单例模式导致的内存泄漏、属性动画也会导致内存泄漏(解决方法是在activity的ondestory方法中调用animator.cancle()方法来停止动画)
5、响应速度优化和ANR日志分析
activity在5s内无响应、broadcaseReceiver在10s内未执行完操作,都会引起ANR。ANR的检查定位可以通过traces.txt文件分析来定位
adb pull /data/anr/traces.txt . .标识当前目录
6、bitmap优化
7、线程优化
线程优化的思想是采用线程池,避免程序中存在大量的Thread
8、其他优化建议
- 避免创建过多的对象
- 不要使用枚举,枚举占用的内存空间要比整型大
- 常量使用static final来修饰
- 适当使用软引用和弱引用
- 采用内存缓存和磁盘缓存
- 尽量采用静态内部类,避免潜在的由于内部类持续持有外部类的引用而导致内存泄漏