1. 为什么需要自己下载和编译AOSP源码作为一名Android开发者你可能已经习惯了使用Android Studio和官方SDK进行应用开发。但当你需要深入理解Android系统底层机制、定制ROM或开发系统级应用时直接操作AOSPAndroid Open Source Project源码就变得至关重要。我最初接触AOSP是在2016年当时需要为一个智能硬件项目定制Android系统。官方提供的Android系统无法满足我们的硬件适配需求必须自己修改底层驱动和框架代码。这个过程让我深刻体会到掌握AOSP源码的获取和编译能力是Android系统开发者的基本功。2. 环境准备构建AOSP编译环境的正确姿势2.1 硬件要求根据Google官方建议编译AOSP需要强大的硬件支持64位操作系统推荐Ubuntu LTS版本至少16GB内存完整编译建议32GB以上至少250GB可用磁盘空间建议500GB SSD多核CPU建议8核以上注意我曾尝试在16GB内存的机器上编译当开启多线程编译时频繁出现OOM错误。后来升级到32GB内存后编译过程才变得稳定。2.2 软件依赖安装在Ubuntu系统上需要安装以下软件包sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig对于较新的Ubuntu版本20.04还需要额外安装sudo apt-get install python-is-python32.3 配置Repo工具Repo是Google开发的用于管理多个Git仓库的工具安装步骤如下mkdir ~/bin curl https://storage.googleapis.com/git-repo-downloads/repo ~/bin/repo chmod ax ~/bin/repo将repo添加到PATH环境变量export PATH~/bin:$PATH3. 下载AOSP源码的完整流程3.1 初始化Repo客户端首先创建一个工作目录mkdir aosp cd aosp初始化Repo客户端。这里建议使用清华镜像源加速下载repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r41提示-b参数指定分支版本可以根据需要替换为其他版本。android-13.0.0_r41是Android 13的一个稳定版本。3.2 同步源码树开始同步源码这将下载约50GB数据repo sync -j4-j4表示使用4个线程并行下载。可以根据网络情况调整这个数值。踩坑记录我第一次同步时没有限制速度结果被公司防火墙误判为异常流量导致IP被封。建议在慢速网络环境下添加--no-clone-bundle和--no-tags参数并限制速度repo sync -j4 --no-clone-bundle --no-tags --current-branch3.3 处理同步失败的情况源码同步可能会因为网络问题中断。可以编写一个自动重试脚本#!/bin/bash for i in {1..10} do repo sync -j4 if [ $? -eq 0 ]; then break fi done4. 编译AOSP的详细步骤4.1 初始化编译环境在源码根目录执行source build/envsetup.sh4.2 选择构建目标使用lunch命令选择构建目标lunch你会看到类似如下的菜单Youre building on Linux Lunch menu... pick a combo: 1. aosp_arm-eng 2. aosp_arm64-eng 3. aosp_x86-eng 4. aosp_x86_64-eng ...对于模拟器测试可以选择aosp_x86_64-eng对于真机调试需要选择对应设备的配置。常见问题如果lunch后没有显示设备选项可能是因为没有下载设备特定的源码。例如Pixel设备需要额外下载驱动wget https://developers.google.com/android/drivers/xxxxxx.tgz tar zxvf xxxxxx.tgz ./extract-xxxxxx.sh4.3 开始编译使用m命令开始编译m -j12-j12表示使用12个线程并行编译。一般设置为CPU核心数的1.5倍左右。完整编译可能需要2-6小时取决于硬件性能。4.4 常见编译错误处理Java版本问题You are attempting to build with an unsupported JDKAOSP不同版本需要特定JDK版本Android 7.0-8.1OpenJDK 8Android 9-10OpenJDK 9Android 11OpenJDK 11内存不足GC overhead limit exceeded解决方法export JACK_SERVER_VM_ARGUMENTS-Dfile.encodingUTF-8 -XX:TieredCompilation -Xmx4g ./prebuilts/sdk/tools/jack-admin kill-server ./prebuilts/sdk/tools/jack-admin start-serverPython版本问题SyntaxError: invalid syntax确保使用Python 3sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 15. 刷机与测试5.1 刷入模拟器编译完成后可以启动模拟器测试emulator5.2 刷入真机对于Pixel等支持AOSP的设备可以使用fastboot刷机fastboot flashall -w警告这将清除设备上的所有数据请提前备份。5.3 验证编译结果检查系统属性adb shell getprop ro.build.fingerprint应该显示类似aosp/sailfish/sailfish:13/xxxxxx/xxxxxx:userdebug/test-keys的信息。6. 高级技巧与优化6.1 增量编译修改部分代码后可以只重新编译修改的部分m -j12或者编译特定模块mmm frameworks/base6.2 使用ccache加速编译安装ccachesudo apt-get install ccache配置ccacheexport USE_CCACHE1 export CCACHE_DIR/path/to/ccache prebuilts/misc/linux-x86/ccache/ccache -M 50G6.3 解决依赖问题当添加新模块时可能需要更新依赖./out/soong/soong_ui.bash --make-mode nothing6.4 IDE导入将AOSP导入Android Studiomake idegen development/tools/idegen/idegen.sh然后在Android Studio中打开生成的android.ipr文件。7. 常见问题解决方案repo sync卡住不动检查网络连接尝试更换镜像源使用repo sync -c --no-tags减少同步内容lunch没有设备选项确保同步了完整源码检查设备驱动是否已下载尝试lunch aosp_arm-eng直接指定目标编译过程中断查看具体错误信息尝试m -j1单线程编译定位问题检查磁盘空间是否充足模拟器无法启动确保已安装KVM加速检查显卡驱动是否正常尝试emulator -verbose查看详细日志刷机后无法启动确保选择了正确的设备配置检查bootloader是否解锁尝试fastboot format userdata在实际工作中我发现保持AOSP源码树的干净非常重要。每次同步前最好repo forall -c git reset --hard repo forall -c git clean -fdx这样可以避免很多奇怪的编译问题。另外建议将AOSP源码放在ext4文件系统上NTFS或FAT32可能会遇到权限问题。