Android性能分析工具-Perfetto基本使用

一、Perfetto介绍

  Perfetto 是一个用于性能检测和跟踪分析的生产级开源堆栈。它提供用于记录系统级和应用级跟踪的服务和库、本机 + Java 堆分析、使用 SQL 分析跟踪的库以及用于可视化和探索多 GB 跟踪的基于 Web 的 UI。
在这里插入图片描述
主要特点:

  • 可以在线抓取长时间的trace:可以长达一个小时,另外抓取的文件size也可以达到GB级别,这样就可以在后台开启,让它一直抓取trace了,特别适用于那种复现概率很低,又比较严重的性能问题。

  • Perfetto具有很好的可扩展性:它除了提供标准的tracepoints之外,例如CPU调度信息,内存信息等,还可以通过atrace HAL层扩展,在Android P当中,Google新增加了一个atrace HAL层,atrace进程可以调用这个HAL的接口来获取当前的扩展信息,相关代码可见Google 提交,这样如果需要扩展tracepoints的话,就可以按照graphic的示例添加即可。

  • 提供全新的Perfetto UI网站:可以在上面通过选取开关的方式,自动生成抓取trace的命令,同时可以打开trace文件,自动把protobuf或者json转变成UI,另外还集成了几种预定义的trace分析统计工具,详情可见它的 Metrics and auditors 选项。

  Perfetto本身是一个框架,关于它的架构和模块的详细介绍,有兴趣的可以参考它的doc网站,它的源码可以参考Android Source Tree的 /external/perfetto 目录,里面有很多的tools和脚本,可以拿来直接使用,本文只对这个工具做简单的使用介绍。

doc网站地址:https://perfetto.dev/docs/

二、抓取方法

2.1 手机端直接抓取

2.1.1 打开系统跟踪

方法1:在开发者选项中打开

  • 打开开发者选项
  • 进入开发者选项,选择系统跟踪(System tracing),开启显示“快捷设置”图块(Show Quick Setting tile)
  • 打开顶部下滑菜单快捷设置面板的快捷图标,或者打开开发者选项系统跟踪(System tracing)录制跟踪记录(Record trace)
  • 通知面板会出现一个系统跟踪通知,点击可以开始和停止录制

方法2:通过adb命令打开
adb shell am start com.android.traceur/com.android.traceur.Main Activity

对应的界面如下:
在这里插入图片描述
选中显示“快捷设置”图块,会在控制中心显示快速抓取trace图块:
在这里插入图片描述

2.1.2 开始录制

在这里插入图片描述
在这里插入图片描述
数据保存位置/data/local/traces
在这里插入图片描述
到处trace文件:adb pull /data/local/traces .

2.2 使用 adb 抓取

adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 60s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

-o /data/misc/perfetto-traces/trace_file.perfetto-trace:输出trace的路径
-t 60s:最多抓取时长,可以Ctrl+C停止
sched ... memory:要抓取相关模块
更多配置说明,参见文档:https://perfetto.dev/docs/concepts/config

2.3 通过 Perfetto 网页自定义抓取

通过Perfetto UI网站可以帮助生成配置文件,点击 Record new trace会看到很多配置界面
在这里插入图片描述
方法1:自动生成命令,然后终端执行
选择想要的tracepoints之后,点击Recording command,将命令拷贝出来直接在终端就可以执行,完成之后分析/data/misc/perfetto-traces/trace文件
在这里插入图片描述
在这里插入图片描述

adb shell perfetto \
  -c - --txt \
  -o /data/misc/perfetto-traces/trace \
<<EOF

buffers: {
    size_kb: 63488
    fill_policy: DISCARD
}
buffers: {
    size_kb: 2048
    fill_policy: DISCARD
}
data_sources: {
    config {
        name: "android.packages_list"
        target_buffer: 1
    }
}
data_sources: {
    config {
        name: "android.power"
        android_power_config {
            battery_poll_ms: 1000
            battery_counters: BATTERY_COUNTER_CAPACITY_PERCENT
            battery_counters: BATTERY_COUNTER_CHARGE
            battery_counters: BATTERY_COUNTER_CURRENT
            collect_power_rails: true
        }
    }
}
data_sources: {
    config {
        name: "linux.process_stats"
        target_buffer: 1
        process_stats_config {
            scan_all_processes_on_start: true
        }
    }
}
data_sources: {
    config {
        name: "linux.sys_stats"
        sys_stats_config {
            stat_period_ms: 1000
            stat_counters: STAT_CPU_TIMES
            stat_counters: STAT_FORK_COUNT
            cpufreq_period_ms: 1000
        }
    }
}
data_sources: {
    config {
        name: "linux.ftrace"
        ftrace_config {
            ftrace_events: "sched/sched_switch"
            ftrace_events: "power/suspend_resume"
            ftrace_events: "sched/sched_wakeup"
            ftrace_events: "sched/sched_wakeup_new"
            ftrace_events: "sched/sched_waking"
            ftrace_events: "power/cpu_frequency"
            ftrace_events: "power/cpu_idle"
            ftrace_events: "power/gpu_frequency"
            ftrace_events: "raw_syscalls/sys_enter"
            ftrace_events: "raw_syscalls/sys_exit"
            ftrace_events: "sched/sched_process_exit"
            ftrace_events: "sched/sched_process_free"
            ftrace_events: "task/task_newtask"
            ftrace_events: "task/task_rename"
            buffer_size_kb: 2048
            drain_period_ms: 250
        }
    }
}
duration_ms: 10000

