鉴于在讨论 Android 性能问题的时候,卡顿(流畅性)、响应速度、ANR 这三个性能相关的知识点通常会放到一起来讲,因为引起卡顿、响应慢、ANR 的原因类似,只不过根据重要程度,被人为分成了卡顿(流畅性)、响应慢、ANR 三种,所以我们可以定义广义上的流畅性,包含了卡顿(流畅性)、响应慢和 ANR 三种,所以如果用户反馈说手机卡顿或者 App 卡顿(流畅性),大部分情况下都是广义上的卡顿(流畅性),需要搞清楚,到底出现了哪一种问题。
实际工作中,确实会用到的工具很少,基本靠log和perftto,听说过simperf。听过的分析中,也很少有人讲工具的整体性架构,导致工具的使用也是似懂非懂。没有掌握核心逻辑,一直浮于技术的表面。
1.性能分析中的可观测技术
现实中遇到经常遇到的性能问题,比如应用卡顿、启动慢,也会考虑去看整机状态(cpu,内存,io),也有看到部分耗时执行长(不确定是否有影响)。最初的想法是,拿到日志逐个分析。根据经验,查找关键字。没有信息,尝试加日志本地复现。整个过程费时费力,成效可能一般。
可观察技术,研究通过工具,来观测复杂的系统运行,用于了解系统内部运行过程、排查问题、寻找瓶颈优化。
1.1日志数据类型
Log类型:string类型存储,数据呈现方式是一条条文本数据。最基本类型,可转换成Metic或Trace类型。
Metric类型:聚焦数据某个维度上数值变化。
维度:cpu使用率、cpu频率、上下文切换次数等
数值:瞬时值(快照型)、与前次差值、时段区间统计值(统计聚合型)
除了具体数值,可以是枚举值,代表开关或者事件类型等(state类型)
Trace类型:标识事件发生的时间、名称、耗时。分析多个线程间复杂的调用关系时,trace类型是最方便的。
trace类型的分析场景:函数调用链、binder调用链、跨进程事件流跟踪
实际开发过程中,使用最多的是log和trace,metric可以通过指令抓取会混合在log中。trace可以用图像和文本两种方式打开,trace目前有systrace、anrtrace、iotrace
1.2数据获取方式
采集方法:静态代码(打点和控制开关)使用较多,动态代码(动态链接,如eBPF,内核开发使用多)使用较少
触发条件:无条件抓会导致量大,只能通过降低数据量缓解。有条件抓可识别异常场景,超过阈值抓取,阈值需要控制好。
落盘策略:考虑存储压力。目前使用的是RingBuffer,兼顾性能和存储,需考虑内存损耗及触发器的准确性。
实际开发中,采用静态代码打点,有条件抓取用来性能监控,无条件抓取用来调试,trace会使用RingBuffer方式,其他都是直接落盘。
1.3日志分析方式
文本分析:最常用
可视化分析:时间为横轴,对应事件放到各自泳道显示。代表是systrace
数据库分析:面对大量数据分析时,需要对数据格式化处理。
实际开发分析中,会自己开发工具将文本转换成excle,识别场景及常见异常。没有信息,再回到文本查找。systrace在应用相关场景首选。
2.谷歌提供的性能分析工具
2.1 Systrace
将系统和应用运行信息以图形化展示,比Log更直观(PS:Log和systrace的对应不完全一致,使用的是多套打点,一般来说log更全面)
设计思路:在系统关键操作(Touch操作、Power按钮、滑动操作等)、系统机制(input分发、View绘制、进程间通信、进程管理机制等)、软硬件信息(cpu频率调度信息、磁盘信息、内存信息等)的关键流程上,插入TracePoint,记录执行时间或值,系统收集各进程的TracePiont,写入到trace文件中。(TracePoint Java层使用android.os.Trace,Native层使用Atrace宏)
实际开发分析中,已被取代,打开信息缺失,打点方式可能还可参考学习
2.2 Perfetto
数据来源及实现原理和systrace相同,比systrace好用。
日志抓取方式:网页、命令行、手机、API
使用方式:图形、文本。可基于SQLlite转换成数据库文件,也可使用SQL语句查询。如SF cpu消耗量,大核运行线程
使用场景:
技术角度:响应速度、卡顿丢帧、ANR
用户角度:启动慢、跳转慢、动画卡、响应慢、滑动卡、加载慢、整机卡、无响应
实际开发中,会用基本操作,高级功能待研究,对ANR和磁盘内存信息认识不足
2.3 CPU Profiler
集成Perfetto、Simpleperf、Java Method Trace中cpu的分析功能
Java Method:从虚拟机获取函数调用栈信息,分析Java函数调用和耗时
C/C++ Function:用simpleperf抓取信息,从CPU性能监控单元PMU硬件组件中获取数据,分析C/C++函数调用和耗时
System Trace:用perfetto抓取信息,分析进程函数耗时、调度、渲染等情况,只能显示进程强相关信息且会过滤短时间,建议用perfetto分析
使用场景:
响应慢:启动慢、跳转慢、加载慢、响应慢等
不流畅:滑动不流畅、滑动不跟手、动画卡顿等
分析思路:先分析systrace定位问题,在使用后两种辅助定位卡顿函数
实际开发分析过程中未使用过,据说simpleperf也支持java层和native层的调用观察,待实践
2.4工具综合对比
3.关于器术道
势:习惯。分析问题的习惯,目前是先场景定位时间、再整机定位性能、再场景查找异常
器:工具。认识工具的能力及应用场景,目的是提高解决问题效率,不花太多精力
术:技术。根据业务范围,将知识转换成技术。业务知识熟练,能根据现象判断大概是哪个方面出现异常。
法:方法。对分析问题思路及方法的总结。
道:理念。解决问题的本质,性价比,依赖关系
参考:https://www.androidperformance.com