本文档介绍了由 ndk-build
使用的 Application.mk
构建文件。
建议您先阅读 概念 页面,然后再阅读本文档。
概览
Application.mk
指定了 ndk-build 的项目范围设置。默认情况下,它位于应用项目的 jni/Application.mk
中。
变量
APP_ABI
默认情况下,NDK 构建系统会为所有未弃用的 ABI 生成代码。您可以使用 APP_ABI
设置为特定 ABI 生成代码。表 1 显示了不同指令集的 APP_ABI
设置。
指令集 | 值 |
---|---|
32 位 ARMv7 | APP_ABI := armeabi-v7a |
64 位 ARMv8 (AArch64) | APP_ABI := arm64-v8a |
x86 | APP_ABI := x86 |
x86-64 | APP_ABI := x86_64 |
所有支持的 ABI(默认) | APP_ABI := all |
您还可以通过将多个值放在同一行上并用空格分隔来指定多个值。例如
APP_ABI := armeabi-v7a arm64-v8a x86
有关所有支持的 ABI 以及其用法和限制的详细信息,请参阅 Android ABI。
APP_ASFLAGS
传递给项目中每个汇编源文件(.s
和 .S
文件)的汇编程序的标志。
APP_ASMFLAGS
传递给 YASM 的标志,用于所有 YASM 源文件(.asm
,仅限 x86/x86_64)。
APP_BUILD_SCRIPT
默认情况下,ndk-build 假设 Android.mk 文件位于项目根目录下的 jni/Android.mk
。
要从其他位置加载 Android.mk 文件,请将 APP_BUILD_SCRIPT
设置为 Android.mk 文件的绝对路径。
APP_CFLAGS
传递给项目中所有 C/C++ 编译的标志。
另请参阅:APP_CONLYFLAGS、APP_CPPFLAGS。
APP_CLANG_TIDY
设置为 true 以启用项目中所有模块的 clang-tidy。默认情况下禁用。
APP_CLANG_TIDY_FLAGS
传递给项目中所有 clang-tidy 执行的标志。
APP_CONLYFLAGS
传递给项目中所有 C 编译的标志。这些标志不会用于 C++ 代码。
另请参阅:APP_CFLAGS、APP_CPPFLAGS。
APP_CPPFLAGS
传递给项目中所有 C++ 编译的标志。这些标志不会用于 C 代码。
另请参阅:APP_CFLAGS、APP_CONLYFLAGS。
APP_CXXFLAGS
与 APP_CPPFLAGS
相同,但将在编译命令中出现在 APP_CPPFLAGS
之后。例如
APP_CPPFLAGS := -DFOO
APP_CXXFLAGS := -DBAR
上述配置将导致类似于 clang++ -DFOO -DBAR
而不是 clang++ -DBAR -DFOO
的编译命令。
APP_DEBUG
设置为 true 以构建可调试的应用程序。
APP_LDFLAGS
链接可执行文件和共享库时传递的标志。
APP_MANIFEST
AndroidManifest.xml 文件的绝对路径。
默认情况下,如果存在 $(APP_PROJECT_PATH)/AndroidManifest.xml)
将被使用。
APP_MODULES
要构建的模块的显式列表。此列表的元素是模块的名称,如 Android.mk 文件中 LOCAL_MODULE
中所示。
默认情况下,ndk-build 将构建所有共享库、可执行文件及其依赖项。仅当项目使用静态库、项目仅包含静态库或在 APP_MODULES
中命名时,才会构建静态库。
APP_OPTIM
将此可选变量定义为 release
或 debug
。默认情况下将构建发布版二进制文件。
发布模式启用优化,并且可能会生成无法与调试器一起使用的二进制文件。调试模式禁用优化,以便可以使用调试器。
请注意,您可以调试发布版或调试版二进制文件。但是,发布版二进制文件在调试期间提供的信息较少。例如,变量可能会被优化掉,从而无法进行检查。此外,代码重新排序可能会使单步执行代码变得更加困难;堆栈跟踪可能不可靠。
在应用程序清单的 <application>
标记中声明 android:debuggable
将导致此变量默认为 debug
而不是 release
。通过将 APP_OPTIM
设置为 release
来覆盖此默认值。
APP_PLATFORM
APP_PLATFORM
声明此应用程序构建的目标 Android API 级别,并对应于应用程序的 minSdkVersion
。
如果未指定,ndk-build 将以 NDK 支持的最低 API 级别为目标。最新 NDK 支持的最低 API 级别始终足够低,可以支持几乎所有活动设备。
例如,值 android-16
指定您的库使用低于 Android 4.1(API 级别 16)不可用的 API,并且不能在运行较低平台版本的设备上使用。有关平台名称和相应 Android 系统映像的完整列表,请参阅 Android NDK 本机 API。
使用 Gradle 和 externalNativeBuild
时,不应直接设置此参数。而是,在模块级 build.gradle
文件的 defaultConfig
或 productFlavors
块中设置 minSdkVersion
属性。这可确保您的库仅供安装在运行足够版本的 Android 的设备上的应用使用。
请注意,NDK 并非包含所有 Android API 级别的库。为了节省 NDK 中的空间,省略了未包含新本机 API 的版本。ndk-build 按以下优先级顺序使用
- 与
APP_PLATFORM
匹配的平台版本。 - 低于
APP_PLATFORM
的下一个可用 API 级别。例如,当APP_PLATFORM
为android-20
时,将使用android-19
,因为 android-20 中没有新的本机 API。 - NDK 支持的最低 API 级别。
APP_PROJECT_PATH
项目的根目录的绝对路径。
APP_SHORT_COMMANDS
项目范围内的 LOCAL_SHORT_COMMANDS
等效项。有关更多信息,请参阅 Android.mk 中 LOCAL_SHORT_COMMANDS
的文档。
APP_STL
要为此应用程序使用的 C++ 标准库。
默认情况下使用 system
STL。其他选择包括 c++_shared
、c++_static
和 none
。请参阅 NDK C++ 运行时和功能。
APP_STRIP_MODE
传递给此应用程序中模块的 strip
的参数。默认为 --strip-unneeded
。要避免剥离模块中的所有二进制文件,请设置为 none
。有关其他剥离模式,请参阅 strip 文档。
APP_THIN_ARCHIVE
设置为 true 以对项目中的所有静态库使用瘦存档。有关更多信息,请参阅 Android.mk 中 LOCAL_THIN_ARCHIVE
的文档。
APP_WRAP_SH
要与此应用程序一起包含的 wrap.sh 文件的路径。
每个 ABI 都有此变量的一个变体,以及一个 ABI 通用变体
APP_WRAP_SH
APP_WRAP_SH_armeabi-v7a
APP_WRAP_SH_arm64-v8a
APP_WRAP_SH_x86
APP_WRAP_SH_x86_64