【调优工具】Flutter鸿蒙应用为什么选择使用HiSmartPerf

PaddleOCR转ONNX模型实战:5分钟搞定中文OCR推理部署(附完整代码) 本文详细介绍了将PaddleOCR模型转换为ONNX格式并进行高效推理部署的完整实战方案。通过Paddle2ONNX工具实现模型转换,利用ONNX Runtime构建跨平台推理引擎,涵盖环境配置、模型优化、批量处理及多平台部署等关键步骤,显著提升中文OCR在边缘设备上的推理性能。 阅读详情

由于Flutter鸿蒙应用的系统能力是依赖HarmonyOS的,从端到端分析性能的话,就天然分为了两个部分:

第一部分是Dart侧,可以直接使用官方推荐的DevTools​在这里插入图片描述
第二部分是HarmonyOS系统侧,我推荐的是HiSmartPerf(之前叫SmartPerf)​在这里插入图片描述

我们使用DevTools的Timeline是能看到每一帧在 UI 线程和 Raster 线程上怎么花销的,而CPU的调度、RenderService的合成、内存的回收、文件IO等这些发生在应用进程之外的事,DevTools就无法看不到了,这一部分就是这一系列HiSmartPerf工具的专长了!

那么HiSmartPerf是什么?

- Google开源的性能分析工具Perfetto(官方网址为perfetto.dev)应该大厂的小伙伴都知道,这个工具的前身是Systrace,Android性能领域的小伙伴肯定都用过;那么HiSmartPerf 大家可以理解为专为HarmonyOS系统打造的性能调优工具,目前也是开源的,能力覆盖非常完整,是鸿蒙系统及应用调优的专业工具。

可能小伙伴们就要问了,我只是调试个应用而已,为啥要用这个系统级工具?因为我们的应用,在系统层面只是一个进程而已,在HiSmartPerf上,也就只是一个泳道图罢了,我们可以通过系统级的抓取,全局看到整个系统级调度。比如同一帧掉了,可能是Dart build慢,可能是raster被GPU拖住,也可能是线程没抢到调度,而后两种问题根因的答案都在系统trace里!

一、如何理解HiSmartPerf的观测点

HiSmartPerf 的所有观测点都落在操作系统层:内核 tracepoint、perf 硬件采样、eBPF、procfs、系统服务。而任何 Flutter 鸿蒙应用,无论 Dart 代码怎么组织,在操作系统眼里都是一个标准的OHOS用户态进程。

HiSmartPerf 工具观测的是进程与系统,工具不关心进程里跑的是什么框架,框架只是进程里的一段用户态代码。在这里插入图片描述

二、数据源全在系统层

HiSmartPerf下的hiprofiler_cmd工具生成的命令会下发给设备端的采集插件,而插件分两类:

流式插件(如 ftrace 插件,按固定周期从内核缓冲区读数据)

轮询插件(memory、cpu、diskio 等,按采样间隔主动采集)

所有插件询问的对象是内核与系统服务。主要数据源如下:

面板/数据底层机制
CPU 泳道、调度、唤醒树ftrace(sched 相关 tracepoint)
FrameTimeline图形子系统 trace 事件
hiperfperf_event 采样
NativeMemorymalloc/free hook
smaps 五泳道轮询 /proc/pid/smaps
Bio / FileSystem / SysCallftrace 块层事件、系统调用追踪
page_faulteBPF 探针
Xpower / hilog系统功耗与日志服务

解析侧同样如此:通过 trace_streamer 把 trace 转成 sqlite,解析的事件格式来自内核与系统服务,与应用框架没有任何耦合。

三、Flutter 鸿蒙应用就是一个标准 OHOS 进程

把一个 Flutter 鸿蒙应用解剖开,每一层都是标准 OHOS 组件:最外面是 ArkTS 壳层(EntryAbility,跑在 ArkTS 运行时),往里是平台 C++ 嵌入层(负责把引擎接进系统),再往里是 libflutter.so(引擎:Dart VM、Rasterizer、各工作线程),最底下是 Dart AOT 产物加插件 so。三个关键事实撑起可观测性:

