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与刷入工程版本

不同品牌的手机解锁方式不同,但核心步骤一致:

  1. 开启开发者选项:设置 → 关于手机 → 连续点击版本号7次
  2. 开启OEM解锁:开发者选项 → OEM解锁
  3. 进入Fastboot模式:关机后按住音量减+电源键
  4. 执行解锁: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 知识结构总览

下面这张图概括了本章的核心流程,从环境准备到调试验证,每一步都环环相扣:

开发环境搭建流程 开发环境搭建核心流程 硬件与操作系统选型 AOSP源码下载(repo sync) 编译环境配置 模拟器/真机调试准备 编译子项 • JDK 11安装 • lunch选择目标 调试子项 • 解锁Bootloader • adb root & remount 验证:lshal / adb shell

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%的故障。