编译配方¶
在了解了编译系统的架构和工作原理之后,接下来看一些最常用的,以及一些不太常见的编译配方。我们只会简要介绍每种配方的使用结果,但足以让你入门。
默认 droid 构建¶
前面我们用过不少简单的 make 命令,但还没有真正解释过默认目标。当你运行 make 时,实际上等同于输入了:
$ make droid
droid 是 main.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.sh 或 lunch,直接输入:
$ 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
这会将构建产物复制到指定目录。