先说结论:这套“RK3588 + OpenHarmony 4.0”的组合,是我最近几个月一直在折腾的主线项目。从拿到开发板、搭交叉编译环境,到把YOLOv8模型量化后跑在NPU上,中间踩的坑比想象中多得多,但走通之后收益也非常明显。如果你手里正好有RK3588开发板,又想试试OpenHarmony除了“跑Demo”之外到底能不能干正事,这篇内容应该能帮你省下一到两周的摸索时间。
这篇文章不是官方文档的复读机,而是我自己实操下来的完整记录。我会把平台选型思路、环境搭建、应用层开发、AI模型部署、常见问题这五块讲透。无论是刚开始接触RK3588的新手,还是已经在OpenHarmony里写过几个应用、想往AI方向拓展的开发者,按着这套流程走,基本能把从“板子点灯”到“摄像头识物”的完整链路拉通。
1. 项目整体设计与平台选型思路
1.1 为什么选RK3588这颗SoC
RK3588这几年在边缘计算和AIoT领域存在感极强,核心原因就三个字:接口全。它采用4核Cortex-A76加4核Cortex-A55的big.LITTLE架构,算力不算顶级,但周边接口非常丰富:PCIe 3.0、双千兆网口、多路MIPI-CSI、HDMI 2.1输入输出、USB 3.1,还有一块6 TOPS算力的NPU。这意味着同一块板子既能当小型服务器用,也能接多路摄像头做视觉检测,还能通过HDMI IN做视频采集。
在实际选型时,我对比过树莓派4B、Jetson Nano和RK3588。树莓派生态好但算力偏低,跑YOLOv8s基本要到2到3秒一帧,实用性不强。Jetson Nano的CUDA生态确实香,但4GB内存版本跑OpenHarmony基本没戏,而且货源和价格都不友好。RK3588最吸引我的是它有16GB或32GB内存版本,还能同时跑Linux和RTOS,再加上瑞芯微官方对开源系统适配投入很大,像OpenHarmony这样的系统在它上面反而比很多老牌芯片跑得更顺。
1.2 OpenHarmony 4.0在这里扮演什么角色
之前很多人对OpenHarmony的印象停留在“能跑个桌面”“能装几个HAP”,用来做轻量设备还行,做复杂业务好像吃力。但OpenHarmony 4.0发布后,情况明显变化。它基于API 10,组件化程度更高,支持ArkTS声明式开发,底层还是Linux内核加LiteOS-A双内核架构。在RK3588这种多核平台上,标准系统跑起来后,开发者既能用你熟悉的Linux工具链,也能直接调系统级的分布式软总线、AI框架接口。
选OpenHarmony 4.0而不是更高版本,一个重要原因是生态成熟度。4.0的SDK、源码、文档和社区案例都比较齐全,很多RK3588开发板厂商出厂就提供4.0的固件和内核补丁。相比追最新版,4.0更适合作为“稳定出活”的基线版本。我实际用下来,它已经具备了作为边缘设备主系统的能力——网络管理、摄像头采集、NPU调用、应用生命周期管理这几块都能正常工作。
1.3 技术路线对比:Android/Linux/OpenHarmony怎么选
在定技术路线之前,我其实纠结了很久。RK3588最成熟的系统肯定是Android,其次是Ubuntu,OpenHarmony排第三。但每个选择都有明显的取舍。
拿Android来说,RK3588的Android适配几乎没有坑,GPU、NPU、Camera都有现成驱动,用Android Studio开发App也很顺手。问题是Android跑AI应用有个尴尬的地方:系统层和应用层都偏重,想要直接通过RGA做图像预处理、或者用Rockit裸调摄像头,需要绕过大量框架限制。另外Android的更新策略和后台管理机制对边缘设备也不太友好,动不动杀后台会让你很头疼。
Ubuntu的路线最自由,甚至可以自己移植根文件系统,所有工具链都能随便装。但Ubuntu下没有官方维护的GUI应用框架,做交互界面需要自己搭Web服务或者Qt,整体开发量不低。OpenHarmony某种程度上是折中方案:它保留Linux内核,应用层用ArkTS或Native C++开发,系统服务可以自己裁剪,NPU和多媒体能力又能通过系统接口直接暴露给应用。开发效率和系统自由度平衡得比另外两条路线好。
从项目目标和最终交付物来看,我们的需求是“开发一个带界面的AI视觉应用,能实时推理并显示结果”,这个场景下OpenHarmony的现代UI框架加原生性能确实更贴合。
2. 环境搭建:从零准备好可编译、可烧录、可调试的开发环境
2.1 主机环境与工具链准备
工欲善其事,必先利其器。搭建环境的第一步不是下载源码,而是确认自己的编译主机。OpenHarmony 4.0标准系统的源码编译,对主机配置有硬性要求。官方推荐Ubuntu 20.04或22.04 64位系统,内存16GB以上,磁盘至少200GB空闲。我第一次想省事,在Windows下用WSL编译,结果编译到一半磁盘不够,后来干脆用一台老服务器装了Ubuntu 22.04,机械硬盘换成了NVMe,编译一次大概40分钟,还算能接受。
编译工具链方面,Ubuntu上需要安装的依赖包括:gn、ninja、LLVM、Python 3.8以上版本、OpenJDK 11、Node.js 14以上版本,以及文件系统打包需要用到的mkfs工具。这里有个很容易被忽略的地方:OpenHarmony的hb工具依赖Python的特定版本,建议用虚拟环境管理,不要直接改系统默认Python,否则后续装别的东西容易冲突。
交叉编译链不用自己装,OpenHarmony源码里自带了预编译的Clang工具链。这个设计很省心,但要注意源码目录的路径不能有中文或空格,否则构建脚本会报一些莫名其妙的路径错误。我把源码放在了/opt/ohos下面,所有编译都在这个目录操作。
2.2 获取OpenHarmony 4.0源码与编译流程
代码获取推荐用repo命令。从码云拉取比GitHub稳定得多,具体步骤是初始化repo仓库,然后同步远程代码。4.0的Release分支比较稳定,我建议直接切到OpenHarmony-4.0-Release标签,不要用master开发分支,否则每天拉代码都可能变更导致编译失败。
# 安装repo工具 mkdir -p ~/bin curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/bin/repo chmod a+x ~/bin/repo # 初始化仓库 export PATH=~/bin:$PATH mkdir /opt/ohos && cd /opt/ohos repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-4.0-Release --no-repo-verify repo sync -c -j8源码同步完大概30GB,代码量相当大。编译前需要先安装hb构建工具,然后设置环境变量:
cd /opt/ohos python3 -m pip install --user build/lite source build/envsetup.sh hb set -root /opt/ohos执行hb set后会列出支持的产品列表。RK3588对应的产品名通常是RK3588或者你开发板厂商自定义的名称,比如某些板子在列表里叫rk3588_standard。选好产品后执行hb build -f,第一次编译建议加-j4限制并行任务,免得内存不够直接OOM。我实测16GB内存跑-j8会卡死,改用-j4就稳定了。
编译产物在out/RK3588/目录下,主要有system.img、vendor.img、updater.img、boot.img这几个镜像文件。如果只是改应用或内核,可以单独编译对应模块,不用每次都全量构建,后面章节会细说。
2.3 烧录与调试:RKDevTool、AB分区与ADB
OpenHarmony在RK3588上默认是AB分区结构,这意味着系统有两个系统槽位,可以支持无缝升级。烧录时用的是瑞芯微官方的RKDevTool,不是日常刷机用的那个。
烧录前先让开发板进入Loader模式:按住板子上的RECOVERY键不放,再按一下RESET,然后通过USB Type-C线连接电脑。在RKDevTool里能看到“发现一个Loader设备”的提示。这里有一个细节,OpenHarmony的烧录分区表和Android不一样,不能直接套用Android的配置。需要先点击“设备分区表”加载parameter-ohos.txt,然后逐个勾选boot_linux.img、system.img、vendor.img等镜像。
烧录完成后第一次开机时间比较长,耐心等就行。系统起来后,OpenHarmony默认会启用ADB调试,但和Android不太一样的是,OpenHarmony的ADB需要解锁开发者模式。在设置里连续点击“关于本机”的版本号7次,再进入开发者选项开启USB调试。之后adb devices就能看到设备了。
另外强烈建议启用网络ADB,RK3588板子一般都有网口,通过ip addr查看板子IP后,执行adb connect 192.168.x.x:5555,这样调试时就不用一直插着USB线了,对后续开发非常方便。
2.4 移植Ubuntu根文件系统带来的启发
虽然主线是OpenHarmony,但开发过程中难免需要用到一些OpenHarmony里没有的Linux工具,比如GDB、perf、交叉编译用的sysroot。很多RK3588开发板厂商会提供Ubuntu根文件系统,早期版本甚至有人专门移植Ubuntu 20.04根文件系统到RK3588上跑。
这个操作其实可以作为OpenHarmony开发的有力补充。方法不复杂:准备一个ext4格式的根文件系统镜像,通过NFS挂载到OpenHarmony系统上,或者直接在板子上用chroot进入Ubuntu环境。我做过一次,用debootstrap构建了Ubuntu 20.04根文件系统,在里面编译了一些OpenHarmony不带的第三方库,然后把编译产物拷贝到OpenHarmony系统里运行,效率非常高。
如果你用的是RK3588开发板,可以关注一下厂商是否提供Ubuntu根文件系统镜像,像瑞芯微官方就有Ubuntu 20.04.5的镜像,下载后解压出来也能作为chroot的根目录。这不算走偏门,本质上是“一套硬件,多套系统工具”,开发调试时非常实用。
3. 核心细节解析:OpenHarmony应用框架与底层硬件能力
3.1 ArkTS / Stage模型:一个AI应用的界面怎么搭
OpenHarmony 4.0的应用开发推荐使用ArkTS语言和Stage模型。ArkTS是TypeScript的超集,强制了静态类型,对长期维护比较友好。Stage模型是4.0主推的UI开发范式,页面由一个个@Entry组件组成,组件的状态通过@State、@Prop、@Link装饰器管理。
以一个AI视觉应用为例,界面通常包含三块:摄像头预览区、推理结果展示区、控制按钮区。在Stage模型里,布局用Column、Row、Stack来组织,类似Flutter的Column/Row。摄像头预览用XComponent,这是OpenHarmony提供的高性能原生渲染容器,可以把Camera数据直接传给Native层绘制,避免在JS层做图像拷贝。
@Entry @Component struct AICameraPage { @State inferenceResult: string = '待检测' private xComponentController: XComponentController = new XComponentController() build() { Column() { XComponent({ id: 'cameraPreview', type: 'surface', controller: this.xComponentController }) .width('100%') .height('70%') Text(this.inferenceResult) .fontSize(24) .margin(16) Button('开始识别') .onClick(() => { // 调用Native推理接口 startInference() }) } .width('100%') .height('100%') } }这里有个关键的架构决策:AI推理不能直接在ArkTS里做,ArkTS跑在ArkTS运行时上,虽然支持调用Native模块,但高频的图像数据传递必须谨慎设计。我采用的是“ArkTS负责UI和业务逻辑,C++负责图像采集和NPU推理”的分层结构,通过N-API进行跨语言调用。图像数据一开始就直接保存在Native层的共享内存里,UI需要显示结果时只传回坐标和类别文本,避免每帧图像都走一遍JS桥接,否则帧率会非常难看。
3.2 Native C++与系统能力接口
OpenHarmony提供了一套完整的Native开发能力,可以通过@ohos.ffi或N-API接口在C++和ArkTS之间互相调用。在RK3588这类设备上,AI推理、编解码、图像处理这些重活一定要放到C++层做。
以我们项目里的NPU推理模块为例,C++侧封装了一个类,暴露给ArkTS的接口很简洁:
#include <napi/native_api.h> napi_value StartInference(napi_env env, napi_callback_info info) { // 读取输入的图像buffer // 调用RKNN推理接口 // 返回结构化结果 return result; } EXTERN_C_START static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = { { "startInference", nullptr, StartInference, nullptr, nullptr, nullptr, napi_default, nullptr }, }; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } EXTERN_C_END static napi_module demoModule = { .nm_version = 1, .nm_flags = 0, .nm_filename = nullptr, .nm_register_func = Init, .nm_modname = "aiinference", .nm_priv = ((void*)0), .reserved = { 0 }, }; extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }编译Native模块需要写CMakeLists,OpenHarmony的构建系统会自动通过externalNativeBuild触发CMake。需要注意构建设置里指定CMAKE_TOOLCHAIN_FILE为OpenHarmony SDK附带的交叉编译工具链文件,否则编译出来的.so是x86平台的,放到板子上直接报“无法执行二进制文件”。这类问题很常见,检测方法很简单:在板子上执行file libaiinference.so,查看架构是否显示aarch64。
3.3 多媒体与外设适配:摄像头、ES8388、MPP/RGA
AI视觉应用绕不开摄像头。RK3588的摄像头接口是MIPI-CSI,不同开发板的摄像头型号和接线不同,驱动配置也不一样。在OpenHarmony上,摄像头的框架层级和Linux V4L2基本一致,设备节点通常是/dev/video0或/dev/video1。调试初期可以用v4l2-ctl工具先测试摄像头是否能出图:
v4l2-ctl -d /dev/video0 --list-formats-ext v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=NV12 v4l2-ctl -d /dev/video0 --stream-mmap --stream-count=10 --stream-to=capture.raw如果v4l2-ctl不报错且生成了非空文件,说明摄像头通路正常。OpenHarmony的Camera HAL负责把V4L2数据流转换成Camera框架的Buffer,这部分代码一般由芯片厂商提供,不需要自己改。如果发现预览画面是黑屏或花屏,优先检查MIPI的lane配置和时钟频率,还要确认Sensor驱动加载是否成功,执行dmesg | grep imx之类来查Sensor型号的驱动日志。
音频方面,很多RK3588开发板用的是ES8388这颗Codec芯片。OpenHarmony默认可能没有启用ES8388的配置,需要在内核设备树里增加对应节点。设备树里的配置主要是I2C地址、音频时钟、GPIO控制引脚。我调试ES8388时遇到过播放无声的问题,最终排查是Codec的时钟源配置不对,改为从RK3588的I2S0 MCLK输出后正常。音频配置完可以先用tinyplay播放一段WAV测试,如果正常再集成到应用里。
图像处理环节,RK3588提供MPP(Media Process Platform)做编解码,RGA(Raster Graphic Acceleration)做格式转换和缩放。这两个加速单元在OpenHarmony里有对应的HAL封装,开发者也可以通过/dev/mpp_service和/dev/rga节点直接访问。我推荐直接调用RGA把摄像头输出的NV12格式转成RGB,因为NPU推理输入通常需要RGB888格式。CPU软转也可以,但1920x1080每帧转换耗时约30毫秒,RGA硬件加速只要不到5毫秒,帧率提升非常明显。
4. AI应用部署:从RKNN模型转换到端侧推理
4.1 RKNN-Toolkit2转换YOLOv8模型
RK3588的NPU不是通用的GPU,它只认瑞芯微自己的RKNN格式模型。所以跑YOLOv8的第一步,是把PyTorch模型权重转换成RKNN格式。转换工具是RKNN-Toolkit2,通过Python安装,依赖pyTorch、opencv等库。
from rknn.api import RKNN rknn = RKNN() # 配置量化级别,rk3588对应RKNN_FLAG_MIX_1 rknn.config(target_platform='rk3588', mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], quantized_dtype='w8a8', quantized_algorithm='normal') # 加载PyTorch模型 ret = rknn.load_pytorch(model='yolov8s.pt', input_size_list=[[1, 3, 640, 640]]) # 构建RKNN模型 ret = rknn.build(do_quantization=True, dataset='dataset.txt') # 导出RKNN模型 rknn.export_rknn('yolov8s_rk3588.rknn') rknn.release()这里有几个关键参数必须说明白。quantized_dtype='w8a8'表示权重和激活都是8bit量化,这是RK3588 NPU上性能最优的配置。dataset.txt里列出的是用于校准的图片路径,通常选200张左右能覆盖各种场景的图片,图片数量和内容直接影响量化后的精度损失。我一开始偷懒只放了20张,结果量化后行人检测的置信度普遍下降0.15以上,后来补到200张才恢复正常。
需要特别提醒:OpenHarmony环境不一定能装RKNN-Toolkit2,这个工具最好在x86的Ubuntu电脑上运行,转换完的.rknn文件再拷贝到板子上。板子上只需要arm64版本的RKNN Runtime库。
4.2 在OpenHarmony应用中调用NPU推理
RKNN Runtime的arm64库里的核心是librknnmrt.so和librknn_api.so。在OpenHarmony Native C++模块中,通过dlopen可以动态加载这个库:
#include <dlfcn.h> #include "rknn_api.h" void* handle = dlopen("librknnmrt.so", RTLD_LAZY); if (!handle) { // 打印 dlerror() 信息 }加载成功后,推理流程是典型的四步:初始化上下文rknn_init、查询输入输出属性rknn_query、设置输入数据rknn_inputs_set、执行推理rknn_run。我实际封装了一层RKNNInference类,输入是RGB888的图像buffer,输出是检测框的坐标和类别。
rknn_context ctx; int ret = rknn_init(&ctx, "yolov8s_rk3588.rknn", 0, 0); rknn_input inputs[1]; inputs[0].index = 0; inputs[0].type = RKNN_TENSOR_UINT8; inputs[0].size = width * height * 3; inputs[0].fmt = RKNN_TENSOR_NHWC; inputs[0].buf = image_buffer; inputs[0].pass_through = 0; rknn_inputs_set(ctx, 1, inputs); rknn_run(ctx, nullptr); rknn_output outputs[3]; // 获取YOLOv8的三个输出头 rknn_outputs_get(ctx, 3, outputs, nullptr); // 后处理:NMS + 阈值过滤这里要注意YOLOv8的输出处理逻辑,和YOLOv5不同,YOLOv8的输出是解耦的,需要把分类分支和回归分支分开处理,然后做NMS。网上有大量参考代码,但很多写错了坐标映射方式。比较稳妥的办法是先用一张固定图片在电脑上输出结果,然后在板子上对比输出,确定坐标和类别完全一致再集成。
4.3 性能调优与内存注意点
RK3588的NPU峰值算力标称6 TOPS,但实际能达到多少取决于模型结构、量化程度和内存带宽。我在调试YOLOv8s时,640x640输入单帧推理大约在50毫秒左右,如果改用yolov8n可以降到25毫秒。对于视觉检测场景,25到50毫秒意味着20到40 FPS,已经能满足大多数业务需求。
推理性能调优有几点经验。第一,模型输入分辨率不要盲目用大图,640x640对大部分场景够用,1080p的图可以先缩放到640再送进NPU。第二,RKNN Runtime支持多线程推理,rknn_run和rknn_outputs_get之间尽量不要插入IO操作,否则Buffer回收不及时会导致延迟抖动。第三,NPU计算和CPU后处理可以流水线化:用两个线程,一个线程负责采集图像和NPU推理,另一个线程负责NMS后处理和UI刷新,中间用环形队列传递原始输出,这样能把端到端延迟从推理时间加后处理时间压缩到接近两者最大值。
内存方面,RK3588板载内存虽然有16GB,但OpenHarmony系统本身占用不少,摄像头buffer和GPU/NPU buffer都是物理连续内存,分配过多会导致其他应用被挤压。建议推理用的图像buffer通过posix_memalign分配256字节对齐的内存,这样NPU访问效率更高。调试时用free -m观察内存余量,如果持续下降,优先检查图像buffer有没有正确释放。
4.4 部署形态扩展:本地推理服务化
如果你的应用不只跑在OpenHarmony的ArkTS界面里,还需要给其他设备提供AI能力,可以把推理封装成HTTP服务。RK3588的网络能力很强,双千兆网口做这事情绰绰有余。
OpenHarmony里有Netserver相关的API可以自己写TCP/HTTP服务,但我更推荐在Native层直接引入轻量级的Web服务框架。项目早期我试着在板子上跑完整的Web服务器框架,结果交叉编译时依赖太多,折腾了几天。后来用了一个思路:在Native层直接处理HTTP请求,只提供一个/inference接口,接收上传的图片,返回检测结果。
这个HTTP服务只做两件事:接收POST请求的二进制图像数据,调用NPU推理,返回JSON结果。用C++手写这部分代码其实不难,大概几百行就能搞定,而且完全不依赖外部库。好处是应用层和硬件层彻底解耦,后续就算不用ArkTS界面,其他设备只要发一个HTTP请求就能获得推理结果,这在做多设备协同或者边缘计算网关时非常实用。
5. 常见问题与排查技巧实录
5.1 编译、烧录类问题
我整理了这段时间遇到的高频问题,方便大家直接对照排查。
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| repo sync 时卡住或报错 | 网络不稳定 | 改从码云仓库同步,启用--no-tags减少数据量 |
| hb build 报找不到Python模块 | 环境变量未生效 | 重新sourcebuild/envsetup.sh,进入源码目录后执行 |
| 编译内存不足 | 并行任务过多 | 改用hb build -j4,或增加swap空间 |
| RKDevTool 烧录一直超时 | 驱动未装好 | 重装驱动,确认USB线是数据线,尝试换USB口 |
| 开机后ADB找不到设备 | 未开启调试 | 在设置里打开开发者模式,开启USB调试 |
| 板子起不来,串口日志停在bootloader | 分区表错误 | 烧录前必须加载parameter-ohos.txt,不能沿用Android分区表 |
hb build还有一个容易被忽略的点:如果修改了产品配置目录下的.board或.gni文件,一定要先执行hb clean再重新编译,否则构建系统会用旧的配置。这类问题报错信息往往不明显,症状就是改了些东西却看不到效果。
5.2 运行、推理类问题
AI模型跑起来之后,问题会从编译期转移到运行期。下面的几个坑几乎每个人都会遇到。
摄像头出图但预览全黑,或者画面撕裂。这个问题大概率是图像格式不匹配。摄像头默认出的可能是NV12,但UI组件期望的是RGBA,需要在Native层做格式转换。我建议直接用RGA做转换,不要用软转。撕裂问题则要检查Buffer的申请和释放,确保vkAcquireNextImageKHR或OH_NativeBuffer_Acquire成对调用。
.so文件编译出来无法加载。这个问题一般是交叉编译工具链没设对,或者链接了主机环境的库。检查方式我已经提过,在板子上执行file libxxx.so,确认显示ELF 64-bit LSB shared object, ARM aarch64。如果是x86-64,重新配CMake工具链再编译。
推理结果和PC端不一致。先检查图像预处理:PC端训练时的预处理是BGR还是RGB,均值方差是多少,这些参数在RKNN配置里必须完全一致。其次检查后处理代码里的坐标映射,YOLO输出在不同输入尺寸下需要按比例缩放回原图坐标,这里非常容易出错。
5.3 一块板子上的工程管理经验
最后聊一些偏工程实践的心得。板子资源有限,不像服务器可以随便折腾,代码版本管理和文件备份非常重要。
我把OpenHarmony的源码目录做成了Git仓库,但是只跟踪修改过的文件,源码本身太大了不要全部提交。具体做法是:源码保持原样,自己改的文件单独放在一个patch目录下,通过脚本自动应用和回滚。这样即使系统崩溃重装,也能快速恢复环境。.rknn模型文件和编译产物我用单独的目录存版,避免和源码混在一起。
另外,板子上的文件系统不建议频繁刷写,特别是vendor分区。我一般只把改动做成system.img增量更新,通过ADB推送到板子重启,这样省去烧录时间。常用的命令组合是:
# 将编译好的镜像推送到板子并重启 adb push out/RK3588/packages/phone/system.img /data/local/tmp/ adb shell dd if=/data/local/tmp/system.img of=/dev/block/by-name/system bs=1M adb reboot用dd直接写入分区的方式有点暴力,但如果你已经进入了调试阶段,这是最快的方法,也能顺便验证AB分区的切换逻辑是否正常。当然生产环境还是建议用升级包方式,这里只是日常开发提效的手段。
这套组合拳打下来,我对RK3588加OpenHarmony的信心比刚开始足了很多。从“这个板子能不能跑OpenHarmony”到“OpenHarmony上能不能部署正式AI业务”,中间的距离其实没有想象中那么远。我个人在实际操作中最深的体会是:别把OpenHarmony当成Android的替代品来用,它真正擅长的是把Linux内核的稳定性和自己的分布式能力结合到一起。如果你也是做边缘AI设备的,建议先别急着追新版本,把4.0这套链路完全吃透,后面迁移到更新版本大概率也能平滑过渡。最后再分享一个小技巧:把所有编译脚本和板子的IP记录下来,单独建一个笔记文档,调试的时候能省掉大量重复操作,这个习惯我从这个项目开始一直在用。