Quest研发实战:如何用Perfetto进行App性能分析
Quest开发者可以使用Perfetto来分析他们的应用程序
(映维网 2021年04月22日)Perfetto是一个Android性能剖析工具,除了为与Perfetto或ATrace集成的应用提供应用级工具外,它同时提供有关系统事件的信息,例如调度活动。它是systrace的替代品,并且增加了对计数器的支持,更多的事件选择、更长的trace,并提供更好的性能。有关Perfetto的更多信息请访问这个页面。
在Oculus日前发布的v27操作系统更新中,当开发者模式打开时,Quest和Quest 2默认启用Perfetto。v27操作系统更新同时附带了向Perfetto发送度量的VrApi/GPU。
Quest开发者可以使用Perfetto来剖析应用,以及整个系统的附加情景信息。随着时间的推移,团队计划通过Perfetto公开更多特定于Oculus的数据。
1. 从应用程序发送数据
为了让应用程序中的事件显示在Perfetto trace中,必须使用Perfetto TrackEvents或ATrace对应用程序进行注释。若要为应用程序添加注释,我们建议选择Perfetto TrackEvents作为性能更高的选项。确保Perfetto配置(如下所述)具有适当的TrackEvent或ATrace数据源。
将Perfetto添加到TrackEvents的说明请参阅这个页面。
2. Perfetto设置
要记录新的trace,首先需要设置一定的文件。你需要创建一个工作目录。在这里,你将创建Perfetto配置,并在其中写入trace(下面展示了一个带有Python脚本的安装程序,但你可以使用末尾提供的gitbash/WSL/Cygwin脚本)。
第一步:创建一个包含Perfetto配置、脚本和trace输出的工作目录。出于本文的目的,我们将把目录称为perfetto\u traces,但你可以随意命名。
第二步:创建Perfetto配置(config.txt)
在perfetto_traces/config.txt创建一个文本文件
用trace配置填充文件。最好使用Web UI(https://ui.perfetto.dev/)来生成成Perfetto配置,然后再进行调整。
在Web UI中,单击Record new trace。
选择要录制的各种数据源。
复制Trace command部分中显示的配置。只复制配置,而不是整个命令。如下所示:
注意:Perfetto app instrumentation和VrApi/GPU度量都是Perfetto TrackEvents的一部分,这是Web UI不支持生成配置的数据源。若要记录,请将以下内容添加到配置中:
data_sources: { config { name: "track_event" }}
注意:GPU度量要求adb shell ovrgpuprofiler-r再跟踪记录期间于后台运行。
下面是一个示例配置文件,它将记录VrApi和GPU度量,以及设备发出的任何其他Perfetto TrackEvents。
buffers: { size_kb: 63488 fill_policy: DISCARD}buffers: { size_kb: 2048 fill_policy: DISCARD}data_sources: { config { name: "linux.process_stats" target_buffer: 1 process_stats_config { scan_all_processes_on_start: true } }}data_sources: { config: { name: "track_event" }}duration_ms: 10000
第三步:创建Python脚本来记录trace(perfetto.py)
在perfetto_traces/perfetto.py创建文本文件
将以下内容粘贴到文件中:
#!/usr/bin/env python3import osimport subprocessimport sysdir = os.path.dirname(os.path.realpath(__file__))config_file = os.path.join(dir, "config.txt")output_file = os.path.join(dir, "trace.pftrace")if not os.path.isfile(config_file): print("Config file does not exist: " + config_file) sys.exit(1)config = open(config_file, 'r')subprocess.run(["adb", "shell", "rm", "-f", "/data/misc/perfetto-traces/trace"], check=False)subprocess.run(["adb", "shell", "perfetto", "-c", "-", "--txt", "-o","/data/misc/perfetto-traces/trace"], stdin=config, check=True)if os.path.isfile(output_file): os.remove(output_file)subprocess.run(["adb", "pull", "/data/misc/perfetto-traces/trace", output_file], check=True)
第四步(可选):在 Oculus Developer Hub (ODH)中创建一个自定义命令来运行脚本。
确保Quest接到ODH。
在 My Device选项卡下,单击+ Create Command。
名称:Perfetto;命令:python3
/perfetto_traces/perfetto.py;在新窗口中显示命令输出:选中 有关ODH自定义命令的更多信息请访问这个页面。
3. 记录和查看trace
记录trace
确保Quest已接到PC。
运行命令adb devices时,请检查是否列出了你的Quest。
打开你的应用程序,进入你想要的情景模式。
使用Python3运行perfetto.py。这会将配置复制到设备。运行Perfetto,并将记录的trace复制回目录。或者,如果是使用ODH,则在ODH中运行Perfetto自定义命令
你记录的trace将保存到 perfetto_traces/trace.pftrace。
查看trace
打开Web UI(https://ui.perfetto.dev/)
单击`Open trace file并选择刚才记录的trace,位置perfetto_traces/trace.pftrace。
提示:通过单击计数器名称旁边的星号,可以将计数器固定到时间线视图的顶部。
4. Git Bash/WSL/Cygwin脚本
如果你在开发中更喜欢gitbash/WSL/Cygwin,请使用下面的脚本,而不是上面提供的python脚本。
在perfetto_traces/perfetto.sh创建一个文本文件
将以下内容粘贴到文件中:
#!/bin/bashset -euo pipefailexport MSYS_NO_PATHCONV=1export MSYS2_ARG_CONV_EXCL="*"DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"CONFIG_FILE="${DIR}/config.txt"OUTPUT_FILE="${DIR}/trace.pftrace"if [ ! -f "${CONFIG_FILE}" ]; then echo "Config file does not exist: ${CONFIG_FILE}" exit 1fiif [ -x "$(command -v cygpath)" ]; then OUTPUT_FILE=$(cygpath -w "${OUTPUT_FILE}")fiif [ -x "$(command -v wslpath)" ]; then OUTPUT_FILE=$(wslpath -w "${OUTPUT_FILE}")fiadb.exe shell rm -f /data/misc/perfetto-traces/trace || trueadb.exe shell perfetto -c - --txt -o /data/misc/perfetto-traces/trace<"${CONFIG_FILE}"rm -f "${OUTPUT_FILE}" || trueadb.exe pull /data/misc/perfetto-traces/trace "${OUTPUT_FILE}"