Ubuntu环境下Android 13源码编译全流程指南

1. 项目概述:Ubuntu环境下Android源码编译全流程

在移动开发领域,掌握Android系统底层原理最直接的方式就是下载和编译官方源码。不同于使用现成的Android Studio开发应用,源码编译能让你深入理解系统架构、定制ROM、调试底层模块,甚至为AOSP贡献代码。Ubuntu作为官方推荐的编译环境,提供了完善的工具链和文件系统支持。

我最近在Ubuntu 22.04 LTS上完整走通了Android 13源码的下载和编译流程,过程中踩了不少坑。本文将分享从环境准备到成功运行模拟器的完整操作指南,包含以下关键环节:

  • 配置区分大小写的文件系统
  • 处理Python多版本兼容问题
  • 使用清华镜像加速源码下载
  • 解决内存不足导致的编译中断
  • 虚拟机特有的性能优化技巧

无论你是想学习系统底层原理、定制Android系统,还是为特定设备开发驱动,这套方法都能提供可靠的基础环境。整个过程需要约200GB磁盘空间和8小时以上的连续编译时间(视硬件配置而定),建议使用性能较强的PC或服务器操作。

2. 环境准备与系统配置

2.1 基础系统要求

Android源码编译对硬件有较高要求,以下是经过实测的最低配置:

  • 磁盘空间:源码下载约80GB,编译后占用150-200GB,建议预留250GB以上
  • 内存:物理内存16GB起步,推荐32GB(我的20GB内存机器在编译过程中因OOM失败过)
  • CPU:四核处理器起步,核心数直接影响编译速度
  • 文件系统:必须使用区分大小写的文件系统(Windows的NTFS不满足要求)

对于大多数开发者,推荐使用VMware或VirtualBox创建Ubuntu虚拟机。我使用的是VMware Workstation 17 Pro + Ubuntu 22.04.3 LTS组合,分配了8核CPU、20GB内存和300GB动态磁盘。

重要提示:虚拟机创建时务必选择"存储为单个文件"而非拆分文件,否则性能会显著下降。同时开启CPU的虚拟化支持(Intel VT-x/AMD-V),这对后续运行模拟器至关重要。

2.2 Ubuntu基础环境配置

安装完Ubuntu后,首先执行系统更新:

sudo apt update && sudo apt upgrade -y

然后安装必要工具链:

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 lib32z1-dev \ libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python3-psutil

2.3 Python环境配置

Android源码编译对Python版本有特定要求:

  • AOSP 12+:仅需Python 3
  • AOSP 11及以下:需要Python 2.7

Ubuntu 22.04默认已安装Python 3.10,我们需要配置符号链接:

sudo ln -s /usr/bin/python3 /usr/bin/python

验证配置:

python --version # 应显示Python 3.x

如果确实需要Python 2.7(如编译旧版Android):

sudo apt install python2-minimal sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 2

切换版本命令:

sudo update-alternatives --config python

3. 源码下载与仓库管理

3.1 安装Repo工具

Repo是Google开发的用于管理多个Git仓库的工具,安装步骤如下:

mkdir ~/bin PATH=~/bin:$PATH curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo chmod a+x ~/bin/repo

设置Repo镜像源加速下载:

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

3.2 源码下载策略

官方推荐的方式是直接通过repo sync同步,但在国内网络环境下极其缓慢。清华大学提供了每月更新的初始化包,可以节省大量时间:

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar tar xf aosp-latest.tar cd aosp

初始化指定分支(以Android 13为例):

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r43

同步最新代码:

repo sync -c -j4 --no-tags

参数说明:

  • -c:只下载当前分支代码
  • -j4:使用4个并行线程(根据网络情况调整)
  • --no-tags:不下载标签节省空间

3.3 源码目录结构解析

同步完成后,主要目录结构如下:

aosp/ ├── art/ # Android Runtime ├── bionic/ # C库实现 ├── bootable/ # 启动加载相关 ├── build/ # 编译系统核心 ├── cts/ # 兼容性测试套件 ├── dalvik/ # Dalvik虚拟机 ├── developers/ # 开发者示例 ├── development/ # 开发工具 ├── device/ # 设备特定代码 ├── frameworks/ # 系统框架 ├── hardware/ # 硬件抽象层 ├── kernel/ # Linux内核 ├── libcore/ # 核心库 ├── packages/ # 系统应用 └── system/ # 底层系统服务

