很多人第一次听到 HiSmartPerf(HiSmartPerf-Device),以为它是某种“更高级的 DevEco Profiler”,或者至少要给工程加依赖、开 debuggable、甚至 root 才能跑。
结果用起来却发现:它就是系统里的一个采集面板/daemon 管线,你该干嘛干嘛,它在一旁读数、写报告、事后给你看——这才是它宣传的 「非侵入式」「无需修改设备系统权限」 的真正含义。

下面把话说透:它测的是什么、从哪里读数、为什么“不改权限也能跑”、你怎么把它用在启动耗时 / 帧率 / CPU / 内存这类最痛的指标上,以及 HarmonyOS 6 时代需要注意的适配边界。


1) HiSmartPerf ≠ hiprofiler/DevEco Profiler,但属于同一张大网哦

  • HiSmartPerf(HiSmartPerf-Device):更偏“性能功耗指标采集工具”,常见形态是

    • Device HAP 端:有屏设备上可操作的界面/悬浮窗,开始/暂停采集,结束时生成测试报告
    • Device daemon 端:纯命令行(shell),适合无屏/CI/实验室环境,通过 hdc shell 交互。
      指标侧重点是 FPS / CPU(频点+使用率)/ GPU(频点+负载)/ RAM / Temp 这类“系统可观测量”,并沉淀成报告供你回看趋势(抖动率、平均值、峰值等)。
  • hiprofiler(hiprofiler_cmd / hiprofilerd / plugins):更偏“内核/进程级 trace 与泳道分析”(ftrace/hitrace、CPU调度、nativehook、memory、GPU、xpower…),输出 .htrace(proto),在 DevEco Studio / SmartPerf Host 里做深度时间线分析。

  • DevEco Studio Profiler:偏“开发期日常”,与运行态进程更紧耦合(CPU录制/内存/线程/网络等),适合“我现在就要看这个函数/这次录制的火焰图”。

一句话分工:HiSmartPerf 回答“整段测试跑下来,FPS/CPU/RAM 稳不稳”;hiprofiler/Profiler 回答“为什么会抖、是谁在烧”。


2) 「非侵入 / 不改系统权限」的原理:它读的是“系统已经公开的账本”

HiSmartPerf 的“非侵入”不是说“它不碰进程状态”,而是说它基本不需要你改 APK/HAP 逻辑、不用注入、不要求 root,也不靠私有后门。它走的是操作系统本来就暴露出来的统计与计数面:

它读的账本大致长这样哦

  • FPS:来自渲染服务侧的帧提交统计/VSync 计数(把“画面刷新次数/时间窗口”量化成帧率与抖动率)。
  • CPU:读 per-core 频点 + 使用率(常见路径是 sysfs/proc 类的硬件与调度统计),得到“大中小核怎么跑、是不是长期顶频”。
  • GPU:读 GPU 频点/负载信息(也是通过驱动/电源域暴露的节点或接口),用于判断“是不是 GPU 满载导致控温降频,进而卡顿”。
  • RAM:读进程 物理内存 RSS / PSS 类统计(/proc/pid/…),用来量化“你占了多少真实内存”,而不是粗粒的 total/free。
  • Temp:读芯片/器件温度节点,方便你把“帧率跌下去”和“温度升上来”做关联。

所以它才能宣称:无需 ROOT、无需改系统权限——因为这些数据本来就在系统管理边界里以可读方式提供(至少对系统工具/daemon 来说),HiSmartPerf 更多是“帮你把它们采稳、对齐时间轴、落盘成报告”。

它的内部采集流水线长这样哦

HiSmartPerf 守护进程
采集-存证-出报告

读账本(非侵入读数)

你的应用
(被测对象)

无注入无Hook 仅观测

无注入无Hook 仅观测

无注入无Hook 仅观测

无注入无Hook 仅观测

无注入无Hook 仅观测

渲染帧提交 / 内存增长
调度占用 / 温度升降

FPS:帧统计/VSync计数

CPU:核频/占用率
proc/sched/sysfs采集

GPU:频率/负载

内存:进程RSS/PSS

设备温度数值

周期采样→时间戳对齐→本地存文件

测试结束自动生成性能报告

输出指标
帧率/内存/温度/硬件负载分布

关键点就一句:它没有“在你的代码里埋探针”,它更像把仪表盘的外接传感器贴在水管外面,看压强、流速、温度,然后按时记到表里。


3) 拿它测「启动耗时」:它不是 tracer,但能给你“起止点 + 同期系统负载”

先泼一小盆冷水:HiSmartPerf 的优势是 FPS/CPU/GPU/RAM/Temp 这类指标,它不直接等价于“方法级启动火焰图”。
但它在“启动场景”依然非常有用,只是用法要换一下:用它把启动过程包在一段“采集区间”里,再看区间内系统侧证据

推荐的小用法

  1. 准备工作(一次)
    • 安装好 HiSmartPerf-Device HAP(或从应用列表里打开 SmartPerf/HiSmartPerf 入口)
    • 允许必要悬浮窗/无障碍(只影响“HAP端面板”操作,不等于系统权限越界)
  2. 开始采集
    • 打开 HiSmartPerf → 选指标(至少勾 FPS / CPU / RAM,有条件再加 GPU / Temp
    • 开始(或悬浮窗开始)
  3. 复现启动
    • 杀后台(确保是冷启)→ 点桌面图标启动
    • 你什么都不用改;HiSmartPerf 会在后台记时间戳 + 读数
  4. 结束 & 看报告
    • 首帧可交互/首页稳定后 → 点 停止
    • 进报告:看 平均帧率 之外,重点盯:
      • 启动区间的 CPU 使用率/频点(有没有长段中核/大核满载)
      • RAM 曲线(启动时内存是否陡增、峰值是多少)
      • 抖动率(如果启动时连帧都抖,通常不是“逻辑慢”就是“渲染首次上传/编译+IO”问题)
      • 若有 Temp/GPU,确认是不是设备已经偏热导致降频,放大体感卡顿

本质上:启动耗时你仍然用“秒表/录像/系统生命周期打点”定边界,HiSmartPerf 给你证据——“这段时间里 CPU/RAM/温度到底干了什么”。(要函数级热点,再补 hiprofiler/Profiler。)


4) 代码侧怎么“配合”而不“侵入”:用你已有的生命周期做轻量锚点

