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 里,这样每次打开终端就不用重新设了。
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 真机刷机
真机刷机比模拟器复杂一些。你需要:
- 解锁bootloader
- 进入fastboot模式
- 刷入镜像
以Pixel设备为例:
# 解锁bootloader(仅需一次)
fastboot flashing unlock
# 刷入编译产物
fastboot flashall -w
-w 参数会清除用户数据。如果你不想清数据,去掉 -w 就行。但我建议第一次刷机时加上,避免旧数据干扰。
fastboot flash boot boot.img 单独刷boot分区才救回来。建议你刷机前备份重要数据。
2.5 知识体系总览
下面这张图总结了本章的核心流程:
这张图把整个流程串起来了。从环境准备开始,到下载源码、编译,最后到模拟器或真机运行。每一步都有对应的工具和命令。
说实话,第一次走通这个流程,你就算正式踏入Android系统开发的大门了。后面的事情,都是在这个基础上展开的。
公众号:蓝海资料掘金营,微信deep3321