1. 项目概述
在Ubuntu 16.04系统上编译Android源码是一个典型的开发环境搭建任务,对于Android系统开发者、ROM定制者和底层功能研究者来说都是必备技能。我曾在多个Android版本(从4.4到11.0)的编译过程中使用Ubuntu 16.04作为基础环境,这个LTS版本因其稳定性被广泛采用,特别适合长期开发项目。
编译Android源码不同于普通应用开发,它需要处理庞大的代码库(最新AOSP代码超过150GB)、复杂的依赖关系以及严格的环境要求。整个过程涉及源码获取、环境配置、编译参数调优和镜像生成等多个环节,任何一个步骤出错都可能导致编译失败。本文将基于实际项目经验,详细介绍在Ubuntu 16.04上完成Android源码编译的全流程。
2. 环境准备与基础配置
2.1 硬件要求与系统准备
Android源码编译对硬件有较高要求,建议配置:
- 至少16GB内存(8GB勉强可用但编译速度极慢)
- 200GB以上可用磁盘空间(SSD能显著提升速度)
- 多核CPU(建议4核以上)
Ubuntu 16.04安装时需选择"最小安装"模式,避免不必要的软件占用资源。安装完成后首先执行系统更新:
sudo apt update && sudo apt upgrade -y
注意:必须使用64位系统,Android从5.0开始不再支持32位环境编译
2.2 依赖包安装
Android官方文档列出的基础依赖包可能不完整,经过多次实践验证,以下是必须安装的完整依赖列表:
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 \
libgl1-mesa-dev libxml2-utils xsltproc unzip python openjdk-8-jdk
特别提醒:
- Java版本必须使用OpenJDK 8(Android 7.0-9.0适用)
- 如果编译Android 10+,需要额外安装libncurses5
- 对于较新的Ubuntu版本,可能需要添加旧版本库才能安装某些依赖
2.3 关键工具配置
2.3.1 Repo工具安装
Repo是Google开发的用于管理多个Git仓库的工具,安装步骤如下:
mkdir ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
将repo添加到PATH环境变量:
echo 'export PATH=~/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
2.3.2 Git身份配置
虽然非必须,但正确的Git配置能避免后续问题:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
3. 源码获取与管理
3.1 初始化Repo仓库
首先创建工作目录并初始化repo:
mkdir ~/aosp && cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest
如果需要特定Android版本,使用-b参数指定分支:
repo init -u https://android.googlesource.com/platform/manifest -b android-11.0.0_r38
3.2 同步源码
同步全部源码(耗时很长,建议使用稳定的网络连接):
repo sync -j4
实用技巧:
- 使用-j参数指定并行任务数(通常为CPU核心数的2倍)
- 如果同步中断,可以重复执行repo sync命令继续
- 夜间同步速度可能更快
3.3 源码目录结构解析
同步完成后,主要目录结构如下:
-
bionic/- C库实现 -
frameworks/- 核心框架代码 -
packages/- 系统应用 -
system/- 底层系统组件 -
hardware/- 硬件抽象层 -
out/- 编译输出目录
4. 编译配置与执行
4.1 环境初始化
执行envsetup.sh脚本初始化环境:
source build/envsetup.sh
4.2 选择构建目标
使用lunch命令选择构建目标:
lunch
典型选项:
- aosp_arm-eng - 模拟器用ARM镜像(带调试功能)
- aosp_x86_64-eng - 模拟器用x86_64镜像
- 设备专用目标(如Pixel设备的aosp_marlin-userdebug)
4.3 开始编译
使用m命令启动编译(make的封装):
m -j8
参数说明:
- -j指定并行任务数(建议CPU核心数×2)
- 首次编译可能需要3-6小时,取决于硬件性能
4.4 常见编译问题解决
-
内存不足 : 在~/.bashrc中添加:
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" -
Java版本冲突 : 确保只安装OpenJDK 8:
sudo update-alternatives --config java -
依赖缺失 : 根据错误提示安装缺失的包,常见的有:
sudo apt install libssl-dev libswitch-perl
5. 编译输出与验证
5.1 输出镜像文件
编译成功后,输出文件位于out/target/product/[设备名]/目录,主要包含:
- system.img - 系统镜像
- ramdisk.img - 启动镜像
- userdata.img - 用户数据分区
- boot.img - 内核镜像
5.2 刷机测试
对于模拟器:
emulator -avd [AVD名称] -system system.img -ramdisk ramdisk.img
对于真实设备(需解锁bootloader):
fastboot flash system system.img
fastboot flash boot boot.img
fastboot reboot
5.3 增量编译技巧
修改代码后只需重新执行:
m -j8
如需完全清理:
m clean
6. 高级技巧与优化
6.1 使用ccache加速编译
在~/.bashrc中添加:
export USE_CCACHE=1
export CCACHE_DIR=/path/to/ccache
prebuilts/misc/linux-x86/ccache/ccache -M 50G
6.2 选择性编译模块
只编译特定模块(如Settings应用):
mmm packages/apps/Settings/
6.3 自定义系统组件
修改系统组件的一般流程:
- 找到对应模块代码(如frameworks/base)
- 修改后执行mm编译当前模块
- 生成新的system.img并刷机
7. 常见问题与解决方案
7.1 编译卡在某个百分比
可能原因:
- 内存不足 - 增加swap空间或减少-j参数值
- 依赖冲突 - 检查错误日志,安装缺失依赖
7.2 刷机后无法启动
排查步骤:
- 检查设备是否支持编译的Android版本
- 确认刷入了所有必要镜像(boot/system/vendor等)
- 通过adb logcat查看启动日志
7.3 源码同步失败
解决方法:
- 检查网络连接
- 删除.repo/repo目录后重试
- 使用国内镜像源(如清华源)
8. 维护与更新
8.1 更新源码
repo sync -j4
8.2 切换分支
repo init -b android-12.0.0_r1
repo sync -j4
8.3 保留已有编译结果
make installclean
经过多次实践验证,在Ubuntu 16.04上编译Android源码最关键的几个点:确保Java版本正确、内存充足、依赖完整。我曾遇到一个棘手问题是由于同时安装了多个Java版本导致编译失败,最终通过彻底移除其他Java版本解决。建议在开始前先制作系统快照,方便出现问题后快速回滚。

3019

被折叠的 条评论
为什么被折叠?



