2. 开发环境搭建:源码获取、编译环境配置、烧录工具使用

说实话,很多做嵌入式开发的朋友,拿到一块新板子,第一反应就是赶紧写代码。但我见过太多人卡在环境搭建这一步,一卡就是好几天。我个人习惯是,先把环境捋顺了,后面才能跑得快。

OpenHarmony 的适配工作,说白了就是三件事:拿到源码、配好编译环境、把固件烧进去。这三步走稳了,后面驱动开发才有基础。咱们一个一个来。

2.1 源码获取:从仓库到本地

OpenHarmony 的源码托管在 Gitee 上。你想想看,这么大的一个操作系统,代码量是百万级甚至千万级的。怎么拿?我建议用 repo 工具,它是专门管理多仓库项目的。

核心思路:repo 工具 + manifest 清单文件,一次性拉取所有相关仓库。

2.1.1 安装 repo 工具

先装 Git,这个不用多说。然后下载 repo 脚本:

# 创建 bin 目录并加入 PATH
mkdir -p ~/bin
export PATH=~/bin:$PATH

# 下载 repo 工具
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/bin/repo
chmod a+x ~/bin/repo

嗯,这里要注意:curl 命令如果网络不好,可能会超时。我曾经在某个客户现场,网络环境特别差,折腾了半小时才把 repo 拉下来。建议提前准备好离线包,或者用国内镜像。

2.1.2 初始化并同步代码

选一个你喜欢的版本。OpenHarmony 有多个分支,比如 master、OpenHarmony-3.2-Release 等。我个人习惯用 -b 参数指定稳定版:

# 创建工作目录
mkdir ohos_workspace
cd ohos_workspace

# 初始化 manifest
repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.2-Release --no-repo-verify

# 同步代码(这一步最耗时)
repo sync -c -j4

-j4 表示用 4 个线程并行下载。如果你的机器性能好,可以改成 -j8 甚至 -j16。但别贪心,网络带宽才是瓶颈。

小技巧:如果同步过程中断了,重新执行 repo sync 就行,它会断点续传。我第一次同步时断了三次,差点崩溃,后来发现这是正常现象。

2.2 编译环境配置:把工具链装好

源码拿到了,接下来要能编译。OpenHarmony 的编译环境,说白了就是一套交叉编译工具链加上一些依赖库。我建议用 Ubuntu 20.04 或 22.04,这是官方推荐的环境。

2.2.1 安装基础依赖

先更新包管理器,然后装一堆工具:

sudo apt update
sudo apt install -y python3 python3-pip python3-setuptools \
    binutils build-essential bison flex \
    libncurses5-dev libssl-dev ccache \
    git curl wget unzip zip

这些包是干什么的?简单说:python3 是编译脚本的运行时,build-essential 是基础编译工具,libncurses5-dev 是菜单配置界面需要的。嗯,不用全记住,但装漏了会报错。

2.2.2 安装交叉编译工具链

OpenHarmony 支持多种芯片架构。我这里以 ARM64 为例,这是目前最常用的:

# 下载 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz

# 解压到 /opt
sudo tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/

# 配置环境变量
export PATH=/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH

验证一下:

aarch64-none-linux-gnu-gcc --version

如果输出版本号,说明工具链装好了。我记得有一次,同事装完没加环境变量,编译时报错说找不到编译器,查了半天才发现是 PATH 没配好。

避坑指南:我曾经在 Ubuntu 18.04 上编译 OpenHarmony 3.2,结果 Python 版本太低(3.6),导致编译脚本报语法错误。建议用 Python 3.8 以上版本。

2.2.3 配置编译环境(hb 工具)

OpenHarmony 的编译入口是 hb 工具。它其实是一个 Python 脚本,负责解析产品配置、调用 Ninja 构建系统。

# 安装 hb
cd ohos_workspace
python3 -m pip install --user build/lite

# 设置环境变量
export PATH=~/.local/bin:$PATH

# 验证
hb --version

如果看到版本号,恭喜你,环境基本就绪了。

