2. 开发环境搭建:AOSP源码下载、编译环境配置、模拟器与真机调试准备
说实话,HAL/HIDL开发最劝退人的地方,往往不是接口设计本身,而是环境搭建。我见过太多同事卡在源码下载这一步,一卡就是两三天。这一章,我把这些年踩过的坑、总结的经验,一次性说清楚。
本章核心目标:从零搭建一套可用的AOSP开发环境,覆盖源码下载、编译配置、模拟器与真机调试三个环节。完成后,你能在本地完成一次完整的HAL服务编译与部署。
2.1 硬件与操作系统选型
先聊聊硬件。AOSP编译是个吃资源的活,我建议你至少准备:
- CPU:8核以上,16核最佳。编译时间能从2小时缩到40分钟。
- 内存:32GB起步,64GB不嫌多。我曾在16GB机器上编译Android 13,swap吃满,直接卡死。
- 磁盘:SSD必备,500GB空闲空间。AOSP完整源码加编译产物,轻松吃掉300GB+。
- 操作系统:Ubuntu 20.04 LTS 或 22.04 LTS。别用Windows,别用macOS(除非你愿意折腾Docker)。
注意:Android 14及以上版本对Python版本有硬性要求,必须使用Python 3.8-3.11。Ubuntu 22.04自带的Python 3.10刚好满足。
2.2 AOSP源码下载:repo与git的配合
AOSP源码管理用的是Google的repo工具,它本质上是对git的封装。你想想看,几百个git仓库,一个个clone得疯掉。repo就是来解决这个问题的。
2.2.1 安装repo与配置git
# 1. 安装基础依赖
sudo apt update
sudo apt install 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
# 2. 配置git
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 3. 安装repo
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
# 建议将export写入~/.bashrc
个人经验:repo工具经常因为网络问题下载失败。我习惯在~/bin下保留一份repo的备份,换机器时直接拷贝,省去重复下载的麻烦。
2.2.2 选择分支与下载源码
分支选择很关键。我建议初学者从android-13.0.0_r41开始,这个版本稳定,社区资料多。
# 1. 创建工作目录
mkdir aosp-13
cd aosp-13
# 2. 初始化repo
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41
# 3. 同步源码(这一步最耗时)
repo sync -j8 -c
# -j8: 8个并行任务,根据CPU核心数调整
# -c: 只下载当前分支,减少数据量
为什么会这么慢?因为AOSP有超过600个git仓库,每个都要建立连接、传输数据。我曾经在10Mbps的网速下同步,整整挂了48小时。
避坑指南:repo sync过程中如果中断,不要慌。重新执行repo sync即可,它会断点续传。但注意,如果中断频繁,可能是网络不稳定,建议使用代理或国内镜像源。
2.2.3 国内镜像源加速
如果你在墙内,直接连Google的服务器基本没戏。我推荐使用清华或中科大的镜像:
# 清华镜像
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r41
# 中科大镜像
repo init -u https://git.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r41
关键点:镜像源只加速了manifest仓库的下载,真正的代码仓库仍然从Google拉取。如果想全链路加速,需要配置git代理或使用AOSP镜像的完整同步方案。
2.3 编译环境配置
源码下载完成后,下一步就是编译。Android的编译系统经历了从Make到Soong的演变,现在主流是Soong(基于Blueprint)。
2.3.1 安装JDK与编译工具链
Android 13需要OpenJDK 11。注意,不要装OpenJDK 17,会有兼容性问题。
sudo apt install openjdk-11-jdk
# 验证版本
java -version
# 输出应为:openjdk version "11.0.x"
2.3.2 初始化编译环境
# 进入AOSP根目录
cd aosp-13
# 加载编译环境变量
source build/envsetup.sh
# 选择编译目标
lunch aosp_x86_64-eng
# aosp_x86_64: 模拟器目标
# eng: 工程版本,有root权限,适合开发调试
lunch命令会设置一系列环境变量,包括目标架构、编译类型、输出目录等。我个人习惯用eng版本,因为它默认开启了adb root,省去后续提权的麻烦。
2.3.3 执行编译
# 全量编译(第一次编译必须)
make -j$(nproc)
# $(nproc) 自动获取CPU核心数
# 增量编译(修改后使用)
make -j$(nproc)
第一次编译时间很长,我实测过:
| 硬件配置 | 编译时间 | 备注 |
|---|---|---|
| 8核CPU + 32GB内存 + HDD | 约4小时 | HDD是瓶颈 |
| 16核CPU + 64GB内存 + SSD | 约1.5小时 | SSD提升明显 |
| 32核CPU + 128GB内存 + NVMe | 约40分钟 | 企业级配置 |
优化技巧:编译时加上ANDROID_COMPILE_WITH_JACK=false可以禁用Jack编译器,减少内存占用。另外,使用ccache可以缓存编译中间文件,第二次编译能快30%以上。
2.4 模拟器调试准备
编译完成后,我们可以在模拟器上验证HAL服务。模拟器调试的好处是快速迭代,不用每次都刷真机。
2.4.1 启动模拟器
# 确保已经执行过lunch aosp_x86_64-eng
emulator -writable-system -no-snapshot
# -writable-system: 允许修改系统分区
# -no-snapshot: 不使用快照,保证每次启动都是干净状态
启动后,你会看到一个Android模拟器窗口。这时候执行adb shell,就能进入设备终端。
2.4.2 验证HAL服务是否运行
# 查看所有运行的HAL服务
adb shell lshal
# 查看特定HAL服务(以light HAL为例)
adb shell lshal | grep light
# 如果看到类似:
# android.hardware.light@2.0::ILight/default
# 说明HAL服务已正常启动
注意:模拟器默认只加载了部分HAL服务。如果你开发的HAL服务在模拟器上找不到,需要手动push对应的HAL实现文件到/vendor/lib/hw/或/system/lib/hw/目录。
2.5 真机调试准备
真机调试是HAL开发绕不开的环节。毕竟有些硬件特性(如摄像头、传感器)模拟器无法模拟。
2.5.1 解锁Bootloader与刷入工程版本
不同品牌的手机解锁方式不同,但核心步骤一致:
- 开启开发者选项:设置 → 关于手机 → 连续点击版本号7次
- 开启OEM解锁:开发者选项 → OEM解锁
- 进入Fastboot模式:关机后按住音量减+电源键
- 执行解锁:
fastboot flashing unlock
重要:解锁Bootloader会清除手机所有数据,请提前备份。另外,某些品牌(如华为、荣耀)解锁后会影响保修,甚至无法使用某些功能(如银行App)。
2.5.2 刷入自定义编译的镜像
# 进入AOSP根目录,确保已执行lunch
# 刷入所有分区
fastboot flashall -w
# -w: 清除用户数据
# 或者只刷入特定分区(开发阶段常用)
fastboot flash boot out/target/product/<device>/boot.img
fastboot flash system out/target/product/<device>/system.img
fastboot flash vendor out/target/product/<device>/vendor.img
我个人习惯只刷vendor分区,因为HAL服务都放在vendor分区里。这样每次修改HAL代码后,只需要重新编译vendor镜像并刷入,速度快很多。
2.5.3 启用adb root与remount
# 确认设备已连接
adb devices
# 进入root模式
adb root
# 重新挂载分区为可读写
adb remount
# 验证
adb shell
# 如果看到#号,说明已获得root权限
避坑指南:adb remount在user版本上不可用。所以一定要编译eng或userdebug版本。我曾经在user版本上折腾了半天,最后发现是版本类型选错了。
2.6 知识结构总览
下面这张图概括了本章的核心流程,从环境准备到调试验证,每一步都环环相扣:
2.7 常见问题与解决方案
最后,我把这些年遇到的高频问题整理成表格,方便你快速定位:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| repo sync卡在99% | 网络连接不稳定 | 重新执行repo sync,或使用国内镜像 |
| 编译报错:No rule to make target | 缺少依赖库 | 检查build/target/product/下的mk文件,补全依赖 |
| adb devices找不到设备 | 驱动未安装或USB调试未开启 | 安装手机驱动,检查开发者选项中的USB调试 |
| adb remount失败 | 编译版本为user | 重新lunch选择eng或userdebug版本 |
| 模拟器启动黑屏 | 缺少GPU加速或内存不足 | 启用硬件加速(-gpu host),增加模拟器内存 |
最后说一句:环境搭建是HAL开发的第一道坎,跨过去之后,后面的路会顺畅很多。如果你在搭建过程中遇到问题,不妨先检查一下是不是版本选错了,或者网络没配好——这两个原因占了80%的故障。