Android系统源代码编译—[1]搭建一个构建环境

时间:2021-02-14 20:05:14

本文描述了如何设置你的本地工作环境来构建Android源代码文件。你将会需要使用Linux或Mac OS(本文只包含Linux)。目前不支持Window环境。

选择一个分支

环境构建的要求是由你计划要编译的源代码版本决定的。看下 Build Numbers来决定你要选择哪个版本。你也可以选择下载和构建最新的源代码(called master),在这种情况下当你初始化repository时,将会简单的省略分支描述。

一旦你选择了一个分支,按照以下适当的说明来设置你的构建环境。

设置Linux构建环境

这些说明适用于所有分支,包括master。

Android内部通常基于最近的Ununtu LTS(14.04)版本进行构建测试,但大多数发行版本需要有对应的构建工具。

对于Gingerbread(2.3.x)和更新的版本,包括master分支,都需要一个64-bit环境。老版本可以在32-bit系统上编译。

Note: 需要看下要求来了解硬件和软件环境要求清单。然后按照下面Ubuntu和Mac OS的详细说明设置。

初始化JDK

Android open Source Project(AOSP)里的Andorid master 分支要求使用Java 8.在Ubuntu上,使用OpenJDK。

老版本请看JDK Requirements

Ubuntu >= 15.04

运行下面指令:

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

Ununtu LTS 14.04

Ubuntu 14.04没有可用的OpenJDK包。Ubuntu 15.04 OpenJDK 8包已经被成功的运用在Ubuntu 14.04中。更新的包版本(e.g. 15.10 、16.04)不能在14.04上正常工作,可以使用下面说明:

  1. archive.ubuntu.com上下载用于64-bit体系结构的.deb包:

  2. 可选的步骤。确认系在文件的校验和,并对比上面下载链接下面的SHA256.
    例如,使用sha256sum工具:

$ sha256sum {downloaded.deb file}
  1. 初始化包:
$ 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版本错误,你可以按照Wrong Java Version小节描述的那样来设置它的路径。

初始化需要的包(Ubuntu 14.04)

你需要一个64-bit版本的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

Note: 为了使用SELinux工具来进行策略分析,同样也需要初始化python-networkx包。

初始化需要的包(Ubuntu 12.04)

你也许需要使用Ubutntu 12.04来构建老版本的Android。Master和最近的release分支都不支持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.4-11.10版本已经不再支持,但在更老的AOSP release版本上可能会被使用。

$ 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权限

在GNU/Linux(特别是Ubuntu系统上),普通用户默认是无法访问USB设备的。系统需要配置后才能访问。

推荐的方法是创建/etc/udev/rules.d/51-android.rules文件(作为root用户)。

为了这样做,运行下面的命令来下载网站上的51-android.rules文件,修改它来包含你的username,并把它放到正确的位置:

$ wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules

这些新规则在下次设备插入时生效。因此可能需要拔掉设备并重新插回到电脑。

使用单独的输出文件夹

默认情况下,每个构建的输出目录都存储在匹配的源代码树的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分支