应用体验-布局优化
使用include布局、merge标签、ViewStub视图
可以使用HierarchyViewer层级查看器查看层级之间的关系,分析可以优化的空间
减少视图树层级:
- 在层级深的情况下尽量多使用RelativeLayout,不要使用绝对布局AbsoluteLayout;
- zaiListView等列表组件中尽量避免使用LinearLayout的weight属性;
- 将可复用的组件抽取出来通过<include>标签使用;
- 使用<ViewStub>标签加载一些不常用布局;
- 使用<merge>标签减少布局的嵌套层次
检测过度绘制:
通过“显示过度绘制区域”,找出浅红色和深红色区域,最小化过度绘制——找出过度重叠的区域,特别是不可兼得drawable对象和被绘制在其他控件上的背景,也应该查找那些背景为白色,并且父视图背景也设置为白色的区域。
应用体验-绘制优化
onDraw方法避免执行大量操作,不创建新的局部对象,不做耗时任务
ListView优化
使用ViewHolder,减少视图层级
内存优化
- 在onTrimMemory中释放UI资源,onStop中释放Activitiy资源,如网络连接,广播接收等
- 使用IntentService让Service完成任务后尽快结束
- 避免bitmap的浪费,使用成熟的ImageLoader框架,根据情况压缩图片资源
- 使用优化的数据容器
- 注意内存开销,例如,使用constants代替enums,后者的消耗通常是前者的两倍
- 使用资源混淆proguard、归档对齐zipalign、代码压缩minifyEnabled、资源压缩shrinkResource
- 优化整体性能,关注lint工具给出的建议
- 谨慎使用外部库
https://developer.android.google.cn/studio/command-line/zipalign?hl=zh-cn
内存泄漏
使用profiler获取应用内存使用情况,通过heap工具显示内存的异常增长
关注短时间快速增长或者GC非常频繁的情况,
使用LeakCnary查找内存泄漏:
原理——通过继承ContentProvider做到在application的创建前完成初始化,在create中完成安装。监控所有Activity的生命周期,并且在onDestory之后将改Activity添加到内存泄漏监控队列,也就是在RefWaatcher.watch中创建爱你一个KeyedWeakReference到被监控对象,接下来在后台线程中监测这个而引用是否被清除,如果没有将会触发GC如果引用仍然没有清除,就会将堆内存dump并且分析GC ROOTS的可达性分析建立引用链确定是否发生泄漏。结果回传到service中输出log并显示一个泄漏的消息通知
注意代码抽象与设计
合适的抽象能提升代码的灵活性与可维护性,