openpilot 骁龙性能剖析实战:在 agnos(tici)硬件上使用 Snapdragon Profiler 的完整配置流程
本文围绕 openpilot 仓库中 snapdragon profiler 指南 展开,介绍如何在本地 PC 上部署 Snapdragon Profiler,并让它正确"认识" openpilot 基于 agnos 的车载硬件(tici)。读完后你将掌握:Profiler 工具包的放置与依赖安装(setup-profiler.sh)、针对 agnos 的适配改造(setup-agnos.sh)、ADB 连接与启动剖析的完整链路,以及它与 openpilot 内置其他性能剖析工具(ftrace、perfetto、py-spy 等)的分工关系。
为什么 openpilot 需要 Snapdragon Profiler
openpilot 的运行载体 tici 是高通骁龙平台的定制设备,其系统层是 agnos——从仓库中 agnos 硬件抽象、tici 的 agnos 配置 以及 common 层 agnos 配置 可以看出,openpilot 对该平台的电源、USB、网络等硬件操作都有一套专门的 agnos 适配。
针对这类 SoC,Linux 层面自带的 ftrace/irqtop 只能看到 CPU 调度、中断、workqueue 等内核侧信息,而 GPU 负载、硬件编码器、传感器通路、SoC 电源频率等需要高通官方工具链。Snapdragon Profiler 正是高通面向骁龙平台开发的综合性能剖析工具,它通过设备端的 adb 通道把 SoC 级性能数据回传到 PC 端 GUI,因此成为 openpilot 调试 tici 上 CPU/GPU/多媒体子系统性能时的首选工具,与仓库中面向内核侧的 ftrace 脚本、irqtop 脚本 形成互补。
前置条件与工具包获取
指南原文给出的是完整操作步骤(保留原命令顺序):
- 从高通官方开发者网站的 Snapdragon Profiler Tools Archive 下载工具包(需要注册高通开发者账号),选择 v2021.5 版本——README 明确标注该版本已验证可在 openpilot 24.04 开发环境中正常工作;
- 将解压结果放到仓库约定的
SnapdragonProfiler目录下。README 中写的目标是openpilot/selfdrive/debug/profiling/snapdragon/SnapdragonProfiler; - 运行
./setup-profiler.sh完成本地依赖安装; - 运行
./setup-agnos.sh完成 agnos 适配; - 在设备上运行
adb.sh脚本(README 原文写的是openpilot/selfdrive/debug/adb.sh); - 在本地 PC 执行脚本输出的
adb connect xxx命令完成设备连接; - 进入
SnapdragonProfiler目录,运行./run_sdp.sh启动 Profiler; - 在 Profiler 的 "connect to device" 中选择刚配置好的设备,即可开始剖析。
需要说明的一点路径事实:在当前仓库结构中,openpilot/selfdrive/debug/ 目录已不存在,剖析脚本实际集中在 tools/scripts/profiling/snapdragon/ 下。README 中出现的 openpilot/selfdrive/debug/adb.sh 是文档编写时期(设备上)的旧布局写法——openpilot 在 tici 上的标准检出路径为 /data/openpilot(可从 perfetto 取回 trace 的脚本 中 DEST=tici:/data/openpilot/selfdrive/debug/profiling/perfetto 得到印证)。因此实际操作时应按"设备上的 openpilot 检出根目录 + 相对路径"理解 README 中的步骤,而非在当前仓库里寻找这些文件。
setup-profiler.sh:本地 PC 侧依赖安装
setup-profiler.sh 只做一件事:把 Snapdragon Profiler 在 Linux 开发机上跑起来所需的全部系统依赖装齐。其核心命令是:
sudo apt update
sudo apt-get install libc++1 libc++abi1 default-jre android-tools-adb gtk-sharp2
随后配置 Mono 官方 apt 源并安装完整 Mono 运行库:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
sudo apt install apt-transport-https ca-certificates
echo "deb https://download.mono-project.com/repo/ubuntu stable-xenial main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update
sudo apt-get install -y mono-complete
从这套依赖组合可以推断出 Profiler 的技术构成:default-jre 与 mono-complete 说明 Profiler 客户端是 .NET/Mono 生态的应用(设备端服务与 PC 端 GUI 混合架构),android-tools-adb 提供与设备的 adb 通道,gtk-sharp2 则表明 PC 端 GUI 依赖 GTK 绑定。脚本结尾会提示:"Setup successful, you should now be able to run the profiler with cd SnapdragonProfiler and ./run_sdp.sh",即安装完成后唯一入口就是工具包自带的 run_sdp.sh。该脚本面向 Ubuntu 系发行版,需要 sudo 权限,建议在 openpilot 推荐的 Linux 开发机环境中执行。
setup-agnos.sh:让 Profiler 指向 agnos 而不是 stock Android
这是整篇指南中最关键、也最容易被忽略的一步。setup-agnos.sh 全文只有三行有效逻辑:
cd SnapdragonProfiler/service
mv android real_android
ln -s agl/ android
它把 Profiler 工具包内 service/ 目录下原本面向 stock Android 服务的 android 目录改名保留为 real_android,然后用 agnos 的 agl/ 目录建立了一个名为 android 的符号链接。其原理是:Snapdragon Profiler 的设备端服务通过 android 这一约定路径查找系统接口与驱动脚本,而 tici 的 agnos 系统把对应实现放在了 agl/ 目录下(agl 与 Android 的目录布局同源)。符号链接相当于一个重定向垫片,使 Profiler 的设备端服务在 agnos 上按原有逻辑加载。
脚本注释里作者自己写了 # TODO: there's probably a better way to do this,坦承这是一种务实的 hack。这也提示使用者:执行该脚本后 service/ 目录会被就地修改,若日后需要重新使用原版 Android 模式,real_android 目录即为备份。
设备连接与启动剖析
依赖与适配完成后,按 README 的顺序完成设备侧接入:
- 设备端开启 adb:在 tici 上运行 openpilot 检出目录中的
adb.sh(旧布局路径为selfdrive/debug/adb.sh),脚本会在设备上启动 adb 守护并打印连接地址; - PC 端连接:在本地执行脚本输出的
adb connect xxx命令,建立 adb 网络通道; - 启动 Profiler:进入
SnapdragonProfiler目录运行./run_sdp.sh; - 选择设备:在 Profiler GUI 中选择刚连接的设备,即可开始对 CPU、GPU、传感器等子系统做实时剖析。
与仓库内其他剖析工具的分工
把 tools/scripts/profiling/ 目录整体看一遍,openpilot 实际上维护了一套分层剖析工具链,Snapdragon Profiler 处于其中"SoC 层"的位置:
| 工具 | 脚本 | 剖析层次 |
|---|---|---|
| Snapdragon Profiler | snapdragon/ | SoC 级:CPU 频率、GPU、多媒体硬件路径 |
| ftrace | ftrace.sh | 内核事件:默认启用 workqueue 事件,trace 写入 /tmp/trace(可开启 irq/sched/kgsl/camera 事件) |
| irqtop | watch-irqs.sh | 中断分布:irqtop -d1 -R 每秒刷新 |
| Perfetto | perfetto/ | 系统级调度/内存 trace(tracebox 录制,trace_processor --httpd 可视化) |
| py-spy | py-spy/profile.sh | Python 进程采样,输出 SVG 火焰图 |
| Palanteer | palanteer/setup.sh | 跨进程调用栈火焰图(基于 libunwind 构建) |
典型排障路径是:先用 Snapdragon Profiler 确认瓶颈是否在 SoC 硬件层(例如 GPU 编码器或 NPU 占用),若确认在 OS/用户态,再用 ftrace、perfetto、py-spy 逐层下钻。
适用前提与限制
- 版本锁定:README 指定 Snapdragon Profiler v2021.5(已验证于 openpilot 24.04 开发环境),其他版本未在 openpilot 场景下验证,升级前需自行回归;
- 账号门槛:工具包下载需要高通开发者账号,且工具包本体不随仓库分发,
SnapdragonProfiler/目录由使用者自行解压填充; - 脚本破坏性:setup-agnos.sh 会就地重命名 Profiler 的
service/android目录,重复执行前需确认目录状态; - 环境假设:setup-profiler.sh 假定 Ubuntu 系 apt 环境与 sudo 权限,且使用了
stable-xenial的 Mono 源,属于为 24.04 开发机调通的配置,跨发行版使用可能需要调整; - 路径时效性:README 中的
openpilot/selfdrive/debug/路径反映的是旧版仓库布局,当前仓库已将该类脚本迁至 tools/scripts/profiling/,阅读时需注意区分"PC 开发机上的仓库路径"与"tici 设备上/data/openpilot检出路径"两套体系。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00