Android System trace 分析

围巾🧣 2024年05月11日 250次浏览

Systrace 的使用

简介:

Systrace 是 Android4.1 中新增的性能数据采样和分析工具。它可帮助开发者收集 Android 关键子系统(如SurfaceFlinger/ SystemServer/Kernel/Input/Display 等 Framework 部分关键模块、服务,View系统等)的运行信息

从而帮助开发者更直观的分析系统瓶颈,改进性能。通常使用 systrace 跟踪系统的 I/O 操作、CPU 负载、Surface 渲染、GC 等事件。

原理

1、systrace原理
Systrace的功能包括跟踪系统的I/O操作、内核⼯作队列、CPU负载以及Android各个⼦系统的运
⾏状况等。在Android平台中,它主要由3部分组成:

  • 内核部分:Systrace利⽤了LinuxKernel中的ftrace功能。所以,如果要使⽤Systrace的话,必须开启kernel中和ftrace相关的模块。
  • 数据采集部分:Android定义了⼀个Trace类。应⽤程序可利⽤该类把统计信息输出给ftrace。同时,Android还有⼀个atrace程序,它可以从ftrace中读取统计信息然后交给数据分析⼯具来处理。
  • 数据分析⼯具Android提供⼀个systrace.py(python脚本⽂件,位于AndroidSDK⽬录/platform-tools/systrace中,其内部将调⽤atrace程序)⽤来配置数据采集的⽅式(如标签、输出⽂件名等)和收集ftrace统计数据并⽣成html⽂件供⽤⼾查看。

Atrace+Ftrace,从本质上说,Systrace是对Linux Kernel中ftrace的封装。应⽤进程需要利⽤
Android提供的Trace类来使⽤Systrace

image-20240511161524150

常⻅操作

基础操作
w/s:放⼤/缩⼩
a/d:左移/右移
查看操作
click 选择
click+drag 选择
f 聚焦事件,放⼤到查看该事件的最佳视⻆
m 标记事件,每次标记会取消上次标记的内容
shift+m 同样是标记事件,但是会⼀直存在⻚⾯上,直⾄再次操作可删除  

systrace的抓取方法:

直接使用 Studio 自带的 Profiler

image-20240511110612448

image-20240511110639161

image-20240511110735270

perfetto

直接在 https://ui.perfetto.dev/ 上记录新的 Trace

也可以在设备上录制

参考 https://developer.android.com/topic/performance/tracing/on-device?hl=zh-cn

Perfetto 命令行
adb shell perfetto xxxxxx

参考 https://developer.android.google.cn/tools/perfetto?hl=zh-cn

Android/Sdk/platform-tools/systrace

输入抓取systrace的命令 (已废弃)

python systrace.py -t X -o xx.html

-t 指定抓取时间 -o 指定输出文件。

python /Users/only/Library/Android/sdk/platform-tools/systrace/systrace.py -a
top.xlxs.camerasync -o /Users/jin/Desktop/jin/adb-matrix/5.html sched fr
eq am wm gfx view input

基本查看工具

自带的 Profiler 就可以查看,功能基本一样,但分析不太直观,卡

image-20240511110929033

或者通过网页打开,谷歌推荐新的trace工具

https://ui.perfetto.dev/#!/

image-20240511103549807

工具解读

•线程运行状态

image-20240511103739755

  • 绿色:运行中
  • 蓝色:可运行
  • 白色:休眠中
  • 橘色:不可中断的睡眠态 IO block
  • 紫色:不可中断的睡眠态

查看被哪个线程唤醒的

image-20240511105825805

image-20240511104717940

APP 一帧的流程

image-20240511141324895

image-20240511141643793

image-20240511163003675

常见的Performance问题

出现卡顿,⼤致可以从以下⼏个⽅⾯考虑。

  • SurfaceFlinger合成慢了,SurfaceFlinger未合成该帧
  • Display上屏慢了
  • CPU频率低
  • HWC返回给SurfaceFlinger的时间戳存在异常

surfaceflinger 主线程耗时长

image-20240511105121572

APP UI 线程耗时

image-20240511105149309

dequeueBuffer耗时长

image-20240511105209053

与displaybinder通信时间长

image-20240511144849293

绘制流程

img

主线程(UI 线程)

image-20240511173254791

渲染线程

image-20240511174038786

• syncFrameState 同步绘制信息状态
• dequeueBuffer 向bufferQueue中申请buffer
• flushCommands 发出GPU绘制指令
• queueBuffer 绘制好的buffer给返回队列,调⽤onFrameAvailable请求vsync-sf信号  

SurfaceFlinger

image-20240511174654411

CPU信息

1、cpu编号

通常0〜3是⼩核、4-7是⼤核或者是中⼤核

2、cpu结构

⼀般⼿机的CPU核⼼数和架构⼀般分为:
• ⾮⼤⼩核结构
• ⼤⼩核结构(⾼通骁⻰845⼩核⼼是由四个A55组成,⼤核⼼就是由四个A75组成)
• ⼤中⼩核结构(⾼通骁⻰8558核1个A76的⼤核+3个A76的中核+4个A55的⼩核)

每个核承担的⼯作:

• ⼩核⼼,⼀些负载低,或者后台任务
• 中核⼼,⼀些负载⾼的,或者部分任务被限制只能跑中⼤核
• ⼤核⼼,⼀些负载特别⾼的,或者特别重要的,和部分被限制在⼤核上的

3、频率限制

3.1、原因:
⼀些场景⽆法单纯依靠调度器,⽆法满⾜性能和功耗的要求。
3.2、限制场景:

  1. 应⽤启动
  2. 应⽤安装
  3. 转屏
  4. 窗⼝动画
  5. ListFling
  6. Game

4、分析

• 某个场景的任务执⾏⽐较慢,我们就可以查看是不是这个任务被调度到了⼩核?
• 某个场景的任务执⾏⽐较慢,当前执⾏这个任务的CPU频率是不是不够?
• 我的任务⽐较特殊,能不能把我这个任务放到⼤核去跑?
• 我这个场景对CPU要求很⾼,我能不能要求在我这个场景运⾏的时候,限制CPU最低频率?

5、常⽤命令

adb shell cat /proc/cpuinfo // 查看cpu 信息
adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq // 查看某个
频率
adb shell taskset -p pid // 查到进程的cpu
adb shell taskset -p cpu pid 绑定cpu

线程信息

image-20240511175217793

• 浅绿:runable
• 深绿:Running
• ⽩⾊:Sleeping
• 棕⾊:不可中断休眠

image-20240511175536202

分析

• running时间⻓导致:app⾃⾝原因,检查在哪⾥耗时
• runnable时间⻓:系统状态差抢占严重导致
• binder调⽤多:app⾃⾝原因,检查代码是否有多余的binder调⽤