这是我参与「第四届青训营」笔记创作活动的第七天。这篇笔记主要是对安卓客户端性能优化方法的记录。
笔记
Android客户端性能优化方法
1.现状分析
耗时成因
CPU Time: 循环,反射,序列化/反序列化,类解析
IO Wait: IO操作,等待IO返回结果
IPC: Binder调用耗时
Lock wait: 主线程是等锁操作,等待其他线程或自己超时唤醒
CPU Schedule: 主线程是可执行状态,但是获取不到CPU时间片
运行环境归因
根据耗时成因归因
根据运行所在线程环境采取不同的策略
主线程优化,运行时优化,后台线程优化
案例:抖音启动耗时归因
冷启Cold Start:创建进程 -> ContentProvider init -> Application#Create -> Aim for <3 seconds
温启Warm Start:Application#Create -> Inf;ate view hierarchy -> Aim for <3 seconds
热启Hot Start:Application#onStart()
渲染分析
渲染瓶颈:
渲染耗时(inflater, init, bind, measure/layout/draw, overdraw)
渲染频率(Animator FPS, Vsync Leak, requestlayout loop)
2.性能优化案例分享
UI构建
耗时成因:xml IO、class反射、创建view、Asset资源大锁
官方解决方案:AsyncLayoutInflater
抖音解决方案:
AndInflater:解决xml性能问题-外界方案X2C
LegoInflate:高优先级的启动预加载方案
AsyncInflater:随时随地预加载,不与具体逻辑绑定,生命周期存活,自定义清理周期
数据请求+解析
GSON解析优化
数据协议优化:json->protobuf
渲染耗时优化
移除不必要的背景图;修改不合理布局;写高效合理的布局;移除默认的Window背景;绘制层级优化
异步渲染
SurfaceView
采用独立的线程进行绘制和渲染,生命周期需要自己控制
Jetpack Compose
基于组合优于继承的思想,重新设计一套解耦的U框架
Ltho
复杂UI下的高性能渲染框架 github.com/facebook/li…
扁平化:Ltho采用Yoga完成组件布局measure和layout,实现布局的扁平化 facebook.github.io/yoga/
组件化: Ltho使用Drawable作为Node绘制单元,实现了布局的细粒度复用和异步计算布局的能力
缺点: 不支持现有逻辑,需要重新实现
总结
通过性能优化方法的学习,我了解到了Android客户端操作耗时的成因以及对应的性能优化方法。