2、开发环境搭建:AOSP源码下载、编译环境配置、模拟器与真机调试准备

好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,环境搭建这事儿,看着简单,但坑是真不少。我当年第一次搞AOSP编译,光装依赖就折腾了两天。嗯,咱们争取一次搞定。

2.1 AOSP源码下载:别急着敲命令

先说说源码下载。AOSP全称是Android Open Source Project,体量巨大。完整下载一次,大概要30-50GB,编译完更是直奔200GB+。所以,硬盘空间你得留够。

警告: 千万别用Windows直接搞AOSP。我见过有人硬要在Windows上折腾,最后心态崩了。老老实实用Ubuntu 18.04或20.04 LTS,64位系统。

下载源码前,先装Git和Repo工具。Repo是Google专门为管理多Git仓库写的脚本。我个人习惯用清华或中科大的镜像站,速度比Google官方快十倍不止。

# 安装基础工具
sudo apt-get update
sudo apt-get 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

# 安装Repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

# 初始化AOSP(以android-12.0.0_r32为例)
mkdir aosp-12
cd aosp-12
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-12.0.0_r32
repo sync -j4 -c

repo sync -j4 这里的 -j4 表示4个线程并行下载。你机器核多可以调高,比如 -j8-j16。但注意,网络带宽不够的话,开太多反而容易断。我曾经在公司用百兆网络开 -j32,结果下载到一半就超时了……后来老老实实改回 -j4,一晚上搞定。

小技巧: 如果下载中途断了,别慌。直接再跑一次 repo sync,它会断点续传。我当年第一次不知道,删了重下,白白浪费半天。

2.2 编译环境配置:JDK、CCache与优化

源码下完了,接下来配置编译环境。AOSP编译对JDK版本有严格要求。Android 12必须用OpenJDK 11,别用Oracle JDK,也别用更高版本。为什么?因为Google的构建系统就认这个版本,你用别的,编译到一半报错,哭都来不及。

# 安装OpenJDK 11
sudo apt-get install openjdk-11-jdk

# 验证版本
java -version
# 输出应为:openjdk version "11.0.x"

然后,我强烈建议你开启CCache。CCache是个编译器缓存工具。第一次编译慢,但第二次开始,只编译修改过的文件,速度能快50%以上。我在项目中遇到过,没开CCache时,每次全编译要2小时。开了之后,增量编译只要20分钟。这差距,你想想看。

# 设置CCache
export USE_CCACHE=1
export CCACHE_DIR=/path/to/your/ccache/dir
ccache -M 50G  # 设置缓存大小,建议50GB以上

# 把这个加到 ~/.bashrc 里,免得每次都要手动设
echo "export USE_CCACHE=1" >> ~/.bashrc
echo "export CCACHE_DIR=/path/to/your/ccache/dir" >> ~/.bashrc
核心要点: 编译前先执行 source build/envsetup.sh,然后 lunch 选择目标设备。比如模拟器选 aosp_x86_64-eng,真机选对应的 aosp_<设备名>-userdebug
# 加载编译环境
source build/envsetup.sh

# 选择编译目标
lunch aosp_x86_64-eng

# 开始编译(-j16 根据你的CPU核心数调整)
make -j16

第一次编译,耐心等。我当年第一次编译,看着终端滚屏,心里那个忐忑。大概1-2小时后,看到 #### build completed successfully #### 这行字,才算松了口气。

2.3 模拟器调试:快速验证的好帮手

编译完,第一件事就是跑模拟器。模拟器调试方便,不用每次刷机。你想想看,每次改个驱动都要刷机,一天下来手都酸了。

# 启动模拟器
emulator -show-kernel -memory 2048 -cores 4

-show-kernel 参数会显示内核启动日志,这对调试底层驱动特别有用。我调试Camera HAL时,经常盯着这个日志看,看驱动有没有加载成功。

模拟器启动后,用 adb shell 进去,看看Camera服务有没有跑起来:

adb shell dumpsys media.camera

如果能看到Camera设备列表,说明HAL层基本通了。如果报错,别急,后面章节我会详细讲怎么排查。

注意: 模拟器不支持所有硬件特性。比如某些Sensor的ISP管线,模拟器里跑不了。这时候就得靠真机了。

2.4 真机调试准备:刷机与Root

真机调试,我建议用Google的Pixel系列。为什么?因为AOSP对Pixel支持最好,驱动也最全。我用过Pixel 3、Pixel 4,都挺顺手。其他品牌的机器,你得自己找BSP和驱动,那又是另一番折腾了。

真机调试前,先解锁Bootloader:

# 进入Fastboot模式
adb reboot bootloader

# 解锁(会清空所有数据,记得备份)
fastboot flashing unlock

# 刷入编译好的镜像
fastboot flashall -w

-w 参数会清空用户数据。我第一次刷机时忘了加这个,结果系统启动后各种诡异问题,折腾了半天才发现是旧数据冲突了。嗯,这里要注意。

刷完机,建议开启adb root权限。有些调试操作需要root,比如直接访问HAL的sysfs节点。

adb root
adb remount

adb remount 会把系统分区重新挂载为可读写。这样你就能直接push修改后的HAL库到 /vendor/lib/hw/ 目录下,不用每次都重新刷机。我在项目中经常这么干,改一行代码,push一下,重启服务,验证,效率高很多。

2.5 避坑指南:我踩过的那些坑

最后,分享几个我当年踩过的坑,你遇到了可以少走弯路。

  • 磁盘空间不足: 编译AOSP至少需要150GB空闲空间。我当年用120GB的SSD,编译到一半报错,查了半天才发现是磁盘满了。后来换了500GB的,才安心。
  • Python版本问题: AOSP 12需要Python 3.8+。如果你系统默认是Python 2.7,编译时会报错。用 python --version 检查一下,不对就装一个。
  • Swap空间不够: 编译时内存不够,系统会卡死。建议至少16GB内存,再加8GB Swap。我曾在8GB内存的笔记本上编译,结果风扇狂转,最后直接死机。
  • USB权限问题: 真机调试时,如果 adb devices 找不到设备,多半是USB权限没配。创建 /etc/udev/rules.d/51-android.rules 文件,加入你的设备ID,然后 sudo udevadm control --reload-rules 即可。
我的建议: 第一次搭建环境,别追求完美。先让模拟器跑起来,感受一下整个流程。等熟悉了,再上真机。一步一步来,稳一点。

好,环境搭建就到这里。下一章,我们开始真正进入Camera HAL的世界。到时候我会带你分析HAL层的代码结构,看看Camera服务是怎么跟硬件打交道的。准备好了吗?