进程是系统拉起的: 安装后就是 HAP,进程由系统的 AbilityRuntime 体系启动,走同一套生命周期。启动八阶段泳道(ProcessTouchEvent 到 First Frame)的标记是系统打的,与应用框架无关。

线程是内核线程: Platform、UI、Raster、IO,每条在内核里都是普通的调度单元,有 tid、优先级、调度策略、唤醒关系。HiSmartPerf 的 CPU 泳道、唤醒树作用在它们身上,和作用在任何系统线程身上完全一样。

引擎的输出走系统标准通道: 上一个 DFX 系列已经证实过,引擎日志的三个源头(FML_LOG、平台 C++ 层、ETS 嵌入层)全部汇入 HiLog。日志如此,trace 也如此,引擎源码里的 trace 插桩在 OHOS 构建下接到系统 tracing,引擎内部事件因此能进入 trace 流。在这里插入图片描述

打开一份真实 trace,看到的就是这个结构:每个进程一条泳道,Flutter 鸿蒙应用和系统服务、其他应用并排平铺。​在这里插入图片描述
图:一份真实 trace 打开的样子

四、引擎与系统的每个边界都是标准接口

Flutter 应用和系统的每次交互都发生在 OHOS 标准接口上,而这些接口正是 HiSmartPerf 的观测点,帮助大家理解:

上屏:嵌入层通过 XComponent 拿到 OHNativeWindow,Raster 线程把画好的帧放进这个窗口的 buffer,经 BufferQueue 提交给 RenderService 合成,再交硬件合成器上屏。从系统看,Flutter 应用就是一个往 BufferQueue 生产画面的进程,和 ArkTS 自绘应用、视频播放器是一样的。

VSync:引擎向系统订阅垂直同步信号来驱动每帧,信号源在系统侧,分发可被记录。

内存:引擎和插件的每次分配经过 malloc/mmap。

图形内存走系统通道,所以 DMA、Skia GpuMem 泳道能反映 Flutter 的图像资源。

IO:Dart 侧的文件读取最终落到系统调用与块层。

所以:引擎是 OHOS 系统接口的一个普通消费者,消费行为全部可被系统侧观测。

拿掉帧来走一遍这条接缝,每一站都有对应的观测面板:在这里插入图片描述
图:UI 线程、Raster 线程在应用进程内,合成与上屏在系统侧,全程可观测

以上就是开篇的所有内容了,理解了这篇的初衷,后面大家就跟着我一步一步把HiSmartPerf用起来!

点赞+关注
关注 CPF-Flutter 社区
“AI再牛,技术不能丢

【车载以太网】【架构】整体架构与协议标准 车载以太网架构图 应用层:DHCP /SOMEIP/DoIP/XCP/UDPNM 传输层:TCP/IP 网络层:IPv4/IPv6/ARP/ICMP 链路层:IEEE Ethernet MAC+VLAN 物理层:Ethernet PHY: 100BASE-T1/1000BASE-T1/100BASE-Tx 阅读详情

相关推荐

浅谈Android MVI架构---大自然的搬运工~~~

浅谈 Android MVI架构

hong_world的博客 2146

【调优工具】手把手使用HiSmartPerf抓取一份Trace

HiSmartPerf 是 OHOS 官方的系统级性能分析工具,职责与 Android 生态的 Systrace/Perfetto 相当:是把设备运行时的调度、渲染、内存、IO 数据录成一份 trace 文件,能把数据以时间轴上的方式进行回看,通过工具可以清晰的告诉你在这段时间里,系统在干什么

licabbage的博客 308

SAR动目标检测三剑客:DPCA/ATI/STAP技术选型指南(含2023最新实验数据对比)

