Android客户端性能优化方法笔记|青训营笔记

359 阅读1分钟

这是我参与「第四届青训营」笔记创作活动的第七天。这篇笔记主要是对安卓客户端性能优化方法的记录。


笔记

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客户端操作耗时的成因以及对应的性能优化方法。