Ubuntu上搭建Android编译环境(1)

外网信号不好,所以把google的原文介绍扒到这里来参考。

https://source.android.com/setup/

Android 源代码

Android 是一个针对多种不同设备类型打造的开放源代码软件堆栈。Android 的主要目的是为运营商、原始设备制造商 (OEM) 和开发者创造一个开放的软件平台,使他们能够将创新理念变为现实,并推出能够卓有成效地改善用户移动体验的真实产品。

此外,我们还希望确保 Android 平台不存在一个集中瓶颈(意即没有任何行业参与者可一手限制或控制其他参与者的创新)。这样,我们不但可以打造功能完善的高品质消费类产品,而且可以完全开放源代码,供第三方自由定制和移植。

Android 框架详情

图 1. Android 堆栈

管理理念

Android 源自于 Google 牵头并联合众多企业成立的“开放手机联盟”(Open Handset Alliance,以下简称 OHA)。如今,许多企业(包括 OHA 的创始成员以及其他企业)都在 Android 上投入了大量资金和人力。这些企业投入了大量工程资源来改进 Android,使用户能够享用搭载 Android 的出色设备。

出于对 Android 本身的认同,这些企业才投入了资金和人力,因为我们都相信有必要打造一个开放的平台。我们的用意是将 Android 打造成一个开放源代码(而非免费软件)平台,显然,Android 也确实做到了这一点;众多志同道合的组织投入了大量的资源,携手打造了一个共用的平台。Android 的首要理念是务实。目标是打造一个每个贡献者都可以调整和定制的共用产品。

不受约束的定制必然会导致不兼容。为了避免这种情况,Android 开源项目还推出了 Android 兼容性计划,该计划制定了有关“Android 兼容性”的规范以及设备制造商实现兼容性需要满足的要求。 任何人都能够(并且会)将 Android 源代码用于任何用途,我们欢迎一切合法的使用。不过,要参与我们正在围绕 Android 构建的共通应用生态系统,设备制造商必须加入 Android 兼容性计划。

作为 Android 开放源代码项目的主导者,Google 负责着 Android 的维护和后续开发工作。虽然 Android 由多个子项目组成,但严格意义上,这只是出于项目管理的需要。我们将 Android 整体视为一个软件产品(而不是可更换部件的“发行版”、规范或集合),并依此原则进行管理。我们希望设备制造商要做的只是将 Android 移植到其设备上,而无需实现一个规范或构建一个“发行版”。

https://source.android.com/setup/build/requirements

要求

下载和编译 Android 源代码之前,请先确保您的系统符合以下要求。然后,请参阅构建编译环境,查看适用于相应操作系统的安装说明。

硬件要求

您的开发工作站必须达到或超出以下硬件要求:

  • 如果是 Android 2.3.x (Gingerbread) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。
  • 如果要检出代码,至少需要 100GB 可用磁盘空间;如果要进行编译,则还需要 150GB。如果要进行多次编译,则需要更多空间。
  • 如果在虚拟机中运行 Linux,则至少需要 16GB 的 RAM/交换空间。

软件要求

Android 开源项目 (AOSP) master 分支历来都是在 Ubuntu Long Term Support (LTS) 版本中进行开发和测试,但您也可以使用其他 Ubuntu 分发版本。要查看建议使用的版本,请参阅下面的列表。

您的工作站必须具有下面列出的软件。要查看所需的其他软件包以及用于安装这些软件包的命令,请参阅构建编译环境

操作系统和 JDK

如果您要针对 AOSP master 分支进行开发,请使用下列操作系统之一:Ubuntu 14.04 (Trusty)/Mac OS v10.10 (Yosemite) 或更高版本(具有 Xcode 4.5.2 和命令行工具)。

对于 Java 开发套件 (JDK),需要注意的是 AOSP 中 Android 的 master 分支带有预编译版本的 OpenJDK;因此无需另行安装。较低的版本则需要单独进行安装。

请参阅较低 Android 版本的软件包

主要软件包

设备二进制文件

下载预览、出厂映像、驱动程序、无线下载 (OTA) 更新和下列其他 Blob。有关详情,请参阅下载专有二进制文件

编译工具链

Android 8.0 及更高版本仅支持使用 Clang/LLVM 来编译 Android 平台。您可以加入 android-llvm 网上论坛来提出问题并获取帮助。在 NDK GitHub 上报告 NDK/编译器问题。

对于原生开发工具包 (NDK) 和旧版内核,您也可以使用 AOSP master 分支中包含的 GCC 4.9(在 prebuilts/ 下)。

较低 Android 版本的软件包

