编译 Android 系统源码 (AOSP)

☆ 0. 准备系统和编译环境

  • 系统: ubuntu 16.04 x86_x64

安装需要的软件:

1
2
3
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl \
zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev \
libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip

☆ 1. 下载源码

由于众所周知的原因,国内访问 Android 源码不大方便, 清华大学做了一件好事, 弄了个 mirror。

https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

下载 repo

Google 自己搞一个源码同步工具,需要下下载。

1
2
3
4
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

上面命令,下载 repo 并将 ~/bin 加入 PATH 环境变量

使用每月更新的初始化包

1
2
3
4
5
6
wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd AOSP # 解压得到的 AOSP 工程目录
# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍即可得到完整目录
# 或 repo sync -l 仅checkout代码

使用这个初始包的好处挺多,应该可以减少一些网络 IO

编译特定版本的 Android

1
2
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
repo sync

其中版本号的对应关系可以从这个页面获得:

https://source.android.com/setup/start/build-numbers

下载对应设备的 Driver Binary

Pixel 2 就直接可以看这个 https://developers.google.com/android/drivers#walleye
目前最新的两个链接为:

将这两个文件在 aosp 根目录解压

1
2
tar zxvf google_devices-walleye-pq2a.190305.002-78f45eb0.tgz
tar zxvf qcom-walleye-pq2a.190305.002-a7c70412.tgz

将得到两个文件 extract-google_devices-walleye.shextract-qcom-walleye.sh
这两个文件为自解压文件,直接执行即可。

1
2
./extract-google_devices-walleye.sh
./extract-qcom-walleye.sh

☆ 2. 编译源码

切换到 aosp 根目录

1
2
3
4
make clobber
source build/envsetup.sh
lunch aosp_arm-eng
make -j4

执行 lunch 可以看到支持的各种 build, 自行选择即可。
编译成功后,将在 out/target/product/walleye/ 目录下生成镜像文件。

1
2
3
4
5
6
7
8
9
-rw-rw-r-- 1 henices henices   33554432 3月   8 01:55 boot.img
-rw-rw-r-- 1 henices henices 8388608 3月 7 17:56 dtbo.img
-rw-rw-r-- 1 henices henices 1570048 3月 8 01:55 ramdisk.img
-rw-rw-r-- 1 henices henices 8721730 3月 8 01:55 ramdisk-recovery.img
-rw-rw-r-- 1 henices henices 1175523656 3月 8 02:17 system.img
-rw-rw-r-- 1 henices henices 84722016 3月 8 02:15 system_other.img
-rw-rw-r-- 1 henices henices 4952764 3月 8 01:28 userdata.img
-rw-rw-r-- 1 henices henices 4096 3月 8 02:17 vbmeta.img
-rw-r--r-- 1 henices henices 369635536 3月 7 16:42 vendor.img

☆ 3. 刷机

刷机比较简单,直接用fastboot 就可以了,将 img 文件和 android-info.txt 拖回本地。

1
2
export ANDROID_PRODUCT_OUT=/tmp
fastboot -w flashall

☆ 4. 注意事项

清华这个 mirror 是定时同步的,所以实时性并不好,如果遇到某个特定版本下载失败,
可以等待一段时间后,再重新执行同步命令。编译时需要的内存比较大,小内存可能导致编译失败,
另外,如果在虚拟机里编译的话,记得多设置几个CPU核,这样编译速度会快一些。

参考资料