请按照以下说明构建 Android。
设置环境
使用 envsetup.sh
脚本初始化环境:
source build/envsetup.sh
或
. build/envsetup.sh
请参阅 platform/build/envsetup.sh 中的脚本,了解相关命令的说明,包括用于选择设备目标的 lunch,以及用于构建未捆绑应用(例如参考 TV 应用)的 tapas。
您需要在每次运行 repo sync
后重新发出此命令,以获取对该脚本所做的任何更改。请注意,将 source
替换为 .
(一个点)可以省去一些字符,这种简写形式在文档中更为常用。
envsetup.sh
脚本会导入若干命令,让您能够使用 Android 源代码,其中包括本练习中使用的命令。
如需查看可用命令的完整列表,请运行以下命令:
hmm
选择目标
lunch
使用 lunch
选择要构建的目标。lunch
product_name-build_variant
会选择 product_name 作为需要构建的产品,并选择 build_variant 作为需要构建的变体,然后将这些选择存储在环境中,以便供后续对 m
和其他类似命令的调用读取。
确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整构建,并且启用所有调试功能。
lunch aosp_arm-eng
如果在没有参数的情况下运行,则 lunch
会提示您从菜单中选择目标,但请注意,菜单中并未包含所有可能的选项。如需了解 AOSP 支持的所有设备的 build 配置,请参阅选择设备 build,或询问您的团队成员您所使用的设备的正确 lunch 是什么。
所有构建目标都采用 BUILD-BUILDTYPE
形式,其中 BUILD
是表示特定功能组合的代号。BUILDTYPE
是以下类型之一:
构建类型 | 使用情况 |
---|---|
user | 权限受限;适用于生产环境 |
userdebug | 与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型 |
eng | 具有额外调试工具的开发配置 |
userdebug
build 的运行方式应该与 user
build 一样,且能够启用通常不符合平台安全模型的额外调试功能。这就使得 userdebug
build 具有更强大的诊断功能,因此是进行 user 测试的最佳选择。使用 userdebug
build 进行开发时,请遵循 userdebug 指南。
eng
build 会优先考虑在平台上工作的工程师的工程生产率。eng
构建系统会关闭用于提供良好用户体验的各种优化。除此之外,eng
build 的运行方式类似于 user
和 userdebug
build,以便设备开发者能够看到代码在这些环境下的运行方式。
如需查看当前的启动设置,请运行以下命令:
echo "$TARGET_PRODUCT-$TARGET_BUILD_VARIANT"
如需详细了解如何在实际硬件上进行构建和运行,请参阅刷写设备。
tapas
tapas
命令用于配置未捆绑应用的构建流程。它会选择要由 Android 构建系统构建的各个应用。与 lunch
不同,tapas
不会请求为设备构建映像。
如需详细了解该命令,请运行 tapas help
。
构建代码
本部分是一个简短摘要,用于确保设置已完成。
使用 m
构建所有内容。m
可以使用 -jN
参数处理并行任务。如果您没有提供 -j
参数,构建系统会自动选择您认为最适合您系统的并行任务计数。
m
如上所述,您可以通过在 m
命令行中列出相应名称来构建特定模块,而不是构建完整的设备映像。此外,m
还针对各种特殊目的提供了一些伪目标。以下是一些示例:
droid
-m droid
是正常 build。此目标在此处,因为默认目标需要名称。all
-m all
会构建m droid
构建的所有内容,加上不包含droid
标记的所有内容。构建服务器会运行此命令,以确保包含在树中且包含Android.mk
文件的所有元素都会构建。m
- 从树的顶部运行构建系统。这很有用,因为您可以在子目录中运行make
。如果您设置了TOP
环境变量,它便会使用此变量。如果您未设置此变量,它便会从当前目录中查找相应的树,以尝试找到树的顶层。您可以通过运行不包含参数的m
来构建整个源代码树,也可以通过指定相应名称来构建特定目标。mma
- 构建当前目录中的所有模块及其依赖项。mmma
- 构建提供的目录中的所有模块及其依赖项。croot
-cd
到树顶部。clean
-m clean
会删除此配置的所有输出和中间文件。此内容与rm -rf out/
相同。
运行 m help
即可查看 m
提供的其他伪目标。
运行 build
您可以在模拟器上运行 build,也可以将其刷写到设备上。由于您已经使用 lunch
选择了构建目标,因此它不可能在构建目标以外的目标上运行。
使用 fastboot 刷机
如需刷写设备,请使用 fastboot
;在构建成功后,它应该会包含在您的路径中。如需相关说明,请参阅刷写设备。
模拟 Android 设备
构建流程会自动将模拟器添加到您的路径中。如需运行模拟器,请输入以下命令:
emulator
了解 build 指纹
如需跟踪和报告与特定 Android build 相关的问题,请一定要了解 build 指纹。build 指纹是能让人看懂的唯一字符串,其中包含向每个 build 发出的制造商信息。有关详情,请参阅 Android 兼容性定义文档 (CDD) 中 Build 参数部分内的“FINGERPRINT”说明。
build 指纹表示特定的 Android 实现和修订版本。此唯一键可让应用开发者和其他人报告与特定固件版本相关的问题。如需了解 Android 问题报告流程,请参阅报告 bug。
build 指纹封装了所有 Android 实现详情:
- API:Android 和原生,以及软 API 行为
- 核心 API 和部分系统界面行为
- CDD 中定义的兼容性和安全性要求
- 应用所采用的产品规范和 uses-feature 设置,用于定位符合预期要求的设备
- 硬件和软件组件的实现
如需查看完整详情,请参阅 CDD。如需有关打造全新 Android 设备的说明,请参阅添加新设备。
排查常见构建错误
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。
没有 USB 权限
默认情况下,在大多数 Linux 系统中,无特权的用户无法使用 USB 端口。如果您看到权限遭拒错误,请按照配置 USB 使用权限中的说明操作。
如果上述规则设置完成后,ADB 已在运行且无法连接到设备,您可以使用 adb kill-server
将其终止。此命令将使 ADB 重启并采用新配置。