1. 环境准备与系统配置
在Ubuntu 16.04 LTS上编译Android 6.0源码需要特别注意系统环境的搭建。这个版本的Ubuntu虽然已经比较老旧,但恰好与Android 6.0的编译需求高度匹配。我强烈建议使用物理机安装Ubuntu而非虚拟机,因为编译过程对系统资源消耗极大,实体机编译速度通常比虚拟机快3-4倍。
1.1 硬件需求分析
编译Android源码是个资源密集型任务,建议配置:
- 至少16GB内存(8GB勉强可用但会大幅延长编译时间)
- 200GB以上的可用磁盘空间(源码+编译产物约需120GB)
- 4核以上CPU(核心数直接影响编译线程数)
重要提示:/home分区建议单独分配至少150GB空间,避免后期因空间不足导致编译失败。我在实际项目中遇到过多次因磁盘空间不足导致的奇怪编译错误,后来发现都是空间惹的祸。
1.2 Ubuntu 16.04安装要点
安装系统时需注意几个关键点:
分区方案:建议采用以下分区结构
- /boot:500MB
- swap:内存大小的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校验MD5:
md5sum 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_CCACHE=1 >> ~/.bashrc source ~/.bashrc prebuilts/misc/linux-x86/ccache/ccache -M 50G6.2 初始化编译环境
在源码根目录执行:
source build/envsetup.sh lunch选择1(aosp_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虚拟机的编译脚本,这种经验是单纯看文档无法获得的。