布局优化主要有以下方向:
- 减少布局层级
- 减少inflate布局的时间,原生加载XML的方式需要IO + 反射操作
- 减少过度绘制
可以使用工具:
- Layout Inspector:查看当前布局层级
- systrace:查看每一帧的时间和方法调用
- Choreographer:接收vsync垂直同步信号,可以用来计算帧率
- LayoutInflater.Factory/LayoutInflater.Factory2: 获取每个View创建的耗时
布局层级优化方式
- 使用ConstraintLayout
- 减少布局嵌套,层级不要太深,使用merge标签等
减少主线程布局创建时间的方式:
- 使用AsynclayoutInflater异步创建布局,这种方式是把耗时操作放到了子线程,但是会缺少TextView -> AppCompatTextView等兼容效果
- 使用纯代码的方式编写布局,new View(context),复杂、繁琐,不好维护
- 使用第三方库如X2C等,使用xml编写布局,在编译时转成Java代码,这种方式同样缺少TextView -> AppCompatTextView等兼容效果,且有些xml属性不支持
- 使用Jetpack Compose,声明式UI,应该是未来的趋势了
减少过度绘制
- 减少不必要的背景设置,减少复杂shape等
- 自定义View的时候,使用Canvas的clipRect方法避免绘制被遮盖的内容