本文深入对比了SAR动目标检测三大主流技术DPCA、ATI与STAP的核心原理与性能差异。基于2023年最新实验数据,分析了它们在最小可检测速度、测速精度、计算复杂度及对通道失配敏感度等方面的优劣,并结合海洋监视与城市交通监控等典型场景,提供了具体的技术选型指南与工程落地考量。

m5n6o7的博客 290

【DFX系列开篇】Flutter 鸿蒙应用崩了、卡了、发烫了-从哪里开始查

伴随着社区3.41版本的正式发布,面向 Flutter 鸿蒙开发者,规划了合计11篇DFX系列文章,按问题类型会逐个展开:包括日志、崩溃、卡死、丢帧、时延、功耗、事件、内存、纹理、多设备!带你整体了解 Flutter 鸿蒙在DFX上是怎么做的,怎么用的。这一篇是开篇,我们先打个基础

licabbage的博客 645

从URDF到Gazebo:一个完整的ROS2机械臂仿真项目实战与避坑指南

本文提供了一个完整的ROS2机械臂仿真项目实战指南,详细讲解了从URDF建模、ROS2 Control配置、MoveIt2集成到Gazebo仿真的全流程。文章重点分享了URDF惯性参数设置、Gazebo插件选择、MoveIt2配置修正等关键步骤的避坑经验,帮助开发者快速搭建可用的六轴机械臂仿真环境,实现从静态模型到物理仿真的跨越。

weixin_29279153的博客 266

【XSRP软件无线电】基于软件无线电平台的QPSK频带通信系统设计(含有完整工程资料获取链接)

软件无线电(Software Defined Radio, SDR)是一种无线通信系统,它通过软件来定义和实现无线电的功能,而不是依赖于传统的硬件电路。SDR平台的核心思想是将传统无线电系统中的大部分硬件功能,如调制解调、信号处理、频率选择等,通过软件来实现。这种设计理念使得SDR具有高度的灵活性和可重配置性,能够适应不同的通信标准和频段,快速适应新的通信技术。

嵌入式技术开发 3255

从零搭建一套 Flutter 架构:先跑通数据流

接手新 Flutter 项目时,应先明确数据真实来源、生命周期、错误处理与入口路径。以“加入购物车”为例,通过单向数据流设计:页面仅负责展示与事件触发,由 Repository 统一管理购物车状态,ViewModel 转换为 UI 状态,实现单一真实来源。按功能聚合目录,优先完成垂直切片——从网络请求到页面渲染的完整链路,再逐步引入依赖注入、缓存与异常处理。架构核心是职责清晰、可测试、易维护,而非堆砌框架。

trebleZ的博客 511

【软考之软件设计师】学习笔记

interface 接口implements 实现接口(与接口配套使用)接口里要是有方法定义,子类就会实现。

云轩阁 2519

flutter路由入门教程-GoRouter

