Android优化技术的器、术、道

鉴于在讨论 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调用链、跨进程事件流跟踪

实际开发过程中,使用最多的是logtracemetric可以通过指令抓取会混合在log中。trace可以用图像和文本两种方式打开,trace目前有systraceanrtraceiotrace

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

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值