搭建构建环境

在本地工作环境来构建 Android 源文件必须使用 Linux;不支持在 MacOS 或 Windows 上进行构建。也请注意对 /usr/bin/python 二进制文件的重要更改。

选择构建分支

Android 开发版本按照英文字母的顺序,采用美味甜点的名字为代号,划分为不同的系列。本页面提供了有关平台代号、版本、API 级别和 NDK 版本的信息,并阐释了与它们相关的 build ID 定义。

如要手动构建内核,您可能需要设备代号以及内核源代码和二进制文件。我们在各种用例的代号参考和资源部分对这些内容进行了总结,并提供了一些链接,以便您针对以下主题找到所需的信息:

  • 启动进入 flashboot 模式需要设备组合键和对应的 Android 设备代号。
  • 必须手动构建的内核需要设备代号和用于获取内核源代码和二进制文件的对应位置。
  • 如果 build 使用多个 Git 代码库中的源代码,则需要设备代号匹配项,以获取正确的源目录设置来下载源代码和构建工具。

平台代号、版本、API 级别和 NDK 版本

代号 版本 API 级别/NDK 版本
Android13 13 API 级别 33
Android12L 12 API 级别 32
Android12 12 API 级别 31
Android11 11 API 级别 30
Android10 10 API 级别 29
Pie 9 API 级别 28
Oreo 8.1.0 API 级别 27
Oreo 8.0.0 API 级别 26
Nougat 7.1 API 级别 25
Nougat 7.0 API 级别 24
Marshmallow 6.0 API 级别 23
Lollipop 5.1 API 级别 22
Lollipop 5.0 API 级别 21
KitKat 4.4 - 4.4.4 API 级别 19
Jelly Bean 4.3.x API 级别 18
Jelly Bean 4.2.x API 级别 17
Jelly Bean 4.1.x API 级别 16
Ice Cream Sandwich 4.0.3 - 4.0.4 API 级别 15,NDK 8
Ice Cream Sandwich 4.0.1 - 4.0.2 API 级别 14,NDK 7
Honeycomb 3.2.x API 级别 13
Honeycomb 3.1 API 级别 12,NDK 6
Honeycomb 3.0 API 级别 11
Gingerbread 2.3.3 - 2.3.7 API 级别 10
Gingerbread 2.3 - 2.3.2 API 级别 9,NDK 5
Froyo 2.2.x API 级别 8,NDK 4
Eclair 2.1 API 级别 7,NDK 3
Eclair 2.0.1 API 级别 6
Eclair 2.0 API 级别 5
Donut 1.6 API 级别 4,NDK 2
Cupcake 1.5 API 级别 3,NDK 1
(无代号) 1.1 API 级别 2
(无代号) 1.0 API 级别 1

build ID 定义

在 Android 8.0.0 (Oreo) 及更高版本中,每个 build 均采用 build ID 格式 PVBB.YYMMDD.bbb[.Cn] 进行标识,其中:

  • P 表示平台版本代号的第一个字母,例如 O 表示 Oreo。
  • V 表示支持的类别。按照惯例,P 表示主要平台分支。
  • BB 是由字母和数字组成的代码,Google 可通过该代码识别 build 所属的确切代码分支。
  • YYMMDD 表示相应版本从开发分支细分出来或与开发分支同步的日期。它并不一定是 build 的确切构建日期,因为 Google 常常会在现有 build 中增加细微的更改,并在新 build 中重复使用与现有 build 相同的日期代码。
  • bbb 表示具有相同日期代码的不同版本,从 001 开始。
  • Cn 是可选的字母数字,表示在现有 PVBB.YYMMDD.bbb build 之上构建的修补程序,从 A1 开始。

早期 Android 版本采用另一种较短的 build ID 代码(例如 FRF85B),其中:

  • 第一个字母代表版本系列的代号,例如 F 表示 Froyo。
  • 第二个字母是分支代码,Google 用它来表示 build 所属的确切代码分支。按照惯例,R 表示主要版本分支。
  • 第三个字母和后面的两个数字是日期代码。字母表示季度(A 表示 2009 年第 1 季度,F 表示 2010 年第 2 季度,以此类推)。两个数字表示相应季度内的第几天(F85 表示 2010 年 6 月 24 日)。日期代码并不一定是 build 的确切构建日期,因为 Google 常常会在现有 build 中增加细微的更改,并在新 build 中重复使用与现有 build 相同的日期代码。
  • 末尾字母表示具有相同日期代码的不同版本,从 A 开始(A 并不会显示,通常会为了简洁而省略)。

设置 Linux 构建环境

硬件及系统要求

硬件

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

系统

安装所需的软件包 (Ubuntu 18.04)
您需要 64 位版本的 Ubuntu。

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

安装所需的软件包 (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 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip

使用单独的输出目录
默认情况下,每次构建的输出都会存储在相应源代码树的 out/ 子目录下。您可以通过导出 OUT_DIR 环境变量来替换此设置。例如:

export OUT_DIR=out_mytarget
这会使构建输出存储在源代码树的 out_mytarget/ 子目录中。使用相同的源代码树为多个目标进行构建时,建议为每个目标使用单独的 OUT_DIR

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

如需进行这项设置,请导出 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 分支)支持这种做法。

配置下载代码

JDK【OpenJDK】

AOSP 中的 Android master 分支带有预构建版本的 OpenJDK;因此无需另行安装。

旧版 Android 需要单独安装 JDK。在 Ubuntu 上,请使用 OpenJDK。

前期准备

如需使用 Android 代码,您需要使用 Git(一种开源版本控制系统)和 Repo(一种对 Git 构成补充的 Google 代码库管理工具)

https://source.android.com/docs/setup/download/downloading?hl=zh-cn
https://source.android.com/docs/setup/build?hl=zh-cn
https://juejin.cn/post/7042921660336308231
https://zhuanlan.zhihu.com/p/574856795
https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/