2.3 编译流程:从源码到固件

环境配好了,我们来编译一个具体的开发板。以 RK3568 为例,这是 OpenHarmony 官方支持的板子之一。

2.3.1 选择产品

hb set

执行后会弹出一个菜单,让你选择产品。用方向键选择 rk3568,然后回车。这一步其实是在设置 ohos_config.json 中的产品名称。

2.3.2 开始编译

hb build -f

-f 参数表示全量编译。第一次编译时间会比较长,大概 30 分钟到 1 小时,取决于你的机器性能。我建议第一次用全量编译,后面增量编译就快多了。

编译完成后,固件输出在 out/rk3568/packages/phone/images/ 目录下。你会看到一堆文件:

文件名 说明
boot_linux.img 内核镜像
system.img 系统分区
vendor.img 厂商分区(驱动、配置)
userdata.img 用户数据分区
parameter.txt 分区表

重点:驱动开发主要关注 vendor.img,因为你的驱动模块最终会编译进这个分区。

2.4 烧录工具使用:把固件写进板子

固件编译好了,怎么跑起来?烧录。不同芯片厂商的烧录工具不一样。RK3568 用的是 RKDevTool(瑞芯微官方工具)。

2.4.1 安装烧录工具

从瑞芯微官网下载 RKDevTool,或者用 OpenHarmony 社区提供的版本。解压后直接运行:

# 给执行权限
chmod +x RKDevTool

# 运行
./RKDevTool

嗯,这里要注意:烧录工具需要 root 权限来访问 USB 设备。如果提示权限不足,用 sudo 运行。

2.4.2 进入烧录模式

把开发板通过 USB 连接到电脑。按住板子上的 RECOVERY 键(或 MASKROM 键),然后上电或按 RESET 键。RKDevTool 会检测到设备,显示 发现一个LOADER设备。

小技巧:如果一直检测不到设备,检查 USB 线是不是数据线(有些线只能充电)。我曾经被一根劣质 USB 线坑了整整一下午。

2.4.3 配置分区并烧录

在 RKDevTool 中,点击 升级固件 选项卡,选择你编译好的 update.img(或者逐个选择分区镜像)。然后点击 升级。

烧录过程大概 2-5 分钟。完成后板子会自动重启,进入 OpenHarmony 系统。

2.5 知识体系总览

为了让你对整个流程有个全局认识,我画了一张图:

OpenHarmony 开发环境搭建流程 开发环境搭建核心流程 1. 源码获取 安装 repo 工具 repo init 初始化 repo sync 同步代码 2. 环境配置 安装基础依赖包 安装交叉编译工具链 配置 hb 编译工具 3. 编译固件 hb set 选择产品 hb build 全量编译 输出 boot/system/vendor 4. 烧录运行 安装烧录工具 进入烧录模式 选择镜像并烧录 关键输出产物 • boot_linux.img — 内核镜像 • system.img — 系统分区 • vendor.img — 驱动模块存放位置 • parameter.txt — 分区表配置

2.6 常见问题与避坑

环境搭建这块,我踩过的坑比走过的路还多。挑几个典型的说说:

  • repo sync 卡住不动:网络问题。试试用 repo sync --no-tags 跳过标签下载,或者换时间段再试。
  • 编译报错 "Python version too old":检查 Python 版本,OpenHarmony 3.2 要求 Python 3.8+。
  • 烧录时设备识别不到:先确认 USB 线是数据线,再检查驱动是否安装。Windows 下需要装 RockUSB 驱动。
  • 烧录后板子起不来:大概率是分区表不匹配。检查 parameter.txt 是否与板子硬件一致。

重要提醒:千万不要在编译过程中强制中断(比如直接关终端)。Ninja 的增量编译依赖中间文件,强制中断可能导致下次编译失败。我吃过这个亏,最后只能删掉 out 目录重新全量编译。

好了,环境搭建这部分就到这里。工具链配好了,下一步就是真正的驱动开发了。记住一句话:环境搭得好,开发没烦恼。