第一章:AOSP源码下载与编译——搭建开发环境、下载源码、编译系统、运行模拟器

各位同学,欢迎来到《AOSP系统服务定制与扩展实战》的第一章。

说实话,很多初学者一听到「AOSP源码下载与编译」就觉得头大。我当年第一次接触时也差不多——光下载源码就折腾了两天,编译又挂了三次。但别怕,这一章我会把每一步拆开讲清楚,把那些坑都提前告诉你。

1.1 硬件与操作系统要求

先聊聊硬件。AOSP编译是个体力活,对机器要求不低。

我个人习惯用 Ubuntu 20.04 LTS,这是官方推荐版本。你问为什么不用最新的22.04?嗯,我试过,有些依赖包版本不兼容,反而更麻烦。如果你用 macOS,也能编译,但坑更多——我建议你还是装个虚拟机或双系统。

硬件项 最低要求 推荐配置
CPU 4核 8核以上
内存 16GB 32GB
磁盘 250GB SSD 500GB NVMe SSD
网络 10Mbps 100Mbps以上
注意:磁盘空间千万别省。AOSP完整源码下载后约40GB,编译产物又占80-100GB。我曾经因为磁盘不够,编译到一半直接报错退出,那叫一个崩溃。

1.2 安装必要依赖包

系统装好后,第一件事就是装依赖。别跳过这步,否则编译时会各种报错。

sudo apt-get update
sudo apt-get install -y 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

这里有个小细节:libncurses5 在 Ubuntu 20.04 上可能找不到。我遇到过这问题,解决办法是手动下载安装包。你直接搜「libncurses5 ubuntu 20.04」就能找到解决方案。

1.3 安装Repo工具

AOSP源码管理用的是 Google 的 Repo 工具。它本质上是对 Git 的封装,用来管理上百个 Git 仓库。

mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc
小提示:如果你在墙内,上面的 curl 地址可能连不上。我建议你改用国内镜像源,比如清华或中科大的。具体地址我放在后面的表格里。

1.4 下载AOSP源码

终于到了下载环节。先创建一个工作目录,然后初始化 Repo。

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

这里 -b 参数指定分支。我选的是 Android 13 的稳定版。你问为什么不用最新的14?因为13的生态更成熟,第三方库兼容性好,适合学习。

初始化完成后,开始同步源码:

repo sync -j8 -c

-j8 表示8个线程并行下载。如果你的CPU核心多,可以调大这个数字。但注意,网络带宽才是瓶颈。我试过 -j16,结果路由器直接罢工了。

镜像源 地址
Google官方 https://android.googlesource.com/platform/manifest
清华镜像 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest
中科大镜像 https://git.ustc.edu.cn/aosp/platform/manifest

避坑指南:我曾经在下载到90%时断网,结果 repo sync 报错。别慌,重新执行 repo sync 它会断点续传。但如果一直卡在某个仓库,可以试试 repo sync --force-sync 强制重新同步。

1.5 编译AOSP系统

源码下载完,接下来就是编译。先设置环境变量:

source build/envsetup.sh
lunch aosp_x86_64-eng

lunch 命令会问你选哪个编译目标。aosp_x86_64-eng 是给模拟器用的。如果你想编译真机版本,选 aosp_blueline-userdebug(Pixel 3)之类的。

然后开始编译:

make -j8

第一次编译时间很长,我当时的机器(8核16G)跑了将近3小时。你可以去喝杯咖啡,或者看看文档。编译过程中如果报错,多半是依赖没装全,回头检查一下1.2节。

注意:编译时尽量别动电脑。我试过编译到一半打开Chrome,结果内存不够直接OOM。关掉所有不必要的程序,给编译留足资源。

1.6 运行模拟器

编译成功后,运行模拟器很简单:

emulator

如果提示找不到 emulator 命令,检查一下环境变量有没有设置。或者直接指定路径:

out/host/linux-x86/bin/emulator -kernel prebuilts/qemu-kernel/x86_64/kernel-qemu -system out/target/product/generic_x86_64/system.img -data out/target/product/generic_x86_64/userdata.img -ramdisk out/target/product/generic_x86_64/ramdisk.img

模拟器启动后,你会看到 Android 系统界面。这时候你可以用 adb 连接它:

adb devices

如果看到设备列表里有 emulator-5554,恭喜你,环境搭建成功了。

小技巧:模拟器默认分辨率可能不合适。你可以用 -scale 参数调整,比如 emulator -scale 0.8。我习惯用 -no-window 模式,只在终端里用 adb 操作,省资源。

1.7 常见问题与解决

最后,我总结几个我踩过的坑:

  • Python版本问题:AOSP 13 需要 Python 3.8+。如果你系统默认是 Python 2.7,编译会报错。用 update-alternatives 切换一下。
  • Java版本问题:Android 13 要求 OpenJDK 11。别用 Oracle JDK,我试过,有兼容性问题。
  • 磁盘空间不足:编译到一半报错 No space left on device。检查一下 /tmp 目录,有时候临时文件会占满。用 df -h 看看。
  • 网络超时:repo sync 时经常超时。我建议用国内镜像,或者加 --no-tags 参数跳过标签下载,能快不少。

好了,第一章就到这里。你跟着步骤走,应该能顺利跑起来。下一章我们会深入系统服务的架构,开始真正的定制工作。

记住,环境搭建是基础,基础打牢了,后面才不慌。有问题随时翻翻这一章,或者去社区问问。我们下章见。