本部分详细介绍了较低 Android 版本的相关操作系统和 JDK 软件包。

操作系统

Android 通常是在 GNU/Linux 或 Mac OS 操作系统中进行编译。您也可以使用虚拟机在不支持的系统(例如 Windows)中编译 Android。

我们建议您在 GNU/Linux(而不是其他操作系统)上进行编译。Android 编译系统通常使用编译设备上运行的 ART 来预编译系统 dex 文件。由于 ART 只能在 Linux 上运行,因此编译系统会在非 Linux 操作系统上跳过这个预编译步骤,从而导致 Android 编译的性能下降。

GNU/Linux

  • Android 6.0 (Marshmallow) - AOSP master:Ubuntu 14.04 (Trusty)
  • Android 2.3.x (Gingerbread) - Android 5.x (Lollipop):Ubuntu 12.04 (Precise)
  • Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu 10.04 (Lucid)

Mac OS (Intel/x86)

  • Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本,具有 Xcode 4.5.2 和命令行工具
  • Android 5.x (Lollipop):Mac OS v10.8 (Mountain Lion),具有 Xcode 4.5.2 和命令行工具
  • Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat):Mac OS v10.6 (Snow Leopard) 或 Mac OS X v10.7 (Lion),以及 Xcode 4.2(Apple 的开发者工具)
  • Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich):Mac OS v10.5 (Leopard) 或 Mac OS X v10.6 (Snow Leopard),以及 Mac OS X v10.5 SDK

JDK

有关较低 Android 版本的预编译路径和安装说明,请参阅安装 JDK

品牌

Android 4.0.x (Ice Cream Sandwich) 及更低版本必须将 make 3.82 还原到较低版本,以避免出现编译错误。

https://source.android.com/setup/build/initializing

搭建编译环境

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

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

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

选择分支

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

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

设置 Linux 编译环境

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

我们会定期在最近推出的一些 Ubuntu LTS (14.04) 和 Debian 测试版本中对 Android 编译系统进行内部测试。其他大多数分发版本都应该具有所需的编译工具。

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

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

安装 JDK

Android 开源项目 (AOSP) 中 Android 的 master 分支在 prebuilts/jdk/ 下有预编译版本的 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. 从 old-releases.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 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 mountAndroid() { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }

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

  • 要在执行 umountAndroid 时卸载磁盘映像,请运行以下命令:
    # unmount the android file image 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

下载源代码

Android 源代码树位于由 Google 托管的 Git 代码库中。Git 代码库中包含 Android 源代码的元数据,其中包括与对源代码进行的更改以及更改日期相关的元数据。本文档介绍了如何下载特定 Android 代码流水线的源代码树。

要从特定设备的出厂映像开始,请参阅选择设备版本

安装 Repo

Repo 是一款工具,可让您在 Android 环境中更轻松地使用 Git。要详细了解 Repo,请参阅 Repo 命令参考资料

要安装 Repo,请执行以下操作:

  1. 确保主目录下有一个 bin/ 目录,并且该目录包含在路径中:

     
    mkdir ~/bin PATH=~/bin:$PATH
  2. 下载 Repo 工具,并确保它可执行:

     
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo

对于 1.21 版,Repo 的 SHA-1 校验和为 b8bd1804f432ecf1bab730949c82b93b0fc5fede

对于 1.22 版,Repo 的 SHA-1 校验和为 da0514e484f74648a890c0467d61ca415379f791

对于 1.23 版,Repo 的 SHA-256 校验和为 e147f0392686c40cfd7d5e6f332c6ee74c4eab4d24e2694b3b0a0c037bf51dc5

初始化 Repo 客户端

安装 Repo 后,设置您的客户端以访问 Android 源代码代码库:

  1. 创建一个空目录来存放您的工作文件。如果您使用的是 MacOS,必须在区分大小写的文件系统中创建该目录。为其指定一个您喜欢的任意名称:

     
    mkdir WORKING_DIRECTORY cd WORKING_DIRECTORY
  2. 使用您的真实姓名和电子邮件地址配置 Git。要使用 Gerrit 代码审核工具,您需要一个与已注册的 Google 帐号关联的电子邮件地址。确保这是您可以接收邮件的有效地址。您在此处提供的姓名将显示在您提交的代码的提供方信息中。

     
    git config --global user.name "Your Name" git config --global user.email "[email protected]"
  3. 运行 repo init 以获取最新版本的 Repo 及其最近的所有错误更正内容。您必须为清单指定一个网址,该网址用于指定 Android 源代码中包含的各个代码库将位于工作目录中的什么位置。

     
    repo init -u https://android.googlesource.com/platform/manifest

    要检出“master”以外的分支,请使用 -b 指定相应分支。要查看分支列表,请参阅源代码标记和编译版本

     
    repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

