2. 开发环境搭建:AOSP源码下载、编译、导入Android Studio
搭建开发环境是咱们这门课的第一步。说实话,这一步最磨人——很多新手在这卡好几天。我自己带过好几个团队,每次新人入场,至少有一半的时间花在环境上。所以这一章我尽量把坑都给你指出来。
2.1 硬件与操作系统——别让机器拖后腿
先说说硬件。AOSP编译是个体力活,我见过有人拿4GB内存的笔记本跑,结果编译了三天三夜还报OOM。我的建议是:
- RAM:至少16GB,32GB更舒服。我自己用的是64GB工作站,全编大概15分钟。
- 磁盘:SSD必须的。源码加编译产物轻松吃掉200GB+,我一般预留400GB。
- 操作系统:Ubuntu 18.04/20.04最稳。macOS也能跑,但我劝你别在M1上折腾——兼容问题太多。
- JDK:AOSP 12以上用OpenJDK 11,太低版本会报错。
2.2 下载AOSP源码——你的第一次repo sync
源码下载主要靠Google的repo工具。说白了,repo就是一堆Git仓库的管理器。AOSP有上千个仓库,一个个拉会疯的。
步骤很简单,但细节决定成败:
# 1. 安装repo(我习惯放~/bin)
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
# 2. 创建工作目录
mkdir ~/aosp-source && cd ~/aosp-source
# 3. 初始化仓库(这里选android-13.0.0_r41)
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41
# 4. 同步代码(加上 -c 并行,j4根据你的CPU核数调整)
repo sync -c -j8
repo sync不加参数。遇到过网络断掉,中途停止,然后你也不知道该重拉哪个仓库。我的做法:先repo sync -c -q静默模式,出错了再看具体仓库。另外,如果被墙了,建议配置国内镜像,比如清华或中科大的AOSP镜像。
同步时间取决于网速。我100M带宽大概2小时能拉完。拉完后检查一下repo status,确保没有未完成的仓库。
2.3 编译源码——从make到soong
AOSP从Android 7开始逐渐用soong替代make,但对外我们仍然用m、mm这些快捷命令。第一次编译我建议直接全编SystemUI模块,加快反馈。
核心命令:
# 设置环境变量(必须在源码根目录下)
source build/envsetup.sh
# 选择目标设备(我用的是Pixel 5,代号redfin)
lunch aosp_redfin-userdebug
# 只编译SystemUI模块
m SystemUI
# 如果只想编一个apk,用mm
cd frameworks/base/packages/SystemUI
mm
为什么我推荐先编模块?全编一次要20-30分钟,但只编SystemUI模块只需1-2分钟。你在调锁屏状态栏时,改一行代码跑一次全编?等不起。所以我一直用m SystemUI加adb install的方式迭代。
编译产物默认在out/target/product/redfin/下。你关心的SystemUI apk在system/priv-app/SystemUI/SystemUI.apk。注意:userdebug版本会带root和adb remount权限,调试方便。
第一次编译可能会遇到缺少依赖库,比如libncurses5、lib32z1等。我的做法是直接装全了:
sudo apt install git-core gnupg flex bison build-essential zip curl zlib1g-dev \
gcc-multilib g++-multilib libc6-dev-i386 libncurses5 x11proto-core-dev \
libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
2.4 导入Android Studio——终于可以看代码了
AOSP源码用Vim?不,现代安卓工程师必须拥抱IDE。但AOSP项目太大,直接开AS会卡死。Google提供了一个工具idegen.jar,可以生成android.ipr和android.iml文件。
操作步骤:
- 先编译idegen模块:
m development/tools/idegen/ - 运行生成器:
development/tools/idegen/idegen.sh - 在源码根目录会得到
android.ipr和android.iml。 - 用Android Studio打开
android.ipr。
android.iml中大部分模块,只保留frameworks、system、packages等关键目录。具体的做法:用文本编辑器打开android.iml,找到<excludeFolder>把out/、prebuilts/、external/排除掉。这样AS启动飞快。
导入成功后,你就可以在AS里右键Run或者Debug SystemUI了。不过注意:AS的Run实际上会触发adb shell am start,但SystemUI是系统进程,需要adb root才行。我会在下一节专门讲调试配置。
m SystemUI后),再把out/目录下的gen/路径加入AS的Source Root。具体在File -> Project Structure -> Modules里添加out/soong/.intermediates/...对应路径。
2.5 一张图理清所有步骤
下面这张流程图总结了从零到能改代码的完整路径。你跟着走一遍,基本不会遇到意外。
2.6 最后给点建议
开发环境搭建好了,你已经成功了一半。嗯,剩下的一半就是每天面对各种诡异的bug。不过别怕,后面章节我会把锁屏状态栏的每一个坑都给你填平。现在,先确保你能跑起来m SystemUI并且能在AS里跳转到类定义。如果卡住了,看看提示块里的避坑指南,基本能解决。