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,太低版本会报错。
✅ 我的个人习惯:直接装Ubuntu 20.04 LTS,挂一个200GB的ext4分区给AOSP。别用NTFS格式,编译时权限问题能让你崩溃。

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文件。

操作步骤:

  1. 先编译idegen模块:m development/tools/idegen/
  2. 运行生成器:development/tools/idegen/idegen.sh
  3. 在源码根目录会得到android.ipr和android.iml。
  4. 用Android Studio打开android.ipr。
✅ 我的优化经验:直接导入整个AOSP会让AS索引半天(我16核机器也用了10分钟)。我会删掉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才行。我会在下一节专门讲调试配置。

⚠️ 注意:如果导入后大量报红,别慌。这是因为AOSP的依赖树不完整,AS找不到R.java和某些生成的类。解决方法:先编译一遍生成所有R.java(m SystemUI后),再把out/目录下的gen/路径加入AS的Source Root。具体在File -> Project Structure -> Modules里添加out/soong/.intermediates/...对应路径。

2.5 一张图理清所有步骤

下面这张流程图总结了从零到能改代码的完整路径。你跟着走一遍,基本不会遇到意外。

AOSP开发环境搭建流程图 流程方向:准备环境 → 下载源码 → 编译模块 → 导入IDE → 迭代调试 1. 环境准备 Ubuntu 20.04 + JDK11 + 16GB RAM 2. 下载AOSP源码 repo init + repo sync -c -j8 3. 编译SystemUI模块 source build/envsetup.sh → m SystemUI 4. 导入Android Studio m idegen → 生成.ipr/.iml → 导入 5. 迭代调试 ADB install SystemUI.apk + 实时日志 关键操作:adb root 关键操作:userdebug固件

2.6 最后给点建议

开发环境搭建好了,你已经成功了一半。嗯,剩下的一半就是每天面对各种诡异的bug。不过别怕,后面章节我会把锁屏状态栏的每一个坑都给你填平。现在,先确保你能跑起来m SystemUI并且能在AS里跳转到类定义。如果卡住了,看看提示块里的避坑指南,基本能解决。