OpenHarmony源码树解剖:RK3568设备树与x86运行实战指南
发布时间:2026/9/6 8:56:25 锦皓数字建站

做 OpenHarmony 的人应该都有过这种体验照着教程把源码拉下来然后面对几十个 G 的目录树根本不知道该从哪看起。我最早接触 OpenHarmony 的时候盯着顶层目录发了半天呆——代码量太大子系统太多ArkUI、分布式软总线、HDF 驱动框架这些名词堆在一起就像拿到了一本没有目录的百科全书。后来跟着编译、改板卡、看启动日志踩了无数坑才慢慢把源码树这张“城市地图”读懂。这篇文章就想把这张地图的关键路径画给你看同时结合我在 RK3568 和 x86 平台上实际折腾的经验把“设备树到底怎么选”“x86 版能不能在电脑上跑”这些高频问题一次讲透。如果你是第一次接触 OpenHarmony正被源码树劝退如果你已经在 RK3568 板子上跑过 demo但面对一堆 dts 文件不知道怎么选如果你还想在电脑上试着跑一个 x86 版 OpenHarmony——这篇文章应该是你需要的。1. 源码树不是一堆代码而是一张城市地图1.1 OpenHarmony 到底有多大为什么需要“解剖”OpenHarmony 不是一个单一仓库而是几十个 git 仓库通过 repo 工具组织起来的超大规模工程。release 版本的完整源码加上编译工具链和预编译产物轻轻松松超过 20GB编译之后 out 目录再占几十 GB。这个体量决定了你不可能“一行行看完”必须带着目的去解剖。我见过太多新手犯同一个错误想先浏览一遍源码再开始动手结果浏览了两个星期最后还是回到编译这一步。正确的做法恰恰相反先让系统跑起来再顺着“我要改什么”“我想看什么”反向去源码树里找对应位置。源码树本质上是一张城市地图顶层目录就是各个功能区比如市区、工业园、轨道交通枢纽。你要找某个系统能力、某块驱动、某个产品配置如果不知道它在哪个区找起来就是大海捞针。所以“解剖源码树”的核心不是背目录而是建立一套从问题到路径的映射关系。1.2 顶层目录大盘点一眼认出每个仓库的职责把 OpenHarmony 顶层目录按功能分类可以整理成下面这张简表建议第一次接触时先记住这些分类剩下的细节需要时再查。目录职责一句话理解foundation系统基础能力元能力、ArkUI、通信、媒体等子系统的核心代码base基础公共模块安全、启动恢复、全局资源等底层公共能力device设备适配开发板、SoC、外设相关的适配代码vendor厂商产品各硬件厂商的具体产品形态和配置样例productdefine产品定义定义编译出的产品有哪些特性和模块kernel内核Linux 内核、LiteOS 等内核代码drivers驱动框架HDF 驱动框架及驱动实现ark方舟运行时方舟编译器与 JS 运行时相关build编译构建hb 工具、编译脚本、构建模板third_party三方开源库用到的社区开源组件如 zlib、mbedtlsinterface接口定义对外 API 的 IDL 和头文件applications系统应用桌面、设置、相机等预置应用test测试套件各子系统的测试代码utils公共工具库日志、错误码等轻量工具developtools开发工具调测工具、SDK 工具链等这套顶层结构里最容易让人迷茫的是 foundation 和 base 这两个目录。简单说foundation 是“功能核心”像元能力Ability、ArkUI、分布式数据管理都在里面base 是“地基工具”负责安全、启动恢复、资源调度这些偏系统底层的职责。前者管“系统能干什么”后者管“系统怎么稳定跑起来”。2. 核心目录拆解系统能力都藏在 foundation 和 base 里2.1 foundation 里的子系统是怎么划分的进入 foundation 目录你会看到很多子目录每个子目录基本对应一个子系统或一个关键能力。比如 foundation/ability 是元能力框架负责应用怎么启动、页面怎么跳转foundation/arkui 是 UI 框架你写的 XML 或者 ArkTS 声明式界面最终都由它渲染foundation/communication 是分布式通信Wi-Fi、蓝牙、软总线都在这一带。这里我建议新手重点看 foundation/ability、foundation/arkui、foundation/communication 三个目录。从应用开发的角度来说Ability 是打开应用的基础ArkUI 是写界面的基础通信是 OpenHarmony“万物互联”招牌的根基。把这三个目录的顶层结构读明白你对整个系统的运行逻辑会有一个质的提升。每个子系统内部通常还分接口层、框架层和服务层。接口层给应用开发者暴露 API框架层实现核心逻辑服务层跑在系统进程里提供跨进程能力。这个分层思路和很多大型操作系统是一致的理解了它再去查具体代码会快很多。2.2 base、interface、common 这些“小目录”为什么重要有相当一部分人拉完源码根本不会打开 base 目录一眼但其实它决定了一个系统“能不能稳”。base/security 管权限和安全策略base/startup 管开机启动流程base/global 管全球化资源。如果你要做系统级定制比如修改开机时长、调整权限管控策略答案基本都在 base 里。interface 目录看着不起眼但它定义了系统对外的 API 契约。很多跨子系统调用都是通过 interface 里定义的接口来对接的改接口名、改参数结构往往会引起连锁编译错误。我在二开时有个习惯要动某个子系统的接口先去 interface 目录查有没有对应的声明避免只改实现不改契约导致其他模块编译不过。还有 common 这类容易被忽略的目录里面通常是错误码定义、公共日志工具等“杂项”。虽然单个文件不大但几乎所有子系统都会依赖它们编译报错如果找不到某个通用的基础头文件很多时候就是 common 目录没有拉取完整或者版本不匹配导致的。3. 拿到 RK3568 先别急着编译设备树到底怎么选3.1 RK3568 板子为什么会有十几个设备树说到 RK3568就绕不开设备树这件事。很多人在 OpenHarmony 源码里一搜rk3568会发现 device 和 vendor 目录下躺着很多 dts 文件加上内核里带的一堆 dtsi看起来就是在问你“你家的板子是哪一个”其实原因不复杂。RK3568 是一颗通用 SoC瑞芯微官方为它设计了多个评估板版本比如 EVB1、EVB2、EVB6、EVB7。不同版本用的是不同类型的内存DDR4、LPDDR4、LPDDR4X 都有DDR 控制器初始化和电压时序配置可能不同板载外设也有差异比如 MIPI DSI 屏、HDMI、eDP 屏、不同型号的触摸屏和摄像头。SoC 本身是同一颗但板级电路不同。设备树的作用正是告诉内核“我这块板子长什么样、外设接在哪个引脚上”。所以板子有多版本设备树自然就多。再加上 OpenHarmony 生态里做 RK3568 开发板的厂商不止一家润和、瑞芯微官方都有自己的产品配置每个产品会引用不同的 dts。我在源码里见过一个版本中同一款 SoC 对应十几个 dts 文件的情况第一次看到确实头大。3.2 判断板子该用哪个设备树的三条线索我的经验是不要背文件名而是按下面三条线索去排查。第一条先看内存颗粒。这是 RK3568 选 dts 最关键的维度。打开板子背面看内存芯片丝印或者查开发板规格书确认是 DDR4 还是 LPDDR4、LPDDR4X。文件名里带ddr4的就是对应 DDR4 的板型带lpddr4或lpddr4x对应的就是低功耗内存版本。选错这一层轻则启动报错重则内核直接 panic。第二条看硬件版本和板型。很多开发板丝印或者包装上会写着 V1.1、V2.0 之类或者直接标 EVB1、EVB2。源码里的 dts 文件名通常带着板型标识比如rk3568-evb1-ddr4-v10-linux.dts。如果你的板子明确是 EVB1 DDR4那这个文件基本就是对的。第三条看外设接口。如果板子接了 MIPI DSI 屏、HDMI 显示、特定型号的摄像头和触摸屏尽量找对应 dts 里是否包含这些外设节点。厂商一般会在 dts 里通过注释说明当前配置的屏幕和摄像头型号。我实际开发中遇到过一种情况核心板没问题但 dts 里使能的屏幕不对结果编译烧录都成功屏幕上就是没画面。部分 OpenHarmony 版本在编译时会在产品配置里直接指定 dts 名称具体位置可能在vendor/企业名/产品名/config.json或内核构建脚本里。如果你用的是润和 DAYU200它基于 RK3568 EVB 板型常用的是 DDR4 版本的 dts。但每个发行版路径和命名会有差异拿到源码后先搜索rk3568.dts或rk3568-evb关键字找到实际编译引用的那份。3.3 选错设备树的真实表现与补救方法很多人以为选错 dts 不会怎样大不了不能显示。实际远不止如此。我总结了几类典型症状现象大概率原因内核启动阶段卡住串口日志停在 DDR 初始化或早期类似 hang 的状态内存类型不匹配内核能起来但屏幕黑屏或者无信号显示接口或屏幕型号配置错误触摸屏没反应但系统能正常进入桌面触摸 I2C 地址、中断 GPIO 配置不对摄像头打不开报媒体相关错误Sensor 型号或 MIPI CSI 配置不匹配频繁重启或者部分外设工作不稳定电源、GPIO 复用等板级配置有问题补救的方法不复杂改 dts 文件里对应的节点重新编译内核和整包再烧录验证。但如果你刚开始接触建议优先找厂商或者社区里和自己板子一致的开箱方案不要自己从头配 dts那是一条极其“肝”的路。RK3568 在 Linux 内核生态里的资料非常丰富遇到外设不工作可以先查 Linux SDK 里同一块板子的 dts 是怎么配的再照着移植到 OpenHarmony 内核侧效率会高很多。4. 在 x86 电脑上跑 OpenHarmony能做但别被带偏4.1 x86 版 OpenHarmony 的真实形态搜索“电脑版 x86 OpenHarmony”时你会发现很多教程。这里先给一个明确结论OpenHarmony 确实支持 x86_64 架构而且官方源码里早就提供了 qemu-x86_64 和 x86_64 相关产品定义主要用途是跑模拟器方便应用开发者不用买实体开发板也能调试应用。但你看到的所谓“PC 版”很多是基于官方模拟器镜像或者开发者自行移植之后做成系统引导出来的实验性版本不是像普通 Linux 发行版那样为桌面 PC 完整适配的系统。在源码树里x86_64 相关的线索主要分布在productdefine/products、device/qemu、vendor这些位置。如果你用hb set查看可选产品里面一般能看到 qemu-x86_64 或类似名字。选它编译输出的是面向 QEMU 模拟器的镜像。把它通过 GRUB 引导物理机启动理论上可行但显卡、声卡、Wi-Fi、触摸这些硬件的驱动就非常看脸了。4.2 x86 移植时源码树里的关键改动如果真的想在物理机上跑 x86 版 OpenHarmony源码树里需要动的主要有三块。第一块是内核配置。OpenHarmony 标准系统默认侧重 ARM 平台x86 内核需要打开 x86_64 架构相关选项还要确认文件系统、帧缓冲、virtio 驱动是否开启。物理机跑还要额外配置显卡和网卡驱动这部分通常并不轻松。第二块是产品配置。你需要在productdefine/products下找到 x86_64 的产品定义或者基于官方 qemu-x86_64 产品扩展出新的产品配置。这里会涉及启用了哪些系统组件、包管理策略、默认应用列表等改起来要小心组件裁剪过头系统可能无法启动。第三块是根文件系统与引导方式。x86 一般走 GRUB 引导内核和 ramdisk 的加载路径、根文件系统挂载参数都要按实际分区去改。我见过很多 x86 移植启动失败都是引导参数里传给内核的 root 参数写错导致内核起完后找不到根文件系统。还有一个容易踩的坑x86 版本里很多 ARM 相关的 HDF 驱动配置会被裁剪外设框架和 ARM 板卡上的表现差异很大。社区里一些移植教程会把“能进桌面”当成“跑通了”但实际触摸、网络、GPU 加速都还是残缺的。如果你想在电脑上体验一下 OpenHarmony 的交互用官方 QEMU 镜像或者基于开发板的模拟器是更省心的路径如果你想深入移植和内核适配那请做好长时间调试的准备。4.3 运行起来之后的边界与限制即便你成功在 x86 平台上把 OpenHarmony 跑起来了也要清楚它的定位。OpenHarmony 的目标场景是物联网、智能终端、带屏设备和通用桌面系统不完全是一回事。在物理机上它能流畅运行的软件都是围绕 OpenHarmony 应用生态开发的不是直接跑 Linux 的.deb或 Windows 的.exe。你没看错生态边界是最大的限制。我在做了几次 x86 相关尝试后反而更推荐大多数人用 x86 模拟器来做应用层开发。源码树里已经帮你搭好了模拟器的基础设施省去硬件驱动适配启动速度快调试也方便。真要玩硬件适配还是老老实实拿一块 RK3568 开发板更实在。5. 二开从改源码树开始三个最常动的位置5.1 改开机界面与产品名称源码已经能编译烧录之后很多人想做的第一件事就是“把系统改成自己的”。最常见的需求是改开机 logo 和产品名称。开机 logo 一般在设备适配目录下。以 RK3568 为例你可以在device/board/rockchip/rk3568/kernel/logo这类目录里找到logo.bmp、logo_kernel.bmp等文件。替换这些位图文件重新编译内核或者整包开机画面就会变成你的图片。有一点要注意图片格式、分辨率、色深最好和原图保持一致否则内核 logo 显示时可能花屏或者自适应缩放出问题。产品名称一般在productdefine/products下对应的产品 json 文件里。里面会有类似product_name、product_manufacturer这样的字段。改完重新编译系统设置里看到的产品信息就会跟着变。这个操作看似简单却是很多定制项目的起步点改好之后整个源码树就有了“专属”的味道。5.2 修改默认配置与版本号版本号也是高频修改点。OpenHarmony 源码树里通常有一个版本相关的配置文件或者位于build/version.cfg或者位于产品目录下的配置中。搜索const.product.version之类的关键字大概率能找到版本定义的位置。改版本号时建议把大版本、小版本、构建号一起规划好别直接拿来就改否则后面做版本管理和问题溯源会很痛苦。除了版本号系统默认时区、默认语言、默认 WiFi 配置这些也都是在源码或产品配置里控制的。你要做行业定制设备时这些默认值往往比单纯改个名字更重要。我建议每改一处都做好记录并在编译前对改动文件做一次 diff 检查因为 OpenHarmony 的配置继承关系比较多一个小小的缩进或者引号问题就可能让整个构建失败。5.3 重新编译与烧录验证源码改动后重新编译的流程并不复杂核心就是hb set选择目标产品再hb build -f全量或者增量编译。但如果改了内核、dts、产品配置我的建议是先做一次全量编译避免因为旧的中间产物导致问题“假性复现”。全量编译很吃时间和机器性能我试过在性能一般的笔记本上编译 RK3568 版本跑一次大几个小时很正常所以编译前一定要确认好改动。烧录时 RK3568 一般用瑞芯微提供的烧录工具把编译产物中的boot.img、system.img、vendor.img等镜像按分区地址烧进去。如果一个镜像选错系统可能就卡在开机阶段。烧录和编译一样都要养成“先备份原厂镜像、再刷自己镜像”的习惯排错时才有的对比。6. 源码树实操中的常见坑与排查技巧6.1 编译环境与工具链问题源码树本身再干净环境不对也编译不过。OpenHarmony 对宿主机的 Python、Node.js、hb 工具链版本都有要求。我见过太多人在编译第一步就翻车hb命令找不到或者hb version和源码版本不匹配又或者 Node 版本过高导致构建脚本执行失败。这些问题没有太多捷径先读 README再按官方文档装对应版本的工具。hb找不到时通常是环境变量没有配置好可以尝试在源码根目录执行source build/envsetup.sh后再用。另外编译过程切记不要随便中断OpenHarmony 构建系统对中间态的处理不算很稳定中断后残留的临时文件很容易引发奇怪的编译错误最坏情况就是清掉 out 目录重新来。6.2 仓库同步与版本匹配问题用 repo 同步源码树时容易遇到同步中断或者个别仓库拉取失败。通常的做法是稍微下调并发数或者先同步到一部分再继续。同步完成后一定要检查关键目录是否存在比如foundation、device、vendor这些目录不完整编译时会出现大量找不到模块的错误。还有一类坑是分支和 tag 不匹配。manifest 里记录的是某个版本的精确提交如果你中途手动切过分支或者混用了不同版本的源码目录编译时会表现出一堆匪夷所思的错误头文件找不到、接口对不上、构建脚本版本不兼容。遇到这类情况先检查源码树当前分支和 manifest 预期是否一致再考虑重拉或切分支。养成“一个版本用一个干净的源码目录”的习惯能省掉不少时间。6.3 排错心法从启动日志倒推源码位置设备起不来、外设不工作这类问题我强烈建议不要上来就翻代码而是先从串口日志和内核日志入手。RK3568 开发板一般都会引出串口调试口接上 USB 转串口工具波特率通常是 1500000在系统启动时就能看到 bootloader 和内核的输出。日志里往往会直接告诉你哪一步出错比如找不到根文件系统、DTS 里某个设备 probe 失败。拿到日志后再去源码树里搜索对应的设备名、驱动名或者错误关键字。比如日志里说某个 I2C 设备 probe 失败你就去 dts 里查这个 I2C 节点是否使能去内核源码里找对应驱动看支持哪些型号、匹配规则是什么。这套“日志到源码”的排查流程我一直在用效率远高于漫无目的地翻代码。另外要提醒的是串口工具的地线和 TX、RX 不要接反我因为这个踩过好几次坑。接反的表现是串口完全没有数据输出容易误判为硬件损坏或者系统没启动其实是连接方式的问题。推荐第一次用之前先短接串口工具的 TX 和 RX 自发自收确认工具本身正常工作再接板子。我个人在实际操作中的体会是源码树学习最忌讳的是贪多求全。不要试图把所有目录都读一遍而是先定目标你是想做应用就深耕 foundation/ability 和 ark你是想做系统定制就把 vendor、productdefine 和 base/startup 吃透你是想搞硬件适配那 RK3568 的设备树至少要看半个月。把一条线走通比看十遍目录结构有用得多。还有个小技巧修改任何源码前先搜索这个文件是否被其他模块引用用 hb 编译时留意相关依赖很多编译错误其实都是改了一处、连累了三处造成的。OpenHarmony 的源码树是一座宝库也是一个迷宫。希望这篇解剖能帮你少走几步弯路至少在打开目录时能清楚地知道自己正站在地图的哪个位置。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。