GoRouter 是 Flutter 团队官方推荐的声明式路由包,基于 Navigator 2.0 构建。声明式路由配置,路径与页面对应清晰支持路径参数、查询参数支持重定向、路由守卫支持嵌套导航、底部导航栏等场景内置深度链接(Deep Link)支持GoRoute(;},),GoRoute(},),),},},${state'),),},GoRouter 是 Flutter 现代路由管理的标准选择。

坚持原创 250

强化学习在视觉导航中的应用

强化学习在视觉导航中的应用​ ,人工智能,计算机视觉,大模型,AI,强化学习(Reinforcement Learning, RL)是一种通过智能体(Agent)与环境进行交互,以最大化累积奖励为目标的机器学习范式。它不依赖于预定义的规则或大量标注数据,而是让智能体在试错过程中学习最优策略。计算机视觉(Computer Vision)则赋予智能体 “观察” 环境的能力,使其能够从图像或视频中提取有用信息。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 22万+

Transformer时间序列预测-多变量输入-单变量输出+多变量输出,完整代码数据,可直接运行

Transformer时间序列预测-多变量输入-单变量输出+多变量输出,完整代码数据,可直接运行

9786

Flutter版本选择指南:3.44稳定了11周正式转正 | 2026年10月

2026年10月Flutter版本选型指南:3.47补丁密度大幅降低,修复到无障碍的边角,磨合进入收尾期;3.44零补丁11周正式转正Q4基线;3.41.9零补丁逼近六个月,进入交棒倒计时。

developer_laoliu的博客 355

手把手教你学Simulink--基础电机控制场景实例:基于Simulink的无刷直流电机六步换相仿真

摘要:本文详细介绍了基于Simulink的无刷直流电机(BLDC)六步换相仿真方法。文章首先阐述了BLDC六步换相控制的原理,包括霍尔传感器定位、六步换相逻辑和方波电流驱动三大支柱。然后通过电动工具(角磨机)应用场景,展示了如何在Simulink中搭建完整的六步换相系统:从主电路构建、霍尔信号生成、Stateflow换相逻辑实现到开环电压控制。仿真结果显示该系统具有低成本优势(仅需霍尔传感器),但存在±20%转矩脉动。文章还提供了核心代码实现,包括霍尔信号生成、六步换相状态机和转矩分析脚本,并对比了六步换相

MHD0815的博客 142

Flutter实现多语言切换

公司割草机项目使用 Flutter 开发,需要在 App 内支持中英文切换(面向欧洲、美国、澳洲等海外市场)。本文基于一个「商城 + 设备 + 购物车 + 我的」四 Tab Demo,完整讲解 Flutter 多语言切换的实现方式,包括:自定义多语言文案资源与 LocalizationsDelegate;全局状态管理(语言、主题)与 SharedPreferences 持久化;在 MaterialApp 中注册本地化代理与支持语言列表;排查并解决「切换语言后界面不刷新」的典型问题。

u012556114的博客 255

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

React Native与Flutter长期维护成本对比

评估 React Native (RN) 与 Flutter 的长期维护成本,需从及四个核心维度进行量化分析。

铭渊老黄 314

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Flutter 与原生交互的最后一层:RTC 视频帧怎么走

做一个 Flutter 视频通话页,点击“切摄像头”很快,画面却偶尔掉帧;把 RTC 回调里的每帧图像发给 Dart 后,卡顿更明显。于是很容易得出一个结论:“Flutter 和原生之间的桥太慢。”这个判断只说对了一半。要先看清楚,到底是什么东西在过桥。

trebleZ的博客 172

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Windows 上使用 KXBuild 开发 Flutter iOS,真机调试、热重载与打包 ipa 的完整流程

这篇讲在 Windows 上开发 Flutter iOS 的完整流程:用 KXBuild 补上 iOS 端的构建与运行,连接 iPhone 真机调试,Dart 断点、热重载和热重启照常使用,再接入 camera、image_picker 这类插件并补好 Info.plist 权限描述,最后改版本号、用 Release 配置构建 ipa,经 Appuploader 上传 App Store Connect。

2501_91590906的博客 220

flutter状态管理入门教程-Riverpod

Riverpod 是 Flutter 生态中一款编译时安全、可测试、不依赖 Widget 树的状态管理方案,由 Provider 的原作者 Remi Rousselet 设计。它解决了 Provider 在编译期无法检测、需要 BuildContext 等问题。编译时安全:错误的 Provider 引用会在编译期报错,而不是运行期崩溃。不依赖 BuildContext:可以在任意位置(包括纯 Dart 代码)读取状态。可测试:Provider 可以被轻松覆盖(override)以进行单元测试。

坚持原创 255

GoWind ShortPlay 拆解:Flutter 沉浸式 Feed 的播放器工程——生命周期、手势状态机与游客降级

GoWind ShortPlay 拆解 Flutter 端核心工程:以 PageView 自然回收实现播放器生命周期管理,仅活跃页播放并精准交接状态;自研手势状态机解决单击零延迟与双击判定冲突,还原抖音手感;9 个 BLoC 实现轻量状态管理,全局登录态用 ValueNotifier 轻量化处理;401 静默降级三层设计——单飞刷新、失败回游客态、互动时引导登录,保障游客可刷、互动必登录。

喵个咪的专栏 498

flutter网络http请求入门教程-dio

Dio 是一个强大的 Dart HTTP 客户端,专为 Flutter 设计。它提供了比 Dart 官方http支持全局配置和拦截器支持请求/响应拦截、错误统一处理支持文件上传、下载进度监听支持请求取消支持自定义适配器、转换器Dio 是 Flutter 网络请求的事实标准。掌握 Dio 的基础请求、拦截器、错误处理、取消请求、文件操作以及与 Riverpod 的结合,可以覆盖绝大多数移动应用的网络层需求。建议将 Dio 实例、API 方法、数据模型分层管理,保持代码清晰可维护。

坚持原创 222

Flutter 底层渲染引擎怎么变了:从 Skia 到 Impeller,以及迁移时的坑

Flutter 3.47 起,移动端默认启用 Impeller 渲染后端,取代 Skia 运行时编译着色器的模式,旨在消除首帧卡顿。其核心变化在于将着色器预编译、管线状态管理前置,降低渲染波动。但布局与业务逻辑不变,图片、相机、地图、自定义绘制等仍需针对性优化。各平台支持不一:iOS 全面启用,Android 高版本默认开启,旧设备回退至 OpenGL;Web 仍用 Skia。开发者需警惕“卡顿即着色器问题”的误区,重视真机 Profile 与跨后端视觉差异,避免依赖关闭 Impeller 作为长期解决方案

trebleZ的博客 214

flutter进阶教程

JSON 序列化是将 Dart 对象转换为 JSON 字符串的过程,反序列化则是将 JSON 字符串转换为 Dart 对象。在 Flutter 中,网络请求返回的通常是 JSON 数据,需要转换为 Dart 模型类才能方便使用。final int?age;return {'id': id,// 由 build_runner 生成User({this.age,});final int?age;

坚持原创 232

flutter BLoC 单向数据流完整教程

BLoC(Business Logic Component,业务逻辑组件)是一种将业务逻辑与 UI 分离的状态管理架构。它通过**事件(Event)驱动状态(State)**的变化,UI 只负责展示状态并派发事件。UI 只显示状态,不直接操作数据业务逻辑集中在 BLoC 中,便于测试和维护数据流向单一:Event → BLoC → State → UIcount}) {?});});

