准备编译

以下关于编译 Android 源代码树的说明适用于所有分支,包括 master。编译命令的基本顺序如下:

下载专有二进制文件

您不能只通过纯源代码来使用 AOSP,还需要运行与硬件相关的其他专有库(例如用于硬件图形加速的专有库)。如需其他资源的下载链接和设备二进制文件,请参阅以下各部分。

下载专有二进制文件

对于运行带标记的 AOSP 版本分支的受支持设备,您可以从 Google 的驱动程序下载相关的官方二进制文件。有了这些二进制文件,您将有权使用采用非开源代码的其他硬件功能。要编译 AOSP 的 master 分支,请使用二进制文件预览。在针对某种设备编译 master 分支时,请使用适用于最新编号版本的二进制文件或具有最新日期的二进制文件。

解压专有二进制文件

每组二进制文件都是压缩包中的一个自解压脚本。解压每个压缩包,从源代码树的根目录运行附带的自解压脚本,然后确认您同意附带的许可协议的条款。二进制文件及其对应的 Makefile 将会安装在源代码树的 vendor/ 层次结构中。

清理

为了确保新安装的二进制文件在解压后会被适当考虑在内,请使用以下命令删除所有以前编译操作的已有输出:

make clobber

设置环境

使用 envsetup.sh 脚本初始化环境。请注意,将 source 替换成 .(一个点)可以省去一些字符,这种简写形式在文档中更为常用。

source build/envsetup.sh

. build/envsetup.sh

选择目标

使用 lunch 选择要编译的目标。确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整编译,并且所有调试功能均处于启用状态。

lunch aosp_arm-eng

如果您没有提供任何参数就运行命令,lunch 将提示您从菜单中选择一个目标。

所有编译目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一:

编译类型 使用情况
user 权限受限;适用于生产环境
userdebug 与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型
eng 具有额外调试工具的开发配置

userdebug 版本应和 user 版本以相同的方式运行,且能够启用通常会破坏平台安全模型的额外调试。这可让 userdebug 版本具有更强大的诊断功能,从而成为进行 user 测试的最佳选择。使用 userdebug 版本进行开发时,您应遵循 userdebug 准则

eng 版本会优先考虑平台负责工程师的工程生产力。eng 版本会关闭用于提供良好用户体验的各种优化。否则,eng 版本的运行方式将类似于 user 和 userdebug 版本,以便设备开发者看到代码在这些环境下的运行方式。

要详细了解如何针对实际硬件进行编译以及如何在实际硬件上运行编译系统,请参阅运行编译系统

编译代码

本部分只是一个摘要,用于确保设置已完成。如需关于编译 Android 的详细说明,请参阅运行编译系统

您可以使用 make 编译任何代码。GNU make 可以借助 -jN 参数处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核 2 个线程)上,要实现最快的编译速度,可以使用介于 make -j16make -j32 之间的命令。

make -j4

开始运行!

您可以在模拟器上运行自己的版本,也可以将其刷到设备上。请注意,因为您之前已使用 lunch 选择编译目标,因此很可能无法在编译目标之外的目标上运行您的编译系统。

使用 fastboot 刷机

要对设备进行刷机,您需要使用 fastboot(编译成功后,它应该会包含在您的路径中)。如需相关说明,请参阅对设备进行刷机

模拟 Android 设备

编译流程会自动将模拟器添加到您的路径中。要运行模拟器,请输入以下命令:

emulator

排查常见编译错误

Java 版本不正确

如果您尝试编译的 Android 版本与您的 Java 版本不一致,make 将会终止并显示诸如以下消息:

************************************************************
You are attempting to build with the incorrect version
of java.

Your version is: WRONG_VERSION.
The correct version is: RIGHT_VERSION.

Please follow the machine setup instructions at
    https://source.android.com/source/initializing.html
************************************************************

以下是可能的原因和解决方案:

  • 未能安装 JDK 要求中指定的正确 JDK。确保您已按照设置环境选择目标中的步骤操作。
  • 之前安装的另一个 JDK 出现在您的路径中。将正确的 JDK 附加到路径开头,或者移除有问题的 JDK。

Python 版本 3

Repo 是基于 Python 2.x 中的特定功能构建的,但遗憾的是与 Python 3 不兼容。要使用 Repo,请安装 Python 2.x:

apt-get install python

不区分大小写的文件系统

在 Mac OS 中的 HFS 文件系统上进行编译时,可能会遇到诸如以下错误:

************************************************************
You are building on a case-insensitive filesystem.
Please move your source tree to a case-sensitive filesystem.
************************************************************

请按照创建区分大小写的磁盘映像中的说明进行操作。

没有 USB 权限

在大多数 Linux 系统中,无特权的用户默认情况下无法使用 USB 端口。如果您看到权限遭拒错误,请按照配置 USB 使用权限中的说明操作。

如果 adb 已在运行,并且在这些规则设置完成后无法连接到设备,您可以使用 adb kill-server 将其终止。这将使 adb 采用新的配置进行重启。