Android-性能优化

应用体验-布局优化

使用include布局、merge标签、ViewStub视图
可以使用HierarchyViewer层级查看器查看层级之间的关系,分析可以优化的空间

减少视图树层级:

  1. 在层级深的情况下尽量多使用RelativeLayout,不要使用绝对布局AbsoluteLayout;
  2. zaiListView等列表组件中尽量避免使用LinearLayout的weight属性;
  3. 将可复用的组件抽取出来通过标签使用;
  4. 使用标签加载一些不常用布局;
  5. 使用标签减少布局的嵌套层次

检测过度绘制:
通过“显示过度绘制区域”,找出浅红色和深红色区域,最小化过度绘制——找出过度重叠的区域,特别是不可兼得drawable对象和被绘制在其他控件上的背景,也应该查找那些背景为白色,并且父视图背景也设置为白色的区域。

应用体验-绘制优化

onDraw方法避免执行大量操作,不创建新的局部对象,不做耗时任务

ListView优化

使用ViewHolder,减少视图层级

内存优化

  1. 在onTrimMemory中释放UI资源,onStop中释放Activitiy资源,如网络连接,广播接收等
  2. 使用IntentService让Service完成任务后尽快结束
  3. 避免bitmap的浪费,使用成熟的ImageLoader框架,根据情况压缩图片资源
  4. 使用优化的数据容器
  5. 注意内存开销,例如,使用constants代替enums,后者的消耗通常是前者的两倍
  6. 使用资源混淆proguard、归档对齐zipalign、代码压缩minifyEnabled、资源压缩shrinkResource
  7. 优化整体性能,关注lint工具给出的建议
  8. 谨慎使用外部库
    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并显示一个泄漏的消息通知

注意代码抽象与设计

合适的抽象能提升代码的灵活性与可维护性,

你可能感兴趣的:(Android-性能优化)