4. 编译配置与优化

4.1 编译环境初始化

在源码根目录执行:

source build/envsetup.sh lunch

lunch命令会列出所有可用编译目标,常见选项包括:

  • aosp_arm-eng:ARM架构模拟器镜像(带root权限)
  • aosp_x86_64-userdebug:x86_64架构测试镜像
  • sdk_car_x86_64-userdebug:车载系统镜像

我选择aosp_x86_64-userdebug进行开发测试:

lunch aosp_x86_64-userdebug

4.2 解决内存不足问题

编译Android需要大量内存,如果物理内存不足,可以通过增加交换空间解决:

查看当前交换空间:

free -h

创建16GB交换文件:

sudo fallocate -l 16G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

永久生效(重启后保留):

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

4.3 开始编译

使用make命令启动编译,-j参数指定并行任务数(推荐CPU核心数×2):

make -j16

编译过程可能持续数小时,期间可以:

  • 使用ccache加速后续编译(首次编译不生效)
  • 通过htop监控系统资源使用情况
  • 定期检查out/target/product/[产品名]目录查看生成的文件

4.4 常见编译错误处理

问题1:ninja失败退出状态137

02:13:41 ninja failed with: exit status 137

这通常是内存不足导致,解决方案:

  1. 增加交换空间(如前文所述)
  2. 减少并行任务数:make -j8
  3. 关闭其他占用内存的程序

问题2:Java堆空间不足build/core/main.mk中添加:

export JAVA_TOOL_OPTIONS="-Xmx8g"

问题3:头文件缺失安装对应开发包:

sudo apt install libssl-dev libffi-dev

5. 运行与调试

5.1 启动模拟器

编译完成后,直接运行:

emulator

如果遇到KVM错误,需要:

  1. 检查BIOS中虚拟化支持已开启
  2. 安装KVM:
sudo apt install qemu-kvm sudo adduser $USER kvm

5.2 刷机到真机

准备设备:

  1. 解锁Bootloader(各厂商方法不同)
  2. 启用USB调试
  3. 连接电脑

刷入镜像:

adb reboot bootloader fastboot flashall -w

5.3 常用调试命令

查看系统日志:

adb logcat

进入shell:

adb shell

推送文件到设备:

adb push local_file /sdcard/

6. 高级技巧与优化

6.1 使用ccache加速编译

安装配置ccache:

sudo apt install ccache export USE_CCACHE=1 export CCACHE_DIR=/path/to/ccache ccache -M 50G # 设置缓存大小

build/core/ccache.mk中验证:

ifneq ($(CCACHE),) $(info Using ccache: $(CCACHE)) endif

6.2 模块化编译

单独编译某个模块(如Settings):

make Settings

快速重启系统服务:

adb root adb shell stop adb shell start

6.3 增量更新

同步最新代码后:

repo sync make -j16

如果出现冲突,可以尝试:

repo forall -c 'git reset --hard' repo sync

7. 虚拟机专属优化方案

7.1 性能调优

  1. CPU分配:给虚拟机分配比物理核心少1-2个的CPU,避免主机卡死
  2. 内存管理:预留至少2GB内存给主机系统
  3. 磁盘性能
    sudo vmware-toolbox-cmd disk shrink / sudo fstrim -av

7.2 解决VT-x不可用问题

在Windows主机上:

  1. 关闭Hyper-V:
    bcdedit /set hypervisorlaunchtype off
  2. 禁用内核隔离:Windows安全中心 → 设备安全性 → 内核隔离
  3. 重启计算机

7.3 共享文件夹设置

避免直接在共享文件夹中编译,应先复制到虚拟机内部磁盘:

vmhgfs-fuse .host:/share /mnt/hgfs -o allow_other cp -r /mnt/hgfs/aosp ~/

8. 实用资源与参考

  • 官方文档: source.android.com
  • 镜像站
    • 清华大学: mirrors.tuna.tsinghua.edu.cn/help/AOSP/
    • 中科大: mirrors.ustc.edu.cn/help/aosp.html
  • 设备支持: developers.google.cn/android/drivers
  • 社区支持
    • XDA Developers论坛
    • LineOS官方Wiki

我在实际编译过程中发现,使用物理机直接安装Ubuntu比虚拟机性能提升约40%,但虚拟机提供了更好的环境隔离。对于长期从事系统开发的工程师,建议配置一台专用的编译服务器,配备大内存(64GB+)和高速SSD(1TB+)。