介绍
Snapdragon Profiler 是在Windows、Mac 和 Linux 平台上运行的分析软件。它通过 USB 与搭载Snapdragon®处理器的Android设备连接。Snapdragon Profiler 允许开发人员分析 CPU、GPU、DSP、内存、功耗、热量和网络数据,以便发现并修复性能瓶颈。
安装
安装压缩包:
https://developer.qualcomm.com/software/snapdragon-profiler
名称:SnapdragonProfiler
地址:https://kpan.mioffice.cn/webfolder/ext/L4xUte%23ROaI%40?n=0.49817786767402805
密码:Ww7U
ubuntu安装
正常安装
解压缩如上文件后,在目录下执行./run_sdp.sh,如果没有正常启动,则执行如下命令:
# 1. gtk
sudo apt-get update
sudo apt-get install libc++1 libc++abi1 default-jre android-tools-adb libgtk-3-0
# 如果为ubuntu 24+,还需执行:sudo apt-get install libgtksourceview-4-0
# 2. mono update
# https://www.mono-project.com/download/stable/#download-lin
# 这里只给出ubuntu 20.04+的安装命令,20以下参照上述链接按需执行对应系统命令下载即可
sudo apt install ca-certificates gnupg
sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/mono-official-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb [signed-by=/usr/share/keyrings/mono-official-archive-keyring.gpg] https://download.mono-project.com/repo/ubuntu stable-focal main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update
sudo apt install mono-complete
# 3. 回到Snapdragonprofiler目录下,执行
./run_sdp.sh安装中mono报错
如果上述方案安装失败,提示mono有问题,则需要下载nuget,访问https://www.nuget.org/downloads ,下载”Windows x86 Commandline” 对应的nuget.exe
# 在对应下载目录下执行如下命令
mono nuget.exe install gtksourcesharp -Version 3.24.24.38 -OutputDirectory ~/.local/share/SDP
# 回到Snapdragonprofiler目录下,执行
./run_sdp.sh使用
可参见安装压缩包/Doc目录下的User Guide文件
[附件: application/pdf]
💡
- 该软件不是很稳定,存在闪退现象
- ubuntu安装时各项依赖版本需要注意,参见Readme文件
- 使用时,如果需要以文本形式查看修改shader,需要将Disable Binary Programs/Shaders设置为True,再launch应用
建立连接
数据线连接设备,点击Start a Session
弹窗中能够看到自己的设备,点击connect,可以把auto connect勾选上,下次连接该设备可自动连接
左侧代表四种调试模式:实时,追踪,帧捕获
💡 我们常用的是system Trace Analysis来看一段时间GPU性能,以及Snapshot GPU Frame Capture看一帧的各种纹理属性或单帧GPU性能。
- Realtime Performance Analysis提供了设备的实时数据,可以点击具体的app来获取app的性能指标,也可以直接获取整个系统的性能指标,包括fps,gpu占用率,gpu内存,发热,DSP,网络,各线程的数据等
- System Trace Analysis可以在timeline上看到具体的系统事件,例如 flush buffer,surface render, gmem,
- Snapshot GPU Frame Capture 用来抓帧和逆向数据,可逆向到的数据: 1) 图片纹理 2) 模型(只有基础的顶点和索引) 3) shader
使用
抓取特定应用
如果需要使用GPU性能指标分析脚本,需要确保机器为opengl
📌 判断当前机器的hwui是vulkan还是opengl: adb shell dumpsys gfxinfo com.miui.home | grep Pipeline 切换: adb shell setprop “debug.hwui.renderer” “skiavk” adb shell setprop “debug.hwui.renderer” “skiagl” adb shell stop;adb shell start后生效 如果adb reboot,会失效,需要重新切换一下 以上方式,对于部分应用强制切vulkan不适用,需要修改系统属性: adb shell setprop persist.sys.vk_mode_enabled false 判断当前机器的sf是vulkan还是opengl: adb shell dumpsys SurfaceFlinger | grep “RE ” // 输出为RE GLES则为opengl,RE Vulkan则为vulkan 切换: adb shell setprop debug.renderengine.backend skiavkthreaded adb shell setprop debug.renderengine.backend skiaglthreaded
抓取特定进程的前置操作
📌
- 如果想看Surfaceflinger进程:adb root;adb remount;adb shell setenforce 0;adb disable-verity设置完后同样需要通过adb shell stop;adb shell start来重启Surfaceflinger才能去抓对应的信息。
- 如果想看systemui进程:adb root;adb remountadb rebootadb root;adb remount;adb shell setenforce 0;adb disable-verityadb shell settings put global gpu_debug_app com.android.systemui然后再打开Snapdragonadb shell stop;adb shell start
抓取自己写的demo
如需抓取自己写的demo,需要在对应app的AndroidManifest.xml中添加如下权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
<application>
...
</application>
...
</manifest>如何存储抓取信息
如下图描述,Snapdragon一般能够保存两种文件:
- *.sdp:保存当前Snapdragon所抓取过的所有信息,该文件可使用Snapdragon打开。
- *.csv:一般用于保存system trace抓取到的信息,可使用excel打开或使用脚本分析,无法使用Snapdragon再打开。
在Snapdragon中获取trace信息
首先需要确认自己的Snapdragon是否打开了抓取trace的开关
File→Settings→Android→ Enable Perfetto trace(restart required)
- Windows版本要确保这里是勾选上的
- Ubuntu版本需要确保这里没有勾选!!!
修改之后重启Snapdragon即可生效。
- 后续抓取信息时,会发现system下多了一个trace选项,展开后即可按需勾选自己想看的内容,需要注意,这里的trace内容与perfetto会稍有区别,保存只能以csv形式存储,无法像其他trace文件一样方便查看。
- 勾选trace是为了方便确认此刻的信息属于哪一帧,trace有tag 的话在这里也能看到
- 一般勾选如下【Graphics】【KGSL】【View】
常用功能介绍
Realtime Performance Analysis 实时
可用于实时查看当前CPU/GPU的负载
System Trace Analysis 追踪
我们主要关注的参数如下:
-
Process
-
GPU Shader Processing
- ALU / Fragment
- ALU / Vertex
- EFU / Fragment
- EFU / Vertex
- Textures / Fragment
- Textures / Vertex
-
-
连接好 Android 设备后,从
Start Page界面单击左边栏的System Trace Analysis,此时,就创建了一个新的Trace选项卡。 -
选择刚创建的
Trace选项卡,进入一个类似于实时模式的视图,然后在Data Sources边栏上端的应用列表中选中要追踪的应用(如果列表中找不到,就通过列表右上角的Launch按钮去启动要追踪的应用)。
- 如果想分析哪个应用,就需要点击
System Trace Analysis之后再启动它。如果是已经启动的应用,如负一屏,需要先杀掉对应进程,当他重启时就会出现在下方: - 在
Data Sources边栏下端,选中Process→OpenGL→Rendering Stages项。
- 点击
Start Capture开始追踪,在 10 秒内的任意段点击Stop Capture,再等待 N 秒(取决于电脑性能)后就会展示出如下图表 - 如果想要保持每次数据抓取时长相同,不需要点击
Stop Capture,10秒后会自动停止抓取的 - 两个浅紫色flush Markers之间就为一次flush的结果,大多数情况下,我们可以粗略的认为两次flush之间为一帧,这里的surface对应duration就是这一帧抓取进程process的GPU耗时,一般可以用surface的耗时来衡量本次GPU性能。
Snapshot GPU Frame Capture 帧捕获
- 帧捕获模式允许捕获 GPU 应用程序的单一帧, 可以详细显示一个场景在 GPU 上的渲染情况。
- 使用时,如果需要以文本形式查看修改shader,需要在”Options”中将Disable Binary Programs/Shaders设置为True,再launch应用。
- 为了能提高抓取的效率,可以将captureTime改为200,NumCaptureFrame改为5。
启用帧捕获模式的操作与追踪模式几乎一样,唯一不同之处就是帧捕获模式在点击 Take Snapshot 捕获一帧数据后会自动结束捕获:
-
左侧红框区域是当前帧的着色器代码。
-
中间绿框区域是命令队列(Queue)提交给当前帧的所有 OpenGL命令。选中某一条命令,右侧资源面板将展示出此命令涉及的所有资源:图形|计算管线,纹理,着色器等等。
- 当我们勾选了ALU/Fragment,ALU/Vertex、Clocks等选项后,即可在绿框区域看到不同操作的ALU数量,一般ALU多的话这个操作就可能比较耗时。
-
右侧蓝框区域是资源面板。选中某一项资源,下方的面板将能展示出资源详情。
- 对于蓝框区域的资源面板:
比如,选择纹理资源后,下方的
Image Preview选项卡会展示可缩放的大图预览,鼠标在纹理图片上滑动可显示对应像素的 RGB 色值,Inspector选项卡会展示纹理的格式及层次细节参数等(左图); 选择布局描述符资源后,Inspector选项卡会展示出绑定组布局描述符(BindGroupLayoutDescriptor)详情(右图):
GPU性能指标分析脚本
参见: