第二章: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
这个脚本会设置一堆环境变量,还会给你提供几个好用的命令,比如lunch、m、mm等。
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分钟。期间我去泡了杯咖啡,回来发现还在编译……
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的世界——从代码结构开始,一步步实现一个完整的传感器驱动。