Ubuntu 18.04虚拟机编译Android源码实战指南
1. Ubuntu 18.04虚拟机环境下编译Android源码全指南
在虚拟机环境中编译Android源码是许多开发者必经的"成人礼"。我曾在不同配置的机器上完成过数十次完整编译,从最初耗时两天一夜的煎熬到现在三小时搞定,积累了不少实战经验。本文将基于Ubuntu 18.04 LTS环境,带你避开我踩过的所有坑。
为什么选择Ubuntu 18.04?这是Google官方推荐的Android开发环境之一,其长期支持特性(LTS)保证了系统稳定性,且社区资源丰富。虚拟机方案则能实现环境隔离,避免污染主机系统,特别适合需要同时处理多个项目的开发者。
2. 环境准备与系统配置
2.1 虚拟机创建要点
推荐使用VMware Workstation Pro 16+或VirtualBox 6.1+。关键参数设置:
- 磁盘空间:至少250GB(Android 11源码约需150GB)
- 内存:16GB起步(8GB也能编译但极慢)
- CPU核心:分配宿主机50%物理核心(如8核主机给4核)
重要提示:务必选择"将虚拟磁盘存储为单个文件"选项,否则性能损失可达30%
安装Ubuntu时需注意:
# 分区方案建议: / : 50GB ext4 swap : 内存1.5倍 /home : 剩余空间 ext42.2 基础依赖安装
先更新软件源:
sudo apt-get update && sudo apt-get upgrade -y安装编译必备工具链:
sudo apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev \ libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev \ lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python2踩坑记录:Ubuntu 18.04默认python3,需手动配置python2:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2 sudo update-alternatives --config python # 选择python23. 源码获取与环境配置
3.1 仓库工具配置
安装repo工具:
mkdir ~/bin curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo配置环境变量(添加到~/.bashrc):
export PATH=~/bin:$PATH export USE_CCACHE=1 export CCACHE_DIR=/home/$USER/.ccache ccache -M 50G # 设置缓存大小3.2 源码下载技巧
初始化仓库(以Android 11为例):
mkdir ~/aosp && cd ~/aosp repo init -u https://android.googlesource.com/platform/manifest -b android-11.0.0_r48使用清华镜像加速:
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-11.0.0_r48同步源码(建议夜间执行):
repo sync -j4 --no-tags --no-clone-bundle实测数据:100M宽带下完整同步约需6-8小时,遇到中断可重复执行sync命令
4. 编译过程详解
4.1 环境初始化
加载编译环境:
source build/envsetup.sh选择编译目标:
lunch # 交互式选择 或 lunch aosp_x86_64-eng # 直接指定4.2 核心编译命令
启动编译(使用ccache加速):
make -j$(nproc) 2>&1 | tee build.log关键参数说明:
- -jN:并行编译任务数(通常设为CPU核心数×1.5)
- 2>&1 | tee:同时输出到屏幕和日志文件
性能优化:在虚拟机设置中启用"虚拟化CPU性能计数器",可提升15%编译速度
4.3 编译进度监控
查看剩余任务:
watch -n 10 'cat out/build_status.txt'估算剩余时间:
tail -f build.log | grep -E '\[.*%\]'典型编译时间参考(i7-10700/16GB):
- 首次编译:3.5-5小时
- 增量编译:10-30分钟
5. 常见问题解决方案
5.1 内存不足处理
当出现"GC overhead limit exceeded"错误时:
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" ./prebuilts/sdk/tools/jack-admin kill-server ./prebuilts/sdk/tools/jack-admin start-server5.2 文件系统错误修复
遇到"ext4文件系统只读"错误:
sudo umount /dev/sda1 sudo fsck -y /dev/sda1 sudo mount -o remount,rw /5.3 Java版本冲突
Android源码需要特定Java版本:
sudo update-alternatives --config javac sudo update-alternatives --config java验证版本:
java -version # 需显示1.8.x javac -version6. 编译后操作
6.1 镜像文件生成
查看产出物:
ls -lh out/target/product/generic_x86_64/*.img关键镜像文件:
- system.img:系统镜像
- ramdisk.img:启动镜像
- userdata.img:用户数据分区
6.2 模拟器运行
启动编译好的镜像:
emulator -show-kernel -no-snapshot -no-audio -no-window性能提示:关闭GUI可节省30%内存:添加
-no-window -gpu off参数
6.3 刷机实测
将镜像刷入真机(以Pixel 3为例):
fastboot flashall -w注意先解锁bootloader:
fastboot flashing unlock7. 高级技巧与优化
7.1 增量编译加速
只编译修改部分:
mmm path/to/module # 编译单个模块 mma # 编译当前目录模块7.2 CCache配置优化
查看缓存统计:
ccache -s重置缓存:
ccache -C7.3 多版本管理技巧
创建版本快照:
repo forall -c 'git tag -a my_build_$(date +%Y%m%d) -m "Tagged for build"'切换版本:
repo sync -l # 仅更新索引 repo forall -c 'git checkout my_build_20230601'8. 虚拟机专属优化方案
8.1 磁盘性能提升
将虚拟磁盘转为独立持久模式:
sudo vmware-toolbox-cmd disk shrink /8.2 网络加速配置
使用NAT模式并开启端口转发:
# 在宿主机执行(Windows示例) netsh interface portproxy add v4tov4 listenport=9418 listenaddress=0.0.0.0 connectport=9418 connectaddress=虚拟机IP8.3 共享文件夹优化
避免直接编译共享文件夹中的代码:
sudo mount -t vboxsf -o rw,uid=1000,gid=1000 aosp /mnt/aosp建议工作流程:
- 在共享文件夹存放源码压缩包
- 解压到虚拟机本地目录编译
- 完成后将产出物复制回共享文件夹
经过这些优化,我的虚拟机编译速度已能达到物理机80%的性能。最后提醒:编译过程中建议关闭杀毒软件实时监控,这能减少约20%的I/O等待时间。