EOF

方法2:网页连接设备直接抓取
“Add ADB Device” 选择手机设备,如下图,其中有一些参数配置,根据自己的需要添加修改
在这里插入图片描述
最后点击右上角 “Start Recording”

2.4 源码抓取perfetto(强烈推荐):

源码地址:https://github.com/google/perfetto

使用源码中自带的record_android_trace工具也可以抓取,具体的record_android_trace路径是在源码的如下目录:
源码路径/perfetto/tools

具体抓取命令:

./record_android_trace -o $(date +%Y%m%d_%H%M%S)_trace_file.perfetto-trace -t 10s -b 32mb sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory gfx view wm am ss video camera hal res sync idle binder_driver binder_lock ss

以上抓取后直接自己会打开相关的chrome的浏览器

三、trace分析方法

3.1 打开trace文件

抓到 Perfetto Trace 之后,一般是在 Perfetto UI 中打开(如果用官方提供的脚本,则会在抓去结束后自动在这个网站上打开,参考2.4)。打开后界面如下:
在这里插入图片描述
在Open trace file中打开pull出来的trace
在这里插入图片描述
打开以后,就可以分析其中的数据:
在这里插入图片描述
大致上 Perfetto Trace 界面可以分为四个区域:

  • 最右边的操作区:这里最主要的是 Current Trace 这一栏下面的那几个会经常用到。
    Show timeline :显示当前 Trace,切到了别的界面之后,再点这个就会回到 Trace View 界面
    Query:写 SQL 查询语句和查看执行结果的地方
    Metrics:官方默认帮你写好的一些分析结果,可以选择直接打开
    Info and stats :当前 Trace 和手机 App 的一些信息

  • 上方的信息和操作区域:最主要就是看时间。

  • 中间的 Trace 内容区:操作最多的区域,Trace 内容都在这部分,最上面的几部分是从功能的角度来划成一个区域的,比如 CPU 区(可以查看当前 Task 跑在哪个核心上,频率是多少,跑了多长时间、被谁唤醒)、Ftrace event 区等;下面的就是以 App Process 为单位展示的(包括 App 的各种线程、Input 事件、Binder Call、Memory、Buffer 等信息)。

  • 最下方的信息区:这个区域主要是展示各种信息、我们选中了某个 Task 段之后,这里就会展示这个 Task 相关的信息(如果你加了 Log,这里也会显示 Log;ftrace event 同理)。

3.2 查看方法

基本操作通过“W”、“S”、“A”、“D”实现,英文键盘下,w可以实现对trace范围的放大,s可以缩小范围,a整体左移,d整体右移。
基本操作还有疑问,可以在页面中shift+/ ,也就是“?”,通过官方提供的操作指南可以学习基本操作。
在这里插入图片描述
  左键单击某个线程,既可看到详细信息,例如耗时等。再shift+M,可以精准标注该线程,使用鼠标左键长按整个区间,选择在需要分析的部分长按,既可获取在此期间的各个进程的操作,如图所示就是在still capture期间内CPU负载的具体情况,如果想看此时CPU 频率,左键长按在CPU Frequency上既可查看期间内频率的变化。
在这里插入图片描述
在这里插入图片描述
置顶功能:
在这里插入图片描述
小红旗(可以标注一个时间轴):
  Perfetto 还可以通过插旗子的方法来在 Trace 上做标记,Perfetto 支持你把鼠标放到 Trace 最上面,就会出现一个旗子,点击左键即可插一个旗子在上面,方便我们标记某个事件发生,或者某个时间点。
在这里插入图片描述

3.3 Perfetto查看冷启动时间

冷启动时间:从手指点击桌面图标开始计算到显示app第一帧画面之间的时间差
一般公司测试人员冷启动测试方法:高速摄像机(FPS高,误差小)
在这里插入图片描述

参考文档:https://www.androidperformance.com/2024/05/21/Android-Perfetto-03-how-to-analysis-perfetto/#/Perfetto-View-%E7%95%8C%E9%9D%A2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值