第二章:AOSP源码环境搭建

好,咱们正式开始动手了。

这一章,说白了就是给你搭个“厨房”。没有厨房,再好的菜也炒不出来。AOSP源码环境搭建,是每个Android系统工程师的必修课。我当年第一次搞的时候,光下载源码就折腾了两天——嗯,那时候网速慢,而且我还没搞懂repo的套路。

2.1 硬件与操作系统要求

先说说硬件。别想着拿个4GB内存的笔记本就能编译AOSP,那会把你逼疯的。

项目 最低要求 推荐配置
内存 16GB 32GB或以上
磁盘空间 250GB(仅源码) 500GB SSD
CPU 4核 8核或以上
操作系统 Ubuntu 18.04 Ubuntu 20.04 / 22.04

我个人习惯用Ubuntu 20.04 LTS,稳定,坑少。你问为什么不用Windows?嗯,AOSP官方就不支持Windows编译,别跟自己过不去。

2.2 下载AOSP源码

下载源码,核心工具就一个——repo。它是Google基于Git搞的代码管理工具,专门用来管理AOSP这种超大型项目。

2.2.1 安装Repo

先装Git,再装Repo。命令很简单:

sudo apt-get update
sudo apt-get install git-core
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

这里有个坑——我遇到过很多次,国内网络访问Google的存储服务经常超时。如果你也遇到,可以用清华的镜像:

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

2.2.2 初始化并同步源码

先创建一个工作目录,然后初始化:

mkdir aosp
cd aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r3

-b参数指定分支。我建议新手选一个稳定的发布分支,比如android-13.0.0_r3。别一上来就追master,那个是给勇士准备的。

然后同步源码:

repo sync -j4 -c

-j4表示4个并行任务。如果你的CPU是8核,可以改成-j8。但注意,别开太多,否则网络容易断。我曾经开-j16,结果同步到一半卡死了,气得我直接重来。

小技巧: 如果同步中断了,重新执行repo sync就行,它会断点续传。别傻傻地从头再来。

2.3 配置编译环境

源码下完了,接下来配置编译环境。说白了就是装一堆依赖库。

2.3.1 安装依赖包

不同的Ubuntu版本,依赖包略有不同。以Ubuntu 20.04为例:

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

嗯,这一长串看着吓人,其实你直接复制粘贴运行就行。我当年第一次看到这个列表,心想“这得装到什么时候”,结果发现apt-get会自动处理依赖,几分钟就搞定了。

2.3.2 安装JDK

AOSP 13需要JDK 11。别用OpenJDK 8,那个是给老版本用的。

sudo apt-get install openjdk-11-jdk

装完后检查一下版本:

java -version

如果显示的是11.x.x,那就对了。

2.3.3 设置文件描述符限制

编译AOSP时,会打开大量文件。Linux默认的文件描述符限制是1024,根本不够用。你需要改一下:

ulimit -n 4096

但这样只对当前终端有效。我建议你把它加到~/.bashrc里:

echo "ulimit -n 4096" >> ~/.bashrc

2.4 编译第一个系统镜像

环境配好了,源码也下好了,接下来就是见证奇迹的时刻——编译。

2.4.1 初始化编译环境

进入AOSP根目录,执行:

source build/envsetup.sh

这个脚本会设置一堆环境变量,还会给你提供几个好用的命令,比如lunchmmm等。

2.4.2 选择编译目标

执行lunch命令,选择你要编译的设备类型:

lunch

你会看到一堆选项。对于模拟器,选aosp_x86_64-eng

You're building on Linux
Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_x86_64-eng
     4. aosp_car_x86_64-userdebug
     ...
Which would you like? [aosp_arm-eng]: 3

这里解释一下后缀的含义:

  • eng:工程版,有root权限,适合开发调试
  • userdebug:用户调试版,有部分调试功能
  • user:用户版,没有root权限,跟正式发布的一样

我建议新手先用eng版本,调试方便。等你后面做传感器HAL开发时,需要root权限去读写设备节点,eng版最省心。

2.4.3 开始编译

选好目标后,直接执行:

make -j4

或者用Google推荐的m命令:

m -j4

然后就是漫长的等待。第一次编译大概需要2-4小时,取决于你的机器配置。我当年用一台8核32GB的机器,编译了大概2小时40分钟。期间我去泡了杯咖啡,回来发现还在编译……

注意: 编译过程中如果报错,别慌。90%的错误都是环境问题——要么缺依赖包,要么JDK版本不对,要么磁盘空间不够。仔细看错误日志,Google一下,基本都能解决。

2.4.4 验证编译结果

编译成功后,你会看到类似这样的输出:

#### build completed successfully (02:40:12 (hh:mm:ss)) ####

生成的镜像文件在out/target/product/generic_x86_64/目录下。最重要的几个文件:

  • system.img:系统分区镜像
  • vendor.img:厂商分区镜像
  • ramdisk.img:内存盘镜像
  • userdata.img:用户数据分区镜像

你可以用模拟器来测试这个镜像:

emulator

如果模拟器能正常启动,看到Android桌面,那就说明你的编译环境完全OK了。

2.5 避坑指南

最后,分享几个我踩过的坑:

  • 磁盘空间不足:AOSP源码加编译产物,轻松超过200GB。我建议至少留400GB空余。
  • 网络中断repo sync时如果网络不稳定,加个--no-tags参数,能省不少流量和时间。
  • Python版本:AOSP 13需要Python 3.8以上。如果你系统默认Python版本太低,编译会报错。可以用python3 --version检查一下。
  • 大小写敏感:AOSP源码是在大小写敏感的文件系统上开发的。如果你用macOS,记得把磁盘格式化成大小写敏感的,否则编译会出各种奇怪的问题。

嗯,环境搭建这部分就到这里。下一章,我们会真正进入传感器HAL的世界——从代码结构开始,一步步实现一个完整的传感器驱动。