关于 argent-native-profiler
使用 Xcode Instruments 和 Perfetto 对 iOS 与 Android 原生应用进行性能分析的技能。它指导录制、分析和基于调用栈的调查,涵盖 CPU 热点、UI 卡顿及内存信号。
主要功能
- 01iOS 与 Android 跟踪采集
- 02CPU 热点分析
- 03UI 卡顿调查
- 04泄漏与内存压力信号
- 05调用栈级跟踪查询
适用场景
- 01查找占用 CPU 较多的原生函数
- 02调查 UI 卡顿或无响应
- 03检查内存泄漏跟踪
- 04修复后比较性能分析结果
MCP 相关
该技能介绍用于启动和停止原生性能分析、分析跟踪数据、查询调用栈及重新加载历史会话的 Argent MCP 工具。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ software-mansion/ argent --skill argent-native-profiler安装后在 Claude Code 中输入/argent-native-profiler确认已加载。
详细介绍
1. 工具
native-profiler-start:在已启动的设备上开始性能分析。iOS:使用 xctrace 记录 CPU、卡顿和内存泄漏。native-profiler-stop:停止性能分析器,并将跟踪数据导出为带时间戳的 XML 文件。native-profiler-analyze:解析导出的跟踪数据,并返回结构化的瓶颈信息。profiler-stack-query:深入查询已解析的数据:卡顿调用栈、函数调用者、线程细分和内存泄漏详情。profiler-load:列出并重新加载磁盘上之前的跟踪会话,以便重新调查。- 实体 iPhone:不支持;请使用模拟器。
2. 平台支持
- iOS:后端:在已启动的模拟器或已连接的设备上,通过
xctrace使用 Xcode Instruments。需要将 Xcode 命令行工具添加到 PATH。可查看 CPU 热点、UI 卡顿和内存泄漏(通过 Instruments 的Leaks表格)。 - Android:后端:通过
adb shell perfetto和进程内 WASM 跟踪处理引擎使用 Perfetto。可查看 CPU 热点和 UI 卡顿,包括每次卡顿的卡顿原因代码、主线程状态细分(标注blocked_function)以及 GC 重叠注释。还会报告 RSS 增长信号,用于提示可能存在内存压力;请将其视为需要手动确认的线索,而非已确认的内存泄漏。目标应用必须可调试,或在其清单中包含<profileable android:shell="true"/>,才能采集perf_sample调用栈。
3. 调查模式
native-profiler-analyze 给出发现的问题后,使用 profiler-stack-query 深入调查根因:
- 检测到卡顿 → 使用
profiler-stack-query的 mode=hang_stacks获取完整的原生调用链 → 使用 mode=function_callers查询可疑函数 → 阅读原生代码。 - CPU 热点 → 使用
profiler-stack-query的 mode=thread_breakdown查看各线程的分布 → 使用 mode=function_callers查询占主导地位的函数。 - 内存泄漏 → 使用
profiler-stack-query的 mode=leak_stacks,按object_type筛选出问题的栈帧和库。- iOS:如果泄漏结果没有归因信息(责任栈帧为
<Call stack limit reached>),请使用malloc_stack_logging: true重新运行native-profiler-start。这会启用 Malloc Stack Logging 并冷启动应用,使泄漏结果包含真实的分配回溯(责任栈帧和库)。这会重启应用并增加开销,因此仅在需要归因内存泄漏时使用,不要用于 CPU 或卡顿分析。
- iOS:如果泄漏结果没有归因信息(责任栈帧为
呈现发现的问题后,询问用户是要继续调查、实施修复,还是停止。应用修复后,务必针对相同场景重新进行性能分析,并使用 profiler-load 对比结果。客观报告目标指标是有所改善、退步,还是保持不变。如果修复没有带来净收益,或在其他方面引入了回归,请如实说明并重新评估。
**提示:**如需进行可复现的前后对比,请在首次性能分析前,使用 argent-create-e2e 技能将交互步骤记录为 e2e 测试。后续运行时使用 e2e-execute 重放,以消除交互差异。
注意:
argent-react-native-profiler会指示同时自动启动原生性能分析和 React 性能分析。无论是哪种情况,都适用本技能的工作流和调查模式。
4. 工作流
请按顺序完成所有步骤;不要中途退出。
步骤 0:确保目标应用正在运行
native-profiler-start 工具会自动检测设备上正在运行的应用。
你无需手动推导 app_process;只需确保应用已启动。
- 如果应用已在设备上运行,请跳至步骤 1(不要传入
app_process)。 - 如果应用未运行,请先使用
launch-app和正确的 bundle ID 启动应用。 - 仅当工具报告有多个正在运行的用户应用且需要区分时,才显式传入
app_process。
注意:如果安装了多个构建变体(dev、staging、prod),工具会检测当前正在运行的变体。如果多个变体同时运行,工具会要求你指定。
步骤 1:开始录制
使用 device_id(iOS UDID 或 Android 序列号)调用 native-profiler-start。该工具会自动检测正在运行的应用,并将跟踪数据保存到 /tmp/argent-profiler-cwd/,文件名带有时间戳。
让用户与应用交互,或通过模拟器工具驱动交互(参见 argent-device-interact 技能)。
步骤 2:停止并导出
使用 device_id 调用 native-profiler-stop。iOS 会向 xctrace 发送 SIGINT,等待跟踪数据打包,然后将 CPU、卡顿和泄漏数据导出为 XML;检查 exportDiagnostics 是否包含导出警告。Android 会向设备上的 perfetto 守护进程发送 SIGTERM,轮询 /proc/<pid> 直至进程退出,然后通过 adb pull 将 .pftrace 拉取到主机。
步骤 3:分析
使用 device_id 调用 native-profiler-analyze。该工具会返回一份 Markdown 报告,将瓶颈按 CPU 热点、UI 卡顿或内存泄漏分类,并按严重程度排序。
步骤 4:呈现发现并询问后续步骤
简要总结关键发现。然后遵循“分析后”指南:询问用户是要使用查询工具进一步调查、实施修复,还是停止。
步骤 5:深入调查
使用 profiler-stack-query 调查具体发现。链式调用指南见 §3 调查模式。
步骤 6:重新加载之前的会话
如需重新查看之前的跟踪数据:
- 调用
profiler-load,设置 mode=list,查看可用会话。 - 调用
profiler-load,设置 mode=load_native、session_id=<timestamp>和 device_id=<UDID>,重新解析 XML 文件。 - 使用
profiler-stack-query调查重新加载的数据。
5. 了解结果
瓶颈按严重程度分类:
- RED:占总耗时 >15% 的 CPU 函数、所有 UI 卡顿,以及已归因的内存泄漏(已解析出责任帧的泄漏)。这些问题需要立即处理。
- YELLOW:占总耗时 3-15% 的 CPU 函数,以及未归因的内存泄漏(
<Call stack limit reached>,无库;参见下文的内存泄漏注意事项)。值得调查,但可能可以接受。
不同类型的瓶颈对应不同类别的问题:
- CPU 热点:消耗过多 CPU 时间的原生函数。注意紧密循环、开销大的计算或重复工作。
- UI 卡顿:主线程阻塞时间过长,导致明显卡顿或无响应。通常由同步 I/O、耗时的布局计算或锁争用导致。
- 内存泄漏:已分配但从未释放的对象。常见原因包括强引用循环、未关闭的资源或遗忘移除的观察者。Argent 通过
xctrace --attach进行记录,该方式没有 malloc 栈历史,因此在模拟器上,大多数泄漏都会显示为未归因(<Call stack limit reached>,无库),且主要来自无害的系统分配;这类数据会作为低置信度的 YELLOW 摘要报告,而不会确认为 RED 泄漏。要获取已归因的调用栈,请在启动时启用 malloc 栈记录后再进行捕获。
6. 重要注意事项
- 模拟器与设备:模拟器性能分析反映的是主机 Mac 的性能,而非真实设备硬件。要获得准确的 CPU 耗时和内存行为,请使用设备进行性能分析。
- xctrace 可用性(iOS):需要安装 Xcode 命令行工具。使用
xcrun xctrace version验证。 - 性能分析器开销:xctrace 检测会增加 CPU 负载。如果 CPU 热点结果中
JSLexer、JSONEmitter或 Hermes 运行时内部组件占用了 JS 线程的大量资源,这反映的是性能分析器的开销,而非应用工作负载。评估发现时,请忽略这些条目。 - 不同运行间的波动:不同运行之间 CPU 百分比的小幅波动属于正常现象。只有持续一致的方向性变化(跨 2 次以上运行,或变化幅度 >15%)才应视为可采取行动的信号。
- 实时数据的可变性:如果应用会获取实时 API 数据,不同运行中收到的响应可能会独立于代码变更,改变渲染工作负载。请注意数据相关屏幕出现的波动。