Ubuntu 18.04虚拟机编译Android源码实战指南

📅 2026/7/18 7:13:36 👁️ 阅读次数 📝 编程学习
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 : 剩余空间 ext4

2.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 # 选择python2

3. 源码获取与环境配置

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-server

5.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 -version

6. 编译后操作

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 unlock

7. 高级技巧与优化

7.1 增量编译加速

只编译修改部分:

mmm path/to/module # 编译单个模块 mma # 编译当前目录模块

7.2 CCache配置优化

查看缓存统计:

ccache -s

重置缓存:

ccache -C

7.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=虚拟机IP

8.3 共享文件夹优化

避免直接编译共享文件夹中的代码:

sudo mount -t vboxsf -o rw,uid=1000,gid=1000 aosp /mnt/aosp

建议工作流程:

  1. 在共享文件夹存放源码压缩包
  2. 解压到虚拟机本地目录编译
  3. 完成后将产出物复制回共享文件夹

经过这些优化,我的虚拟机编译速度已能达到物理机80%的性能。最后提醒:编译过程中建议关闭杀毒软件实时监控,这能减少约20%的I/O等待时间。