2. 开发环境搭建:从零开始,跑起你的第一个驱动

说实话,环境搭建是很多初学者最头疼的一步。我见过不少同学,代码写得挺好,结果卡在编译环境上,一折腾就是两三天。这一章,我就带你一步步把整个开发环境搭起来。跟着我的节奏走,别跳步,基本不会出问题。

本章目标:完成从源码获取、编译环境配置、IDE安装到调试环境准备的全流程。搭好之后,你就能在模拟器或真机上跑第一个驱动了。

2.1 整体流程概览

先看看我们要做哪些事。我习惯在动手前先理清脉络,这样心里有底。

环境搭建整体流程 ① 获取源码 ② 编译环境配置 ③ IDE安装配置 ④ 模拟器调试 ⑤ 真机调试 建议按顺序执行,不要跳步。尤其是 Docker 环境,我见过太多人图省事跳过,后面编译报错又回头补

2.2 获取 OpenHarmony 源码

源码获取是第一步。OpenHarmony 的代码托管在 Gitee 上,国内访问速度还不错。

2.2.1 环境准备

你需要先装好 Git 和 repo 工具。repo 是 Google 出的多仓库管理工具,OpenHarmony 用它来管理上百个 Git 仓库。

# 安装 Git
sudo apt-get install git git-lfs -y

# 配置 Git 用户信息
git config --global user.name "Your Name"
git config --global user.email "your@email.com"

# 安装 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
我的习惯:把 repo 加到 ~/.bashrc 里,这样每次开终端就不用重新 export 了。echo 'export PATH=~/bin:$PATH' >> ~/.bashrc

2.2.2 下载源码

以 OpenHarmony 4.0 Release 版本为例。我个人建议用这个版本,比较稳定,社区支持也好。

# 创建工作目录
mkdir -p ~/ohos && cd ~/ohos

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

# 同步代码(这一步比较耗时,看网速)
repo sync -c -j4
注意:源码包大概 10GB 左右,同步时间取决于你的网络。我曾经在咖啡店同步了一下午,结果中途断网...建议用有线网络,或者找个网速好的时段。

2.3 编译环境配置(Ubuntu + Docker)

编译环境是坑最多的地方。OpenHarmony 对编译工具链版本有严格要求,我强烈推荐用 Docker 来隔离环境。为什么?

  • 版本一致:团队所有人用同一个镜像,不会出现「我这儿能编你那儿不行」的情况
  • 干净隔离:不影响你本机的其他开发环境
  • 快速重建:搞坏了?删了容器重新跑一个,一分钟搞定

2.3.1 安装 Docker

# 安装 Docker
sudo apt-get install docker.io -y

# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

# 将当前用户加入 docker 组(避免每次 sudo)
sudo usermod -aG docker $USER

# 重新登录终端使组生效
# 或者直接执行:newgrp docker

2.3.2 拉取编译镜像

官方提供了编译镜像,直接拉取就行。

# 拉取 OpenHarmony 标准编译镜像
docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:4.0

# 查看镜像是否拉取成功
docker images

2.3.3 启动编译容器

这里有个关键点:要把源码目录挂载到容器里。

# 启动容器,挂载源码目录
docker run -it --name ohos_build \
  -v ~/ohos:/home/openharmony \
  swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:4.0 \
  /bin/bash
避坑指南:我曾经忘记挂载目录,在容器里编了半天才发现编的是空目录...记得加 -v 参数。另外,--name 给容器起个名字,后面方便 docker start/stop。

2.3.4 执行编译

进到容器里,开始编译。以 rk3568 开发板为例:

# 进入源码目录
cd /home/openharmony

# 安装编译依赖(首次需要)
bash build/prebuilts_download.sh

# 设置编译目标
./build.sh --product-name rk3568 --ccache

# 等待编译完成(第一次编译大概 30-60 分钟)

编译完成后,镜像文件在 out/rk3568/packages/phone/images/ 目录下。

2.4 IDE(DevEco Studio)安装与配置

DevEco Studio 是华为基于 IntelliJ IDEA 定制的 IDE,专门用于 OpenHarmony 开发。说实话,用起来比命令行舒服多了。

2.4.1 下载与安装

  1. 从华为开发者官网下载 DevEco Studio 最新版(目前是 4.0 以上)
  2. 解压后运行 ./bin/studio.sh 启动
  3. 首次启动会引导安装 SDK,按提示操作即可

