搭建编译环境

本部分介绍了如何设置本地工作环境来编译 Android 源文件。您需要使用 Linux 或 Mac OS。目前不支持在 Windows 环境下进行编译。

要简要了解整个代码审核和代码更新流程,请参阅补丁程序的生命周期

注意:本网站中所有命令的前面都带有美元符号 ($),以便与文件中的输出或条目区分开来。您可以使用每个命令框右上角的“点击复制”功能来复制所有行(不包括美元符号),也可以三击每个行来分别复制各行(不包括美元符号)。

选择分支

针对编译环境的某些要求是由您打算编译的源代码的版本决定的。要查看您可以选择的分支的完整列表,请参阅版本号。您还可以选择下载并编译最新的源代码(称为 master)。如果您选择这么做,请在初始化存储库时直接忽略分支规范。

选择分支后,请按照下面的相应说明来设置编译环境。

设置 Linux 编译环境

以下说明适用于所有分支(包括 master)。

我们会定期在最近推出的一些 Ubuntu LTS (14.04) 版本中对 Android 编译过程进行内部测试,但大多数 Ubuntu 分发版本都应该有所需的编译工具。欢迎向我们报告在其他分发版本中的测试结果(无论结果是成功还是失败)。

如果是 Gingerbread (2.3.x) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。

注意:要查看完整的硬件和软件要求列表,请参阅要求。然后,请按照下方适用于 Ubuntu 和 Mac OS 的详细说明进行操作。

安装 JDK

Android 开放源代码项目 (AOSP) 中 Android 的 master 分支在 platform/prebuilts/jdk/jdk8 中有预编译版本的 OpenJDK。因此,无需再额外安装。

较低版本的 Android 需要另行安装 JDK。在 Ubuntu 上,请使用 OpenJDK。要了解确切版本,请参阅 JDK 要求;要了解相关说明,请参阅以下各个部分。

如果 Ubuntu >= 15.04

请运行以下命令:

sudo apt-get update
sudo apt-get install openjdk-8-jdk

如果是 Ubuntu LTS 14.04

目前没有适用于 Ubuntu 14.04 的受支持 OpenJDK 8 程序包。Ubuntu 15.04 OpenJDK 8 程序包能够在 Ubuntu 14.04 中成功使用。我们发现,按照以下说明操作时,更高的程序包版本(例如适合 15.10、16.04 的版本)在 Ubuntu 14.04 中无法正常工作。

  1. archive.ubuntu.com 下载适用于 64 位架构的 .deb 软件包:

  2. (可选)对照随以上每个程序包列出的 SHA256 字符串,确认已下载文件的校验和。

    例如,使用 sha256sum 工具:

    sha256sum {downloaded.deb file}
    
  3. 安装程序包:

    sudo apt-get update
    

    为下载的每个 .deb 文件运行 dpkg。运行过程中可能会因缺少依赖项而出现错误:

    sudo dpkg -i {downloaded.deb file}
    

    解决缺少依赖项的问题:

    sudo apt-get -f install
    

更新默认的 Java 版本 - 可选

(可选)对于以上 Ubuntu 版本,您可以通过运行以下命令来更新默认的 Java 版本:

sudo update-alternatives --config java
sudo update-alternatives --config javac

在编译过程中,如果您遇到 Java 版本错误,请按照错误的 Java 版本部分中的说明设置其路径。

安装所需的程序包 (Ubuntu 14.04)

您将需要 64 位版本的 Ubuntu。建议您使用 Ubuntu 14.04。

sudo apt-get install 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 ccache libgl1-mesa-dev libxml2-utils xsltproc unzip

注意:要使用 SELinux 工具进行政策分析,还需要安装 python-networkx 软件包。

注意:如果您使用 LDAP 并且希望运行 ART 主机测试,还需要安装 libnss-sss:i386 软件包。

安装所需的程序包 (Ubuntu 12.04)

