布局优化:
1、使用层级少的布局,LinearLayout和FrameLayout优于RelativeLayout;
2、单一布局实现不了时,会进行嵌套布局,一般RelativeLayout优于嵌套布局;
3、采用include复用布局,merge减少布局的层级,viewstub按需加载。
绘制优化:
onDraw方法要避免大量的操作
1、避免创建新的临时对象,因为onDraw方法可能被频繁调用;
2、不要做耗时操作或者成千上万次的循环操作等。
内存泄漏优化:
1、静态变量导致的:因为静态变量会持有当前Activity;
2、单例模式导致的:因为单例模式的生命周期与Application一致,当它持有外部类时,可能导致内存泄漏;
3、属性动画导致的:无限循环动画没有在onDestory中停止导致的,因为动画会持有view,view又持有Activity,从而导致Activity不能被回收;
响应速度优化和ANR:
1、核心是不在主线程做耗时操作,采用异步去实现。ANR有以下几种情况:
(1)5s内无法响应屏幕触摸或键盘输入事件;
(2)广播在10s内没有执行完成
分析的话,看data/anr目录下的traces.txt
ListView优化:
1、采用ViewHolder;
2、在getView中避免耗时操作;
3、根据滑动状态来控制任务的执行频率;
4、尝试开启硬件加速。
Bitmap优化:
1、采用BitmapFactory.Options来根据需要对图片采样,主要用到inSampleSize等参数。
线程优化:
1、线程池
性能优化建议:
1、避免创建过多的对象;
2、不要过多使用枚举;
3、常量请使用static final来修饰;
4、使用一些Android特有的对象,如SparseArray和Pair等;
5、适当使用软引用和弱引用;
6、采用内存缓存和磁盘缓存;
7、采用静态内部类,避免内存泄漏。
内存泄漏分析工具MAT(独立版):
1、需要内存分析文件hprof;
2、使用Android SDK/platform-tools提供的命令hprof-conv,转换下文件格式,使其能够被MAT识别;
3、常用的Histogram(查看不同类型的buffer的数量和占用内存的大小)和Dominator tree(把内存中的对象按照大小排序,以及他们的引用关系);
4、内存泄漏分析主要看Dominator tree--》path to gc roots,看到引用关系。