2.4.2 配置 SDK

安装完成后,需要配置 SDK 路径。我习惯把 SDK 放在单独目录,方便管理。

配置项 推荐值 说明
SDK 路径 ~/ohos/sdk 与源码目录分开,避免混淆
API 版本 10 或 11 对应 OpenHarmony 4.0/4.1
NDK 版本 最新稳定版 驱动开发需要 NDK 编译工具链

2.4.3 导入驱动工程

DevEco Studio 可以直接导入 OpenHarmony 源码中的驱动示例。路径在 drivers/peripheral/ 下,有很多现成的驱动 demo。

我的做法:先跑一遍官方的 GPIO 驱动示例,确认环境没问题,再开始写自己的驱动。这样能快速定位问题是出在环境还是代码上。

2.5 模拟器与真机调试环境准备

调试是驱动开发的重头戏。你想想看,驱动跑在内核态,出问题就是系统崩溃,没有好的调试手段根本没法干活。

2.5.1 模拟器调试

DevEco Studio 自带模拟器,支持 rk3568 等主流开发板。启动方式很简单:

  1. 在 DevEco Studio 中点击 Tools → Device Manager
  2. 选择对应的模拟器镜像(需要提前下载)
  3. 点击启动,等待模拟器开机

模拟器适合做功能验证。比如你写了个 LED 驱动,先在模拟器上看看注册、打开、读写这些流程能不能走通。

注意:模拟器毕竟不是真硬件,有些硬件相关的操作(比如中断、DMA)模拟不了。我遇到过在模拟器上跑得好好的驱动,上真机就崩了。所以模拟器只能做初步验证,最终还是要上真机。

2.5.2 真机调试环境

真机调试需要准备以下东西:

  • 开发板:推荐 rk3568 或 hi3516dv300,社区支持好
  • USB 线:数据线,不要用充电线(我吃过这个亏,插上没反应)
  • 串口线:USB 转 TTL,用于查看内核日志
  • 网络:开发板和电脑连同一个局域网,用于 NFS 或 ADB 调试

连接步骤:

# 1. 用 USB 线连接开发板和电脑
# 2. 安装串口驱动(CH340/CP2102 等)
# 3. 用串口工具连接(波特率 115200)
sudo minicom -D /dev/ttyUSB0 -b 115200

# 4. 开发板上电,观察串口输出
# 5. 确认系统启动正常后,用 ADB 连接
adb devices
调试三板斧:
  1. dmesg:看内核日志,驱动加载信息都在这里
  2. cat /sys/kernel/debug/:查看驱动调试节点
  3. logcat:看用户态日志,HDF 框架的日志走这个通道

2.6 环境验证:跑一个 Hello World 驱动

环境搭好了,我们来验证一下。写一个最简单的 HDF 驱动,看看能不能加载成功。

// hello_driver.c
#include "hdf_device_desc.h"
#include "hdf_log.h"

#define HDF_LOG_TAG hello_driver

static int32_t HelloDriverBind(struct HdfDeviceObject *deviceObject)
{
    HDF_LOGI("HelloDriver: Bind called");
    return HDF_SUCCESS;
}

static int32_t HelloDriverInit(struct HdfDeviceObject *deviceObject)
{
    HDF_LOGI("HelloDriver: Init called");
    return HDF_SUCCESS;
}

static void HelloDriverRelease(struct HdfDeviceObject *deviceObject)
{
    HDF_LOGI("HelloDriver: Release called");
    return;
}

struct HdfDriverEntry g_helloDriverEntry = {
    .moduleVersion = 1,
    .moduleName = "hello_driver",
    .Bind = HelloDriverBind,
    .Init = HelloDriverInit,
    .Release = HelloDriverRelease,
};

HDF_INIT(g_helloDriverEntry);

编译后烧录到开发板,用 dmesg | grep HelloDriver 查看日志。如果看到 "Bind called" 和 "Init called",恭喜你,环境搭建成功了!

一个小技巧:第一次跑通后,把这个 Hello World 驱动备份一下。后面每次改环境配置,都重新编译烧录一次,能快速确认环境是否正常。

好了,环境搭建就到这里。这一套流程我反复验证过多次,按步骤来基本不会出问题。如果遇到报错,先检查版本是否匹配,再看路径是否正确——90% 的问题都出在这两个地方。