初始化成功后,系统将显示一条消息,告诉您 Repo 已在工作目录中完成初始化。客户端目录中现在应包含一个 .repo 目录,清单等文件将保存在该目录下。

https://source.android.com/setup/build/downloading

下载 Android 源代码树

要将 Android 源代码树从默认清单中指定的代码库下载到工作目录,请运行以下命令:

repo sync

Android 源代码文件将位于工作目录中对应的项目名称下。初始同步操作将需要 1 个小时或更长时间才能完成。要详细了解 repo sync 和其他 Repo 命令,请参阅开发部分。

使用身份验证

默认情况下,访问 Android 源代码均为匿名操作。为了防止服务器被过度使用,每个 IP 地址都有一个相关联的配额。

当与其他用户共用一个 IP 地址时(例如,在越过 NAT 防火墙访问源代码代码库时),系统甚至会针对常规使用模式(例如,许多用户在短时间内从同一个 IP 地址同步新客户端)触发配额。

在这种情况下,可以使用进行身份验证的访问方式,此类访问方式会对每位用户使用单独的配额,而不考虑 IP 地址。

第一步是使用密码生成器生成密码,然后按照密码生成器页面中的说明进行操作。

第二步是通过使用以下清单 URI,强制使用进行身份验证的访问方式:https://android.googlesource.com/a/platform/manifest。请注意 /a/ 目录前缀如何触发强制性身份验证。您可以通过以下命令将现有客户端转换为使用强制性身份验证:

repo init -u https://android.googlesource.com/a/platform/manifest

排查网络问题

在使用代理的情况下下载内容(在一些企业环境中很常见)时,您可能需要明确指定 Repo 随后使用的代理:

export HTTP_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port> export HTTPS_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>

一种比较少见的情况是,Linux 客户端遇到连接问题,在下载期间(通常是在“正在接收对象”期间)被卡住。有人曾报告称,调整 TCP/IP 堆栈的设置并使用非并行命令可以改善这种情况。您需要拥有 root 权限才能修改 TCP 设置:

sudo sysctl -w net.ipv4.tcp_window_scaling=0 repo sync -j1

使用本地镜像

当您使用多个客户端时(尤其是在带宽不足的情况下),最好为所有服务器内容创建一个本地镜像,并从该镜像同步客户端(不需要访问网络)。一个完整镜像的下载文件比两个客户端的下载文件要小一些,而且包含更多信息。

以下说明假定在 /usr/local/aosp/mirror 中创建镜像。第一步是创建并同步镜像本身。请注意 --mirror 标记,该标记只能在创建新客户端时指定:

mkdir -p /usr/local/aosp/mirror cd /usr/local/aosp/mirror repo init -u https://android.googlesource.com/mirror/manifest --mirror repo sync

同步镜像后,您就可以从镜像创建新客户端了。请注意,务必要指定一个绝对路径:

mkdir -p /usr/local/aosp/master cd /usr/local/aosp/master repo init -u /usr/local/aosp/mirror/platform/manifest.git repo sync

最后,要将客户端与服务器同步,您需要将镜像与服务器同步,然后再将客户端与镜像同步:

cd /usr/local/aosp/mirror repo sync cd /usr/local/aosp/master repo sync

您可以将镜像存储在 LAN 服务器上,然后通过 NFS、SSH 或 Git 访问它。您还可以将其存储在移动存储盘上,并在用户之间或计算机之间传用该存储盘。

验证 Git 标记

将以下公钥加载到您的 GnuPG 密钥数据库中。该密钥用于签署代表各版本的带注释标记。

gpg --import

复制并粘贴以下密钥,然后输入 EOF (Ctrl-D) 以结束输入并处理密钥。

-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.2.2 (GNU/Linux) mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7 8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq /HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5 jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4 MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9 b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI 2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+ OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM= =Wi5D -----END PGP PUBLIC KEY BLOCK-----

导入密钥后,您可以通过以下命令验证任何标记:

git tag -v TAG_NAME

https://source.android.com/setup/build/building

准备编译

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

下载专有二进制文件

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

部分设备会将这些专有二进制文件打包到其 /vendor 分区。

下载专有二进制文件

对于运行带标记的 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 具有额外调试工具的开发配置

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

编译代码

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

您可以使用 make 编译任何代码。GNU make 可以借助 -jN 参数处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核 2 个线程)上,要实现最快的编译速度,可以使用介于 make -j16 到 make -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 采用新的配置重启。

猜你喜欢

转载自blog.csdn.net/tanmx219/article/details/81202619