跳转至

编译配方

在了解了编译系统的架构和工作原理之后,接下来看一些最常用的,以及一些不太常见的编译配方。我们只会简要介绍每种配方的使用结果,但足以让你入门。

默认 droid 构建

前面我们用过不少简单的 make 命令,但还没有真正解释过默认目标。当你运行 make 时,实际上等同于输入了:

$ make droid

droidmain.mk 中定义的默认目标,通常不需要手动指定。这里列出它只是为了完整性。

查看编译命令

构建 AOSP 时,你可能注意到它实际上不会显示正在运行的具体命令,只输出每个步骤的摘要。如果想看它执行的全部操作(比如 gcc 的完整命令行),可以在命令行中加入 showcommands 目标:

$ make showcommands
...
host Java: apicheck (out/host/common/obj/JAVA_LIBRARIES/apicheck_intermediates/classes)
for f in ; do if [ ! -f $f ]; then echo Missing file $f; exit 1; fi; unzip -qo $f -d ...; done
javac -J-Xmx512M -target 1.5 ... -d out/host/common/obj/JAVA_LIBRARIES/apicheck_intermediates/classes ...
jar -cfm out/host/common/obj/JAVA_LIBRARIES/apicheck_intermediates/javalib.jar ...
Header: out/host/linux-x86/obj/include/libexpat/expat.h
cp -f external/expat/lib/expat.h out/host/linux-x86/obj/include/libexpat/expat.h
...

如上一节所说明的,这等同于:

$ make droid showcommands

使用 showcommands 时你很快会发现它会产生大量输出,难以跟踪。如果你想分析实际使用的编译命令,可以将标准输出和标准错误保存到文件:

$ make showcommands > aosp-build-stdout 2> aosp-build-stderr

也可以将所有输出合并到一个文件:

$ make showcommands 2>&1 | tee build.log

还有人喜欢用 nohup

$ nohup make showcommands &

为 Linux 和 Mac OS 构建 SDK

官方 Android SDK 可从 http://developer.android.com 获取。但如果你扩展了核心 API 并希望向开发者分发新 SDK,也可以用 AOSP 自己构建:

$ . build/envsetup.sh
$ lunch sdk-eng
$ make sdk

构建完成后,SDK 位于 out/host/linux-x86/sdk/(Linux)或 out/host/darwin-x86/sdk/(Mac)。会有两份输出:一份是 ZIP 文件(与 http://developer.android.com 分发的类似),另一份是解压后可直接使用的版本。

假设你已按 http://developer.android.com 的说明配置好了 Eclipse 的 Android 开发环境,使用自建 SDK 还需要额外两步。首先,告诉 Eclipse 新 SDK 的位置:Window → Preferences → Android,在 SDK Location 框中输入新 SDK 路径,点击 OK。此外,还需要打开 Window → Android SDK Manager,取消选择所有已选项,仅保留 Tools 下的前两项,然后点击"Install 2 packages..."。完成这步后,就能用新 SDK 创建项目并访问其中的新 API 了。如果跳过第二步,可以创建新 Android 项目,但 Java 库无法正确解析,项目永远无法编译成功。

为 Windows 构建 SDK

Windows 上的 SDK 构建方法与 Linux 和 Mac 略有不同:

$ . build/envsetup.sh
$ lunch sdk-eng
$ make win_sdk

输出位于 out/host/windows/sdk/

构建 CTS

构建兼容性测试套件(CTS)不需要使用 envsetup.shlunch,直接输入:

$ make cts

构建 NDK

NDK 的构建方法如下:

$ . build/envsetup.sh
$ lunch sdk-eng
$ make ndk

更新 API

在 AOSP 中更新 Android Framework API 需要谨慎,因为这会影响应用兼容性。API 的变更通过 frameworks/base/api/*.xml 文件记录,修改后需要运行:

$ make update-api

此命令会更新 API 声明文件,记录新增、移除或修改的 API。

构建单个模块

如果你只想构建某个特定模块,而不是整个系统,可以使用:

$ make <模块名>

模块名由 LOCAL_MODULE 指定。例如:

$ make libutils
$ make Settings

树外构建

AOSP 支持将模块的构建输出放到源码树之外。这在不想污染源码树或需要在不同环境中共享构建产物时很有用。通过设置 OUT_DIR 或使用 dist 目标:

$ make dist DIST_DIR=~/android-dist

这会将构建产物复制到指定目录。