您可以使用 Ubuntu 12.04 来编译较低版本的 Android。master 或最近推出的一些版本不支持 Ubuntu 12.04。

sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

安装所需的程序包 (Ubuntu 10.04 - 11.10)

不再支持在 Ubuntu 10.04-11.10 中进行编译,但它们仍可用来编译较低版本的 AOSP。

sudo apt-get install git gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc

在 Ubuntu 10.10 中,请运行以下命令:

sudo ln -s /usr/lib32/mesa/libGL.so.1 /usr/lib32/mesa/libGL.so

在 Ubuntu 11.10 中,请运行以下命令:

sudo apt-get install libx11-dev:i386

配置 USB 使用权限

按照说明设置用于开发的设备,以安装适用于所有 Android 设备且由社区维护的默认 udev 规则集。

使用单独的输出目录

默认情况下,每次编译的输出都会存储在相应源代码树的 out/ 子目录下。

在一些拥有多个存储设备的计算机上,如果将源文件和输出存储在单独的存储卷中,编译速度会更快。若要进一步提高编译速度,可以将输出存储在已针对速度(而非崩溃稳定性)进行优化的文件系统中,这是因为在文件系统损坏时可以重新生成所有文件。

要进行这项设置,请导出 OUT_DIR_COMMON_BASE 变量,使其指向将存储输出目录的位置。

export OUT_DIR_COMMON_BASE=<path-to-your-out-directory>

对于每个单独的源代码树,其输出目录都将以其存放目录命名。

例如,如果您有源代码树 /source/master1/source/master2,并且 OUT_DIR_COMMON_BASE 设为了 /output,那么输出目录将为 /output/master1/output/master2

在这种情况下,切勿将多个源代码树存储在具有相同名称的目录下,否则会导致输出目录共享终止,并且会出现不可预知的结果。

只有 Jelly Bean (4.1) 及更高版本(包括 master 分支)支持这种做法。

设置 Mac OS 编译环境

在默认安装过程中,Mac OS 会在一个保留大小写但不区分大小写的文件系统中运行。Git 并不支持此类文件系统,而且此类文件系统会导致某些 Git 命令(例如 git status)的行为出现异常。因此,我们建议您始终在区分大小写的文件系统中对 AOSP 源文件进行操作。使用下文中介绍的磁盘映像可以非常轻松地做到这一点。

有了适当的文件系统,在新型 Mac OS 环境中编译 master 分支就会变得非常简单。要编译较低版本的分支,则需要一些额外的工具和 SDK。

创建区分大小写的磁盘映像

您可以使用磁盘映像在现有的 Mac OS 环境中创建区分大小写的文件系统。要创建磁盘映像,请启动磁盘工具,然后选择“新建映像”。完成编译至少需要 25GB 空间;更大的空间能够更好地满足未来的需求。使用稀疏映像有助于节省空间,而且以后可以随着需求的增加进行扩展。请务必选择“Case sensitive, Journaled”存储卷格式。

您也可以通过 shell 使用以下命令创建磁盘映像:

# hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg

这将创建一个 .dmg(也可能是 .dmg.sparseimage)文件,该文件在装载后可用作具有 Android 开发所需格式的存储卷。

如果您以后需要更大的存储卷,还可以使用以下命令来调整稀疏映像的大小:

# hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage

对于存储在主目录下的名为 android.dmg 的磁盘映像,您可以向 ~/.bash_profile 中添加辅助函数:

  • 要在执行 mountAndroid 时装载磁盘映像,请运行以下命令:
    # mount the android file image
    function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }
    

    注意:如果系统创建的是 .dmg.sparseimage 文件,请将 ~/android.dmg 替换成 ~/android.dmg.sparseimage

  • 要在执行 umountAndroid 时卸载磁盘映像,请运行以下命令:

    # unmount the android file image
    function umountAndroid() { hdiutil detach /Volumes/android; }
    

装载 android 存储卷后,您将在其中开展所有工作。您可以像对待外接式存储盘一样将其弹出(卸载)。

