Android 性能优化

前几年,Google 发布了关于 Android 性能优化典范的系列专题,帮助开发者创建更快更优秀的 Android App。课程专题不仅仅介绍了 Android 系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议。

相关学习整理可以前往胡凯大佬的博客阅读,感谢他的无私分享:

Android 的性能优化方法

布局优化
  • 删除布局中无用的组件和层级,有选择地使用性能较低的 ViewGroup,如 RelativeLayout。
  • 使用 <include> 标签用于布局文件的重用,简洁高效。
  • 使用 <merge>标签和 <include> 配合,可以减少布局中的层级。
  • 使用 <viewstub> 标签,它具有按需加载的功能,当需要的时候才会将 ViewStub 中的布局加载到内存,提高了程序的初始化性能。
绘制优化
  • View 的 onDraw 方法中不要创建新的局部对象,因为 onDraw 会被频繁调用。
  • View 的 onDraw 方法中不要做耗时的任务,要求每帧绘制时间控制在 16 ms 以内。
内存泄漏优化

可能导致内存泄露的场景很多,例如静态变量、单例模式、属性动画、AsyncTask 以及 Handler 等等,在使用的时候记得处理释放。

响应速度优化和 ANR 日志分析
  • Android 规定:Activity 如果 5 秒内没有响应屏幕触摸事件或者键盘输入事件就会 ANR,而 BroadcastReceiver 如果 10 秒内没有执行完操作也会出现 ANR。
  • 当一个进程发生了 ANR 之后,系统会在 /data/anr 目录下创建一个文件 traces.txt,通过分析这个文件就能定位ANR的原因。
ListView 和 Bitmap 优化
  • ListView 优化:采用 ViewHolder 并避免在 getView 方法中执行耗时操作;根据列表的滑动状态来控制任务的执行频率;尝试开启硬件加速来使 ListView 的滑动更加流畅。
  • Bitmap 优化:主要是设置 BitmapFactory.OptionsinSampleSize 采样率属性来加载所需尺寸的图片,详情可参考 Bitmap 的加载和 Cache
线程优化

采用线程池,避免程序中存在大量的 Thread,详情可参考 Android 的线程和线程池

一些优化建议
  • 避免创建过多的对象
  • 不要过多使用枚举,枚举占用空间比整型大
  • 常量尽量使用 static final 来修饰
  • 使用一些 Android 特有的数据结构,比如 SparseArrayPair 等,它们都具有更好的性能
  • 适当使用软引用和弱引用
  • 采用内存缓存和磁盘缓存
  • 尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露

内存泄漏分析 MAT 工具

Eclipse Memory Analysis Tools (MAT) 是一个分析 Java堆数据的专业工具,用它可以定位内存泄漏的原因。

提高程序的可维护性

  • 命名要规范
  • 注意代码的排版
  • 仅为非常关键的代码添加注释,前提是要有一个良好的命名风格