Ubuntu 16.04编译Android 6.0源码完整指南
1. 环境准备与系统配置在Ubuntu 16.04 LTS上编译Android 6.0源码需要特别注意系统环境的搭建。这个版本的Ubuntu虽然已经比较老旧但恰好与Android 6.0的编译需求高度匹配。我强烈建议使用物理机安装Ubuntu而非虚拟机因为编译过程对系统资源消耗极大实体机编译速度通常比虚拟机快3-4倍。1.1 硬件需求分析编译Android源码是个资源密集型任务建议配置至少16GB内存8GB勉强可用但会大幅延长编译时间200GB以上的可用磁盘空间源码编译产物约需120GB4核以上CPU核心数直接影响编译线程数重要提示/home分区建议单独分配至少150GB空间避免后期因空间不足导致编译失败。我在实际项目中遇到过多次因磁盘空间不足导致的奇怪编译错误后来发现都是空间惹的祸。1.2 Ubuntu 16.04安装要点安装系统时需注意几个关键点分区方案建议采用以下分区结构/boot500MBswap内存大小的1.5倍/30GB/home剩余所有空间安装时选择最小安装模式避免不必要的软件包占用资源安装完成后立即更新系统sudo apt update sudo apt upgrade -y2. 软件源与依赖环境配置2.1 更换阿里云软件源Ubuntu官方源在国内访问速度较慢更换阿里云源可以显著提升软件下载速度。执行以下命令备份原有源并替换sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt update2.2 安装编译依赖包Android 6.0源码编译需要特定版本的开发工具链以下是我验证过的完整依赖列表sudo apt install -y git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 \ lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \ libgl1-mesa-dev libxml2-utils xsltproc unzip m4 libsdl1.2-dev \ libesd0-dev tofrodos python-markdown特别注意Ubuntu 16.04与14.04的依赖包有所不同直接使用14.04的依赖列表会导致编译失败。我最初就踩过这个坑浪费了大半天时间排查。3. JDK环境配置3.1 OpenJDK 7安装Android 6.0源码必须使用OpenJDK 7编译而Ubuntu 16.04默认仓库已移除了OpenJDK 7。需要通过PPA源安装sudo add-apt-repository ppa:openjdk-r/ppa sudo apt update sudo apt install openjdk-7-jdk3.2 环境变量配置编辑/etc/profile文件配置Java环境变量sudo nano /etc/profile在文件末尾添加以下内容export JAVA_HOME/usr/lib/jvm/java-7-openjdk-amd64 export JRE_HOME${JAVA_HOME}/jre export CLASSPATH.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH${JAVA_HOME}/bin:$PATH使配置立即生效source /etc/profile验证安装java -version正确输出应类似openjdk version 1.7.0_261 OpenJDK Runtime Environment (IcedTea 2.6.22) (7u261-2.6.22-0ubuntu1~16.04.1) OpenJDK 64-Bit Server VM (build 24.261-b02, mixed mode)4. 源码获取与预处理4.1 源码下载建议Android 6.0源码较大(约10GB)建议在Windows下用迅雷等工具下载后再复制到Ubuntu系统。注意存放路径必须全英文中文路径会导致编译失败下载后务必校验MD5值确保文件完整4.2 源码解压与合并如果源码是分卷压缩包需要先合并cat Android6_r1_*Android6_r1.tgz校验MD5md5sum Android6_r1.tgz确认无误后解压tar -zxvf Android6_r1.tgz解压后会生成mydroid目录这就是源码根目录。5. 关键源码修改5.1 解决CLANG编译错误Ubuntu 16.04上编译会遇到CLANG相关的链接错误需要修改nano mydroid/art/build/Android.common_build.mk找到第75行左右将ifneq ($(WITHOUT_HOST_CLANG),true)改为ifeq ($(WITHOUT_HOST_CLANG),false)这个修改是为了绕过Ubuntu 16.04上的CLANG工具链兼容性问题。我在三个不同的机器上都遇到了这个问题修改后都能顺利通过编译。6. 编译配置与优化6.1 启用ccache加速ccache可以缓存编译结果显著提升后续编译速度echo export USE_CCACHE1 ~/.bashrc source ~/.bashrc prebuilts/misc/linux-x86/ccache/ccache -M 50G6.2 初始化编译环境在源码根目录执行source build/envsetup.sh lunch选择1aosp_arm-eng作为编译目标这是最基础的模拟器镜像配置。7. 开始编译7.1 确定编译线程数使用make -jN参数指定并行编译线程数N值建议为CPU核心数的2倍make -j8对于4核CPU推荐使用-j10参数。可以通过以下命令查看CPU信息cat /proc/cpuinfo | grep processor | wc -l7.2 常见编译问题解决内存不足错误 症状编译过程中被kill 解决方案减少并行线程数如改为make -j4或增加swap空间文件权限问题 症状Permission denied错误 解决方案确保所有操作用普通用户执行不要用root依赖缺失错误 症状找不到头文件或库 解决方案根据错误信息安装对应开发包8. 编译完成与验证8.1 编译成功标志编译完成后输出目录为out/target/product/generic/主要文件包括system.img系统镜像ramdisk.img启动镜像userdata.img用户数据镜像8.2 启动模拟器在源码根目录执行emulator首次启动可能需要几分钟时间。如果遇到以下错误emulator: ERROR: x86 emulation currently requires hardware acceleration!需要安装KVM加速sudo apt install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils sudo adduser $USER kvm然后重新登录系统即可。9. 后续开发建议成功编译只是第一步后续可以修改framework层代码并重新编译添加自定义系统服务制作刷机包刷入真机对于真机调试建议先选择Nexus或Pixel系列设备这些设备的官方驱动和源码支持最完善。我曾经在Nexus 5上成功刷入自定义编译的Android 6.0系统整个过程比模拟器复杂但收获更大。10. 经验总结与避坑指南路径问题源码路径必须全英文这是我踩过的第一个坑导致浪费了半天时间依赖版本Ubuntu 16.04和14.04的依赖包有差异不能直接套用旧教程编译中断建议使用screen或tmux启动编译防止网络断开导致编译中断错误排查遇到错误时重点看错误信息的前几行后面的往往是连带错误资源监控编译过程中用htop监控系统资源及时发现瓶颈这个编译过程虽然曲折但让我对Android系统架构有了更深入的理解。特别是解决CLANG问题的过程迫使我阅读了大量art虚拟机的编译脚本这种经验是单纯看文档无法获得的。