安装 JDK

要查看在开发各种 Android 版本时要使用的 Java 版本,请参阅相关要求

安装所需的程序包

  1. 使用以下命令安装 Xcode 命令行工具:

    xcode-select --install
    

    对于较低版本的 Mac OS(10.8 或更低版本),您需要通过 Apple 开发者网站安装 Xcode。如果您尚未注册成为 Apple 开发者,则需要创建一个 Apple ID 才能下载。

  2. 通过 macports.org 安装 MacPorts。

    注意:请确保在路径中 /opt/local/bin 显示在 /usr/bin 之前。否则,请将以下内容添加到 ~/.bash_profile 文件中:

    export PATH=/opt/local/bin:$PATH
    

    注意:如果主目录中没有 .bash_profile 文件,请创建一个。

  3. 通过 MacPorts 获取 Make、Git 和 GPG 程序包:

    POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
    

    如果您使用 Mac OS X v10.4,还需要安装 bison:

    POSIXLY_CORRECT=1 sudo port install bison
    

将 make 3.82 还原到较低版本

在 Android 4.0.x (Ice Cream Sandwich) 及更低版本中,gmake 3.82 中存在一个会导致 Android 无法编译的错误。您可以按照以下步骤使用 MacPorts 来安装 3.81 版:

  1. 修改 /opt/local/etc/macports/sources.conf,在 rsync 行上方添加下面这行内容:

    file:///Users/Shared/dports
    

    然后创建该目录:

    mkdir /Users/Shared/dports
    
  2. 在新的 dports 目录下,运行以下命令:

    svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/
    
  3. 为新的本地存储库创建一个端口索引:

    portindex /Users/Shared/dports
    
  4. 使用以下命令安装旧版 gmake:

    sudo port install gmake @3.81
    

设置文件描述符数量上限

在 Mac OS 中,可同时打开的文件描述符的默认数量上限太低,在高度并行的编译流程中,可能会超出此上限。

要提高此上限,请将下列行添加到 ~/.bash_profile 中:

# set the number of open files to be 1024
ulimit -S -n 1024

优化编译环境(可选)

设置 ccache

您可以视需要指示编译过程使用 ccache 编译工具,ccache 是适用于 C 和 C++ 的编译器缓存,有助于提高编译速度。这对于编译服务器和其他高容量生产环境来说尤其有用。ccache 可用作用于加快重新编译速度的编译器缓存。如果您经常使用 make clean,或者经常在不同的编译产品之间切换,则非常适合使用 ccache。

注意:如果您是在执行增量编译(例如个人开发者而非编译服务器),ccache 可能会让您为缓存未命中埋单,从而减慢您的编译速度。

要使用 ccache,请在源代码树的根目录下执行以下命令:

export USE_CCACHE=1
export CCACHE_DIR=/<path_of_your_choice>/.ccache
prebuilts/misc/linux-x86/ccache/ccache -M 50G

建议的缓存大小为 50G 到 100G。

请将以下内容添加到 .bashrc(或等同文件)中:

export USE_CCACHE=1

默认情况下,缓存将存储在 ~/.ccache 下。如果主目录位于 NFS 或一些其他的非本地文件系统中,您还需要在 .bashrc 文件中指定目录。

在 Mac OS 中,您应将 linux-x86 替换成 darwin-x86

prebuilts/misc/darwin-x86/ccache/ccache -M 50G

在编译 Ice Cream Sandwich (4.0.x) 或更低版本时,ccache 位于其他位置:

prebuilt/linux-x86/ccache/ccache -M 50G

该设置会存储在 CCACHE_DIR 中,并且为永久设置。

在 Linux 中,您可以运行以下命令来观看使用 ccache 时的情况:

watch -n1 -d prebuilts/misc/linux-x86/ccache/ccache -s

下一篇:下载源代码

编译环境已准备就绪!接下来您就可以下载源代码了。