坚持原创 209

开源鸿蒙平台 CMP 三方库「krumb」适配全流程

本文记录 krumb 在 OpenHarmony 平台的完整适配过程:在不修改 commonMain 代码、零 expect/actual、无新增源文件的前提下,将 Kotlin Multiplatform 通知引擎原样编译为 ohosArm64/x64 KLIB,通过 9 个 C ABI 接口与 ArkTS 桥接,实现优先级队列、Promise 模式、手势控制等全功能真机演示。

2501_94812263的博客 219

【化学实验室|19】HarmonyOS ArkTS 回归测试实战:覆盖启动、空数据、异常输入和重复点击

一个 HarmonyOS 工程里出现 src/test 、 ohosTest 和 Hypium 依赖,不代表核心功能已经受到测试保护。真正有效的回归用例必须能在需求变更后回答:冷启动是否恢复本地数据,空列表是否给出可理解反馈,未选择答案能否提交,连续点击会不会重复记分,参数运行期间是否还能被修改,收藏按钮是否误触整行导航。 本文基于 化学实验室 1.0.5 的真实 ArkTS 源码展开。工程已经依赖 @ohos/hypium 1.0.2

2401_84996024的博客 241

【鸿蒙优选三方库】@ohos/grpc:像调本地方法一样调远程服务

OH_TPC的博客 192
上一篇: 【DFX系列】Flutter 鸿蒙应用多设备适配问题定位
下一篇: 【调优工具】手把手使用HiSmartPerf抓取一份Trace
技术任我行XTing
博客等级 码龄17年 7粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值