Android 源码的编译过程
一、编译环境/设备
- ubuntu 20.04 LTS
- openjdk 1.8
- Pixel XL
- Android版本:10.0
sudo add-apt-repository ppa:openjdk-r/ppa |
- 编译依赖
sudo apt-get install -y libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib |
二、代码下载
2.1 安装初始化依赖工具
sudo apt install curl python git |
2.2 配置repo工具
mkdir ~/bin |
2.3 修改repo默认源
//通过国内镜像更新:在~/.bashrc文件里添加如下两行,保存退出,然后执行source ~/.bashrc更新环境变量 |
2.4 配置git信息
git config --global user.email "you@example.com" |
2.5 初始化仓库
// https://android.googlesource.com/platform/manifest 太慢换成清华倾向 |
2.6 查看源码分支,选择其一下载
初始化完成之后,使用 “ls -a” 命令查看所有隐藏文件,找到.repo,切换到.repo/manifests目录,执行 git branch -a 可以看到所有分支,再次执行 “repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b + 分支名” ,如选择10.0版本:
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r17 --depth=1 --platform=auto |
2.7 同步源码
repo sync |
三、编译源码
3.1 初始化编译环境,切换到源码根路径下,执行如下命令:
source build/envsetup.sh |
3.2 选择编译目标,真机选项见 官方文档
lunch aosp_arm64-eng |
3.3 开始编译,可能等待数个小时
make -j12 |
3.4 当出现如下字样时,编译成功
build completed successfully |
四、启动模拟器
如果中途关闭了终端,需要重新执行source build/envsetup.sh 和lunch命令才能启动模拟器
emulator |
五、真机烧录
这里我采用的真机是 Pixel 一代,目前这款手机可以一直升级到 Android 10,注意在选择真机的时候,一定要问清楚BootLoader是否可解锁!同时真机烧录之前,需要将对应设备的 驱动 一同编译进去,否则将设备将变成一块板砖!设备的驱动需要到 官网 上找对应的 手机型号 和 Android 版本 的驱动!之后就可以开始编译安装了,过程比较简单,网上很多不再赘述,可参见 pixelXL 下载编译源代码刷机烧录记录
5.1 进入bootloader 模式并解锁
adb reboot bootloader |
5.2 烧录系统之前,先双清一下
sudo fastboot erase cache |
5.3 刷入系统镜像
// 进入Android编译产生的文件 /out/target/product/marlin 执行如下命令 |
有时上述命令可能会出问题,可以采用如下方式单个刷入
sudo fastboot flash boot_a boot.img |
5.4 重启设备
sudo fastboot reboot |
六、Google底包镜像系统
这里简单提一下怎么烧录Google官方的镜像底包,打开 镜像底包 链接,找到对应设备对应版本号系统镜像,下载之后解压,可以看到如下文件:

Windows系统上运行 flash-all.bat ,Linux系统上运行flash-all.sh,不过这里如果直接运行可能会出问题,需要做如下修改:
去掉最后一行命令中的 -w 变更如下:
fastboot update image-sailfish-pq3a.190801.002.zip |
七、可能出现的问题
7.1 安装依赖冲突解决
可能是apt的源版本不对,直接在网络上搜寻的apt源大多没有标明ubuntu版本,建议在清华大学镜像源上,选择对应版本的源:
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 |

7.2 找不到libncurses.so.5之类的库,可采用如下暴力手段:
sudo apt-get install libncurses* |
Running an x86 based Android Virtual Device (AVD) is 10x faster

出现如上问题,意思是使用一个x86的模拟器比使用arm内核的要快10倍,建议换成内核为x86的模拟器,否则模拟器启动、运行都会比较慢,可能会等待几分钟才能启动