编译准备工作

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

注意:如果您要编译 Android 6.0 或更高版本,请参阅使用 Jack 编译,了解这种新的默认工具链。

下载专有二进制文件

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

下载专有二进制文件

对于运行带标记的 AOSP 版本分支的受支持设备,您可以从 Google 的 Nexus 驱动程序页面下载相关的官方二进制文件。有了这些二进制文件,您将有权使用采用非开放源代码的其他硬件功能。要编译 AOSP 的 master 分支,请使用 Nexus 设备的二进制文件预览。在针对某种设备编译 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 具有额外调试工具的开发配置

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

编译代码

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

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

$ make -j4

开始运行!

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

注意:请记得下载专有二进制文件,否则您的版本将无法在目标硬件上成功启动。如果您在此时下载二进制 Blob,则需要将其解压、make clobber 并重新编译。

使用 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 采用新的配置重启。