HiSmartPerf 不需要你加 SDK,但我通常建议加两类东西(完全在你工程里、可随时开关):

(a) 生命周期锚点:把“启动阶段”钉在日志/报告里

// utils/PerfMarker.ts
import { hilog } from '@kit.PerformanceAnalysisKit';

const DOMAIN = 0x020001; // 你自己的段
const TAG = 'PerfMarker';

export class PerfMarker {
  static t0 = 0;

  static mark(label: string) {
    const now = Date.now(); // 只用来打相对秒,别拿来当高精度基准
    hilog.info(DOMAIN, TAG, `MARK [${label}] +${PerfMarker.t0 ? now - PerfMarker.t0 : 0}ms`);
  }

  static startBoot() {
    PerfMarker.t0 = Date.now();
    PerfMarker.mark('BOOT_START');
  }
}
// EntryAbility.ts
onWindowStageCreate(ws: window.WindowStage) {
  PerfMarker.startBoot();
  // ...loadContent
}
// pages/Index.ets
aboutToAppear() {
  PerfMarker.mark('FIRST_PAGE_ABOUT_TO_APPEAR');
}

你跑 HiSmartPerf 采集时,HiLog 时间轴就和“CPU/RAM 曲线”天然对齐了——事后把两段证据拼起来看,结论会硬很多。

(b) 可选:自定义 trace 点(更偏 hiprofiler/hitrace 体系,但能互通叙事)

如果你后续还要把同一段流程送进 hiprofiler_cmd/bytrace 做泳道分析,可以在关键路径加 HiTraceMeter 点(走系统 tracebuf,不算“侵入业务逻辑”),但这里不展开,避免喧宾夺主:HiSmartPerf 的定位仍是系统指标读数,不是 instruction-level tracer。


5) 差异案例:游戏 vs 普通应用(为什么游戏更爱用 HiSmartPerf)

  • 游戏(Cocos/Unity等):往往有大量逻辑在引擎/Native侧,JS层未必能精确反映“渲染帧提交”与“GPU负载”。
    HiSmartPerf 读的是输出侧统计+硬件计数器(FPS/抖动率/GPU freq/load/Temp/RSS),反而更贴近玩家体感“卡不卡、烫不烫”。
    报告里的 抖动率GPU 使用率 >70% 的时段 通常直接指向特效/分辨率/后处理/合批策略该不该砍。

  • 普通 ArkUI 应用:帧率一般更稳,瓶颈更容易在 首屏IO/同步布局/图片解码/字体加载 上。
    这时 HiSmartPerf 的价值更像“排除法器”:

    • CPU 不高、RAM 不涨、温度不拉、但 FPS 掉 → 多半是渲染路径问题(过绘/布局重算/动画触发布局)
    • CPU 顶着跑 → 该去找“谁在主线程吃时间”(到 Profiler/hiprofiler 里继续挖)

6) HarmonyOS 6适配:别把“能用”理解为“永远一样”

HiSmartPerf-Device 本身定位偏系统工具/测试工具,所以不存在“API 22 必须改你代码”的问题;但采集链路会变哈

① daemon 路径/拉起方式:以当前设备实际位置为准(别写死盲路径)

官方材料里反复强调:daemon 端要 hdc 环境到位,进 shell 后拉起进程
这意味着你在实验室/CI 里写自动化时,别假设固定路径;用 hdc shell + 官方给出的拉起/停止语义,抓到的报告也走 hdc file recv 归档。

② “调试签名/可调试”只对更深的插件有影响,但会反噬你的流程

hiprofiler 的某些插件(如 nativehooknetwork profiler 这类要进进程内打点的)会明确要求:被采进程必须是调试证书签名的 debug 类型appProvisionType: "debug")。
HiSmartPerf 读 FPS/CPU/GPU/RAM/Temp 这类通常不受这条限制(因为它不hook你的进程),但一旦你把流程升级到“HiSmartPerf 报告 + hiprofiler 深度抓 trace”,签名策略就会浮出来:要么你有 debug 包走测试通道,要么你把深度抓限制在本地复现环境,别指望商店 release 包也能开同一扇门。

③ 别把 HiSmartPerf 的报告当“长期监控”

它更适合:版本对比(v1.2.3 vs v1.2.4)/ 设备档位对比(2G/4G/6G、不同芯片)/ 温控回归
如果你要“线上持续监控”,那是 AppGallery Connect 性能管理/你自己的遥测SDK 的赛道;HiSmartPerf 的角色是“实验室标尺”,不是“线上眼睛”。


7) 总结一下下哦

HiSmartPerf 的「非侵入」本质是:它站在系统外侧读已经存在的账本(帧统计/调度与频点/内存统计/温度),替你按时间轴记下来,最后交还一份报告。
它不替代 DevEco Profiler/hiprofiler 的函数级分析,但它是把“感觉卡”变成“FPS 抖动率 X%、GPU 占 Y%、温度从 A→B 触发降频”的第一块硬证据

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