Android客户端初识性能优化及工具 | 青训营笔记

167 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

初识性能优化及工具

为什么做性能优化

性能优化带来体验的改善进而帮助业务指标的提升

从更长的时间范围来看:

  • 硬件性能提升速度变缓
  • ARM平台受益于架构和工艺的演进,最近几年趋势比X86平台好
  • 多核带来的提升取决于可以真正并执行的部分

未来?

  • 未来会有新的材料和工艺来驱动芯片性能的进一步提升,但是目前还没有成熟
  • 移动处理器还受到电池技术的限制
  • 软件的性能优化仍可持续发展带来提升

性能优化是什么

性能优化分类 流畅性优化 首先我们需要了解Android的线程结构

image.png

界面刷新

image.png

卡断感产生

image.png

image.png

image.png

解决卡顿

image.png

资源优化

  • 资源:即Android手机和软件和硬件资源,通俗意义上应用依赖的移动终端的有限资源和系统设置的数值,即功耗、存储、流量、系统参数、cpu,内存等。
  • Android端能做哪些资源优化

image.png

  • 不同的应用色系带来的功耗差异
  • 不同亮度带来的功耗差异

稳定性优化

  • ANR(Application Not Responding),即应用程序无响应。如果Android应用的界面线程处于阻塞状态时间过长,会触发App ANE错误。如果应用位于前台,系统会向用户显示—一个对话框,ANR对话框会为用户提供强行退出应用或等待的选项

image.png

系统及优化

移动操作系统和硬件厂商的性能优化

image.png

最佳性能工具选型

  • 性能监控价值
  • 监控和优化相生相伴
  • 监控有攻也有防
  • 攻是为了发现现有问题,指导优化方向
  • 方是为了发现劣化问题,及时止损
  • 线上监控发现问题并聚合排序,线下监控作为
  • 线上辅助,并发版前置发现问题

CPU呈现模式

  • 原理:系统通过记录每一帧的相关数据,然后通过图形的形式呈现
  • 优点:无需二次开发,简单易用
  • 缺点:并不完全准确,且无法明确指出造成卡顿问题的具体原因 image.png

Layertool

  • 原理:通过遍历View Tree信息,输出View层级关系
  • 优点:清楚明了,可以宏观感知ViewTree现状,也可以定制,帮助分析overdraw
  • 缺点:还不能够清楚明确的分析出UI的性能瓶颈

CPU Profiler

  • 原理:基于JVMTI
  • 优点:完整的方法调用栈输出,支持java。c。c++方法,耗时检测,上手简单
  • 缺点:性能损耗太大

Trace View

  • Instrument

  • 虚拟监听函数入口回调,Enter/Exit/Unwind

  • 耗时点:读时间、写数据到buffer。加锁等指令 Sample

  • 通过定时抓取多次堆栈diff,近似确定函数的进入和退出时间

  • 耗时点:堆栈diff、同instrument

  • 间隔抓取堆栈的时间越长性能损耗越少,而越会导致短函数检测不到

Systrace

  • ftrace:debugfs采集和读取trace数据,记录trace event
  • atrace:用户检测trace跟踪,聚合所有的trace evert
  • 系统发trace数据:锁监控等
btrace(aka rhea)进阶
  • rhea-systrace:全函数插桩,自动生成TRace代码,对层数做限制,性能损耗50%
  • rhea-mtrace:全函数插桩,抛弃systrace,自己统计函数耗时,最后数据展现同systrace,自己统计函数耗时,最后数据展现同systrace
  • rhea-atrace:优化systrace性能,聚合更多性能数据:类加载、lock、io等 检查出功耗问题

battery Historian

image.png

如何做性能优化

现状分析————耗时成因

  • CPU Time
  • 循环,反射,序列化/反序列化。类解析
  • IO Wait
  • IO 操作,等待IO返回结果
  • IPC
  • Binder调用耗时 Lock Wait 主线程是等锁状态,等待其他线程或自己超时唤醒 CPU Schedule 主线程是可执行状态,但是获取不到CPU时间片

现状分析————运行环境归因

  • 根据耗时成因归类

  • 根据运行所在线程环境采用不同策略 现状分析————抖音启动耗时归因

  • Cold Start

  • Creat process

  • ContentProvider init

  • Application #Creat

  • Aim for <3seconds

  • warm Start

  • Activity #Create

  • Inflate view hierarchy

  • Aim for <1seconds

  • Hot Start

  • Activity #onStart()

现状分析————渲染分析

image.png image.png

image.png

性能优化案例分享

image.png

UI-构建解决方案

  • 耗时成因:xml IO、class反射、创建view、Asset资源大锁 抖音解决方案
  • Andlnflater:解决xml性能问题-外界方案x2c
  • Legolnflate:高优先级的启动预加载方案
  • Asynclflater:随时随地预加载,不与具体逻辑绑定,生命周期存活,自定义清理周期

渲染耗时优化

  • 移除不必要的背景图
  • 修改不合理布局
  • 写高效合理布局
  • 移除默认的Window背景
  • 绘制层级优化
异步渲染
  • SufaceView :采用独立的线程进行绘制和渲染,生命周期需要自己控制
  • Jeppack Compose:基于组合优先继承的思想,重新设计一套解耦UI框架
  • LItho:复杂UI下的高性能渲染框架
  • 扁平化:Litho采用Yoga完成组件布局measure和layout,实现布局扁平化
  • 组件化:LItho使用Drawable作为Node绘制单元,实现布局的细粒度复用和异步计算布局的能力
  • 缺点:不支持现有逻辑,需要重新实现