2、Android源码获取与编译:AOSP源码下载、repo工具使用、编译环境搭建、模拟器与真机刷机

这一章,我们聊聊怎么把Android源码搞到手,并且让它跑起来。

说实话,很多初学者卡在这一步就放弃了。源码下载慢、编译报错、刷机变砖……这些坑我都踩过。今天我把这些经验整理出来,希望能帮你少走弯路。

2.1 AOSP源码下载——从零开始

AOSP,全称Android Open Source Project。说白了,就是Google开源的Android系统代码。我们做系统开发,第一步就是把它下载到本地。

我个人习惯把源码放在 /home/你的用户名/aosp 目录下。别放桌面,也别放Windows共享目录——文件系统兼容性问题会让你哭的。

2.1.1 环境准备

你需要一台Linux机器,Ubuntu 18.04或20.04都行。我推荐20.04,兼容性最好。

先装依赖包:

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

嗯,这里要注意:不同Ubuntu版本依赖包名可能略有差异。如果你遇到 libncurses5 装不上,试试 libncurses5-dev 或者 libncurses-dev

2.1.2 安装Repo工具

Repo是Google专门为管理多Git仓库设计的工具。AOSP有几百个Git仓库,靠手动一个个clone?不现实。

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

export PATH=~/bin:$PATH 加到 ~/.bashrc 里,这样每次打开终端就不用重新设了。

小技巧: 如果你在墙内,repo下载可能会超时。我曾经遇到过这个问题,后来改用清华镜像源:export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

2.1.3 初始化并同步代码

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

-j4 表示4个线程并行下载。如果你的机器性能好、网速快,可以改成 -j8 甚至 -j16。但别太大,小心把路由器搞崩了——我试过 -j32,结果路由器重启了……

同步时间取决于你的网速。我第一次下载花了大概3小时。如果中途断了,重新执行 repo sync 就行,它会断点续传。

2.2 Repo工具使用——不只是下载

很多人以为repo只是用来下载代码的。其实它还有很多实用功能。

2.2.1 常用命令一览

命令 作用 我常用的场景
repo sync 同步所有仓库 每天上班第一件事
repo status 查看所有仓库状态 检查有没有未提交的修改
repo diff 查看所有仓库的diff 提交前review代码
repo start 创建新分支 开始一个新功能开发
repo upload 提交代码到Gerrit 团队协作时用

2.2.2 分支管理

repo的分支管理和git不太一样。它是在所有仓库上同时创建同名分支。

repo start my-feature --all

这条命令会在所有仓库上创建 my-feature 分支。但说实话,我很少用 --all,因为有些仓库我不需要改。我更习惯:

repo start my-feature frameworks/base packages/apps/Settings

只在我需要修改的仓库上创建分支,这样更清晰。

注意: 不要在 repo sync 之前忘记提交你的修改。我曾经有一次改了三天代码,忘了commit,结果一个 repo sync 全没了……从那以后我养成了每天 repo status 的习惯。

2.3 编译环境搭建——让代码变成镜像

源码下载完了,接下来就是编译。这一步坑最多,我慢慢说。

2.3.1 硬件要求

别想着用4GB内存的机器编译Android。我试过,编译到一半直接OOM(内存溢出)。

  • 内存: 至少16GB,推荐32GB
  • 磁盘: 至少200GB空闲空间。AOSP源码+编译产物,轻松吃掉150GB
  • CPU: 核心越多越好。8核起步,16核不嫌多

如果你用的是SSD,编译速度会快很多。我自己的机器是32GB内存 + 1TB NVMe SSD,编译一次大概40分钟。

2.3.2 设置编译环境

source build/envsetup.sh

这条命令会加载一系列编译相关的函数。之后你就可以用 lunch 选择编译目标了。

lunch aosp_arm64-eng

aosp_arm64-eng 表示:

  • aosp:设备名,通用模拟器
  • arm64:64位ARM架构
  • eng:工程版,有root权限,适合开发调试

其他常用选项:

  • aosp_x86_64-eng:x86模拟器,启动更快
  • aosp_arm64-userdebug:带debug信息的user版
  • aosp_arm64-user:正式发布版,没有root

2.3.3 开始编译

make -j$(nproc)

$(nproc) 会自动获取你的CPU核心数。比如8核CPU,就相当于 make -j8

第一次编译会很久。我建议你泡杯咖啡,或者干脆下班前跑上,第二天来看结果。

常见错误: 如果编译过程中报 jack-server 相关的错误,通常是内存不够。可以试试 export JACK_SERVER_VM_ARGUMENTS="-Xmx4096m" 增大JVM内存。

2.4 模拟器与真机刷机——让系统跑起来

编译成功之后,你会得到一堆镜像文件。怎么用它们?两种方式:模拟器和真机。

2.4.1 启动模拟器

最简单的方式:

emulator

前提是你已经 source build/envsetup.sh 并且 lunch 过了。模拟器会自动加载你刚编译出来的镜像。

如果你需要更精细的控制:

emulator -avd my_avd -wipe-data -no-snapshot
  • -wipe-data:清除用户数据,相当于恢复出厂设置
  • -no-snapshot:不从快照启动,保证每次都是干净状态

我个人调试时经常用 -wipe-data,因为有些bug只在首次启动时出现。

2.4.2 真机刷机

真机刷机比模拟器复杂一些。你需要:

  1. 解锁bootloader
  2. 进入fastboot模式
  3. 刷入镜像

以Pixel设备为例:

# 解锁bootloader(仅需一次)
fastboot flashing unlock

# 刷入编译产物
fastboot flashall -w

-w 参数会清除用户数据。如果你不想清数据,去掉 -w 就行。但我建议第一次刷机时加上,避免旧数据干扰。

警告: 刷机有风险。我曾经有一次刷错了镜像,导致设备变砖。后来用 fastboot flash boot boot.img 单独刷boot分区才救回来。建议你刷机前备份重要数据。

2.5 知识体系总览

下面这张图总结了本章的核心流程:

AOSP源码获取与编译流程 环境准备 Ubuntu + 依赖包 + Git 下载源码 repo init + repo sync 编译 lunch + make 模拟器运行 emulator 命令启动 真机刷机 fastboot flashall 编译产物:system.img / boot.img / userdata.img

这张图把整个流程串起来了。从环境准备开始,到下载源码、编译,最后到模拟器或真机运行。每一步都有对应的工具和命令。

说实话,第一次走通这个流程,你就算正式踏入Android系统开发的大门了。后面的事情,都是在这个基础上展开的。

我的建议: 第一次编译时,别追求速度。仔细看编译日志,了解每个阶段在做什么。遇到错误别慌,Google一下,八成能找到解决方案。Android社区很活跃,你遇到的问题大概率别人也遇到过。

公众号:蓝海资料掘金营,微信deep3321