介绍

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]

💡

  1. 该软件不是很稳定,存在闪退现象
  2. ubuntu安装时各项依赖版本需要注意,参见Readme文件
  3. 使用时,如果需要以文本形式查看修改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的开关

FileSettingsAndroid 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性能指标分析脚本

参见:

Snapdragon GPU性能指标分析脚本说明