2. 编译环境搭建:Ubuntu环境准备、依赖工具安装、Python/Node.js/CCache等工具链配置
好,咱们直接进入正题。搭建编译环境,说白了就是给你的电脑装上能“听懂”鸿蒙源码的工具。这一步要是没弄好,后面编译起来全是坑。我个人习惯用 Ubuntu 20.04 LTS,稳定,社区支持也好。你如果用的是其他版本,问题也不大,但包名可能稍微有点区别。
2.1 Ubuntu 环境准备
我建议你装一个干净的 Ubuntu 系统,别在 Windows 上用 WSL 折腾,虽然也能跑,但文件权限和路径问题会让你怀疑人生。嗯,这里要注意:磁盘空间至少留 100GB,内存 16GB 起步。为什么?因为鸿蒙的源码拉下来就十几个 G,编译中间产物更是能膨胀到 50GB 以上。
核心要点: 使用 Ubuntu 20.04 LTS,确保磁盘分区为 ext4,避免使用 NTFS 或 FAT32 格式。
装好系统后,第一件事就是换源。你想想看,默认的国外源下载速度有多慢?我当年第一次编译时,光装依赖就等了一个多小时。换成清华或中科大的源,速度能快 10 倍。
# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 替换为清华源(Ubuntu 20.04)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
# 更新
sudo apt update && sudo apt upgrade -y
2.2 依赖工具安装
鸿蒙的编译系统依赖一堆基础工具。说白了,就是一些编译器和脚本解释器。我列个清单,你直接复制命令跑就行。
| 工具名称 | 用途 | 安装命令 |
|---|---|---|
| build-essential | 基础编译工具(gcc、g++、make) | sudo apt install build-essential |
| git | 源码版本管理 | sudo apt install git |
| curl & wget | 下载工具 | sudo apt install curl wget |
| unzip & zip | 解压压缩包 | sudo apt install unzip zip |
| libssl-dev | SSL 开发库 | sudo apt install libssl-dev |
| libncurses5-dev | 终端界面库 | sudo apt install libncurses5-dev |
小技巧: 你可以把上面所有包写在一行安装:sudo apt install build-essential git curl wget unzip zip libssl-dev libncurses5-dev -y
我曾经遇到过一个问题:装完所有依赖后,编译时提示找不到 m4 宏处理器。后来才发现,有些依赖是隐式的,不会自动安装。所以建议你再补一个:sudo apt install m4 flex bison。这三个是编译脚本生成器,鸿蒙的 gn 和 ninja 构建系统会用到。
2.3 Python 环境配置
鸿蒙的编译脚本主要用 Python 3 写的。官方要求 Python 3.8 以上。我个人习惯用 pyenv 管理多版本,但如果你只做鸿蒙开发,直接用系统 Python 也行。
# 检查当前 Python 版本
python3 --version
# 如果版本低于 3.8,安装 Python 3.9
sudo apt install python3.9 python3.9-dev python3.9-venv
# 设置默认 Python 3
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1
这里有个坑:Ubuntu 20.04 默认的 Python 3.8 其实够用,但有些工具链需要 python3-distutils 包。我当初没装这个,结果运行 hb build 时直接报错 ModuleNotFoundError: No module named 'distutils'。解决办法很简单:
sudo apt install python3-distutils python3-pip
2.4 Node.js 安装
Node.js 在鸿蒙编译中主要用于前端相关的构建任务,比如 JS 框架的打包。你可能会问:为什么编译系统还要 Node?嗯,因为鸿蒙的 ArkUI 框架有一部分是用 TypeScript 写的,需要 Node 来转译。
我推荐用 nvm 安装 Node,方便切换版本。鸿蒙官方推荐 Node 14.x 或 16.x。
# 安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
# 重新加载终端配置
source ~/.bashrc
# 安装 Node 16 LTS
nvm install 16
nvm use 16
# 验证
node --version
npm --version
警告: 不要用 sudo apt install nodejs 安装,那个版本太旧(通常是 10.x),会导致编译失败。我踩过这个坑,编译到一半报错说 Promise.allSettled 未定义,就是因为 Node 版本太低。
2.5 CCache 配置
CCache 是个好东西。说白了,它是一个编译器缓存工具。你第一次编译时,它会缓存每个 .o 文件。第二次编译时,如果源文件没变,就直接用缓存,速度能快 3-5 倍。
鸿蒙的代码量巨大,全量编译一次要 1-2 小时。有了 CCache,增量编译可能只需要 10 分钟。我建议你从一开始就配好。
# 安装 CCache
sudo apt install ccache
# 配置环境变量(写入 ~/.bashrc)
echo 'export USE_CCACHE=1' >> ~/.bashrc
echo 'export CCACHE_DIR=~/.ccache' >> ~/.bashrc
echo 'export CCACHE_MAXSIZE=50G' >> ~/.bashrc
source ~/.bashrc
# 设置缓存大小(建议 50GB)
ccache -M 50G
# 查看状态
ccache -s
这里有个细节:CCache 默认只缓存 C/C++ 编译。鸿蒙的编译系统用的是 gn + ninja,它们会自动识别 CCache 环境变量。你不需要额外配置。
避坑指南: 我曾经因为 CCache 缓存目录满了,导致编译莫名其妙失败。建议你定期运行 ccache -c 清理缓存,或者设置 CCACHE_MAXSIZE 限制大小。
2.6 知识体系总览
为了让你更直观地理解整个环境搭建的流程,我画了一张图。你可以把它当作一个检查清单,每完成一项就打个勾。
2.7 验证环境
所有工具装完后,我建议你跑一个简单的验证脚本,确保每个环节都没问题。
# 验证 Python
python3 --version && pip3 --version
# 验证 Node
node --version && npm --version
# 验证 CCache
ccache --version && ccache -s
# 验证编译工具
gcc --version && make --version
如果所有命令都正常输出版本号,恭喜你,环境搭建完成。接下来就可以拉取鸿蒙源码,开始真正的编译之旅了。
最后提醒: 把上面这些配置命令保存成一个 shell 脚本,下次重装系统时直接跑一遍,省时省力。我自己的 setup_harmony_env.sh 脚本已经迭代了 5 个版本,每次踩坑就加一行注释。