Android性能优化

启动优化

延迟加载,比如通过IdleHandler在系统空闲时加载模块
异步初始化

缺点:界面展示了,但是用户操控出现卡断

Android 性能优化 - 启动优化
How to Capture Heap Dump From an Android App
浏览 Systrace 报告
Dalvik 可执行文件格式
应用性能优化之VerifyClass

渲染性能优化

防止因视图层次结构导致性能下降包括两个目标:一个是实现视图层次结构扁平化,一个是减少 Double Taxation。布局耗时过长的一个常见原因是,View 对象的层次结构互相嵌套(层级过深)。每个嵌套的布局对象都会增加布局阶段的开销。层次结构越扁平,完成布局阶段所需的时间越少。

优化方案:

  • 使用 ConstraintLayout 而非 RelativeLayout 或 LinearLayout,因为这么做通常更高效,并且减少了布局的嵌套。不过,对于可通过 FrameLayout 实现的简单布局,还是建议使用 FrameLayout;
  • 如果使用 RelativeLayout 类,则可通过使用未设权重的嵌套 LinearLayout 视图,以更低的开销达到同样的效果。但是,如果您使用的是嵌套的加权 LinearLayout 视图,则布局开销会高得多,因为它需要多次布局传递;
  • 使用 RecyclerView 而不要使用 ListView,因为前者可以回收各个列表项的布局,这种方式不仅效率更高,而且可以提升滚动性能。
  • 布局中使用 <merge>来减少布局层次。
  • 使用ViewStub延迟加载视图
  • 降低透明度,比如一个字体颜色不要使用透明度的值,要使用RGB,而不是ARGB。
  • 移除布局中不必要的背景

性能和视图层次结构
Jetpack Compose 性能
检查 GPU 渲染速度和过度绘制
Android技术质量 是谷歌官方介绍的性能检查和优化措施。

频繁GC:申请大量对象、图片内存占用

包体积优化

性能工具介绍

Traceview(已废弃)
CPU 性能分析器

MethodTracing

通过MethodTracing可以查看方法调用的耗时,但是method tracing会导致虚拟机运行比正常情况要慢,所以该方式只能查看相对耗时。

使用方法:

  • 通过AndroidStudio的Profiler的CPU中可以抓取MethodTracing。
  • 也可以通过代码方式抓取,比如通过下面方式可以分析activity启动耗时:
1
2
3
4
5
6
7
8
9
10
11
//启动trace日志,比如在点击按键,启动一个Activity之前调用
Debug.startMethodTracing("${filesDir.absolutePath}/dmtrace.trace")

//停止日志,放在activity onCreate中即可
findViewById<View>(android.R.id.content).viewTreeObserver.addOnPreDrawListener {
Handler(Looper.getMainLooper()).post {
Debug.stopMethodTracing()
Log.d(TAG, "[rjy] stopMethodTracing")
}
true
}

trace文件导出后,使用AndroidStudio的Profile打开即可查看。

MethodTracing示意图

相关接口说明:

参考:通过对应用插桩生成轨迹日志

代码检查:Lint > Performance

AndroidStudio: Code > Inspect Code 可以启动lint检查,检查示意图:

Lint Performance示意图

参考资料

Android技术质量 是谷歌官方介绍的性能检查和优化措施。
Awesome-Android-Performance
Android 性能优化 - 启动优化
How to Capture Heap Dump From an Android App
浏览 Systrace 报告
Dalvik 可执行文件格式
应用性能优化之VerifyClass

FAQ

  1. Android Studio-Profiler连接失败,“no supported devices”,可以使用adb root来获取root权限,这样就可以解决连接不上的问题。