Android HAL层驱动开发入门 - 第3节
3.1 Ubuntu 系统准备
Android HAL 开发环境首选 Ubuntu 长期支持(LTS)版本。当前推荐 Ubuntu 22.04 LTS 或 Ubuntu 20.04 LTS,这两个版本对 AOSP(Android Open Source Project)主分支及主流芯片厂商 BSP 包兼容性最好。
3.1.1 系统安装与基础配置
- 磁盘空间:至少预留 250 GB 空闲空间(完整 AOSP 源码 + 编译产物约需 150~200 GB)。
- 内存与 CPU:建议 16 GB 以上内存,8 核以上 CPU;编译时多核并行可大幅缩短时间。
- 文件系统:推荐 ext4,避免使用 NTFS/FAT32(大小写敏感问题会导致编译失败)。
- Shell 环境:默认 bash 即可,也可使用 zsh + oh-my-zsh 提升效率。
避坑提示:不要在 Windows WSL1 下直接编译 AOSP,WSL2 虽然可用但 I/O 性能较差,建议原生 Ubuntu 或虚拟机(VMware/VirtualBox)分配足够资源。
3.1.2 必备软件包安装
执行以下命令安装编译 AOSP 所需的依赖包:
sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev \
gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev \
x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils \
xsltproc unzip fontconfig python3 python3-pip
关键说明:不同 Android 版本对 Python 版本有要求——Android 8~12 需要 Python 2.7 + Python 3.x;Android 13+ 仅需 Python 3。建议安装
python-is-python3 软链接。
3.2 Android 源码下载与编译环境配置
3.2.1 安装 repo 工具
repo 是 Google 基于 Git 开发的仓库管理工具,用于管理 AOSP 数百个 Git 子仓库。
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
# 将 ~/bin 加入 PATH
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc
3.2.2 下载 AOSP 源码
以 Android 14(android-14.0.0_r30)为例:
mkdir ~/aosp && cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r30
repo sync -j$(nproc) # 根据网络情况,首次同步可能需要 2~6 小时
网络注意事项:国内开发者建议使用清华镜像或中科大镜像加速下载。在
repo init 时将 manifest URL 替换为 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest。
3.2.3 编译环境配置
进入源码根目录,执行以下命令初始化编译环境:
source build/envsetup.sh
lunch aosp_arm64-eng # 选择目标设备与编译类型
编译类型说明:
| 类型 | 适用场景 | 特性 |
|---|---|---|
| eng | 开发调试 | 包含调试工具,ro.debuggable=1,默认 root |
| userdebug | 驱动/应用调试 | 接近 user 版本,但可 root 并包含调试符号 |
| user | 正式发布 | 无 root 权限,性能最优,无调试工具 |
执行编译:
make -j$(nproc) 2>&1 | tee build.log
# 编译完成后,产物位于 out/target/product/<device>/
3.3 交叉编译工具链安装
HAL 驱动开发通常需要独立的交叉编译工具链,用于在宿主机(x86_64)上编译目标设备(ARM/ARM64)的驱动模块。AOSP 自带工具链,但部分厂商 BSP 或内核模块开发需要单独安装。
3.3.1 AOSP 自带工具链
执行 source build/envsetup.sh 后,AOSP 会自动将 prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin 等路径加入 PATH。可直接使用 aarch64-linux-android-gcc 编译 ARM64 内核模块。
3.3.2 独立安装 Linaro 工具链(推荐)
对于独立内核模块或 HAL 库开发,建议使用 Linaro 提供的交叉编译器:
# 下载 ARM64 工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar -xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/
# 设置环境变量
echo 'export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin' >> ~/.bashrc
source ~/.bashrc
# 验证安装
aarch64-linux-gnu-gcc --version
3.3.3 工具链对比
| 工具链来源 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| AOSP prebuilts | 与 AOSP 联合编译 | 版本匹配,无需额外下载 | 版本固定,更新慢 |
| Linaro | 独立内核/驱动模块 | 更新及时,社区支持好 | 需手动配置路径 |
| 芯片厂商 BSP | 特定 SoC 平台 | 针对芯片优化,包含专有库 | 闭源,需签署 NDA |
3.4 adb 与 fastboot 工具使用
adb(Android Debug Bridge)和 fastboot 是 Android 驱动开发中最常用的调试与刷机工具。AOSP 编译后会生成这两个工具,也可单独安装。
3.4.1 安装 adb & fastboot
# 方法一:使用 AOSP 编译产物
cd ~/aosp
source build/envsetup.sh
lunch aosp_arm64-eng
make adb fastboot # 仅编译这两个模块
# 方法二:apt 安装(版本可能较旧)
sudo apt install android-tools-adb android-tools-fastboot
3.4.2 adb 常用命令
| 命令 | 功能 | 示例 |
|---|---|---|
adb devices | 列出已连接的设备 | adb devices |
adb shell | 进入设备 shell | adb shell |
adb push/pull | 文件传输 | adb push hal_module.so /vendor/lib/hw/ |
adb logcat | 查看日志 | adb logcat -s HAL:V |
adb reboot | 重启设备 | adb reboot bootloader |
3.4.3 fastboot 常用命令
| 命令 | 功能 | 示例 |
|---|---|---|
fastboot devices | 列出 fastboot 模式设备 | fastboot devices |
fastboot flash | 刷写分区 | fastboot flash boot boot.img |
fastboot boot | 临时启动内核/镜像 | fastboot boot kernel.img |
fastboot oem unlock | 解锁 bootloader | fastboot oem unlock |
调试技巧:HAL 开发中,使用
adb root 获取 root 权限,然后 adb remount 将系统分区挂载为可读写,即可直接替换 HAL 库文件进行测试,无需每次刷机。
3.5 环境验证清单
完成上述步骤后,建议执行以下验证,确保环境可用:
- Ubuntu 版本:
lsb_release -a确认为 20.04 或 22.04 LTS。 - 磁盘空间:
df -h ~确认剩余空间 > 100 GB。 - repo 工具:
repo --version正常输出版本号。 - AOSP 编译:执行
make -j4编译一个小目标(如make adb)无报错。 - 交叉编译器:
aarch64-linux-gnu-gcc --version输出版本信息。 - adb 连接:连接 Android 设备后
adb devices显示设备序列号。 - fastboot 连接:设备进入 bootloader 后
fastboot devices显示设备。
推荐实践:将上述验证步骤写入脚本
check_env.sh,每次搭建新环境时一键运行,避免遗漏关键组件。