Application.mk

本文档说明了 ndk-build 使用的 Application.mk 构建文件。

建议您先阅读 概念 页面,然后再阅读本文档。

概述

Application.mk 指定了针对 ndk-build 的项目级设置。默认情况下,它位于您的应用项目的 jni/Application.mk 目录。

变量

APP_ABI

默认情况下,NDK 构建系统会为所有非弃用的 ABI 生成代码。您可以使用 APP_ABI 设置来为特定 ABI 生成代码。表 1 显示了不同指令集的 APP_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_CONLYFLAGSAPP_CPPFLAGS

APP_CLANG_TIDY

设置为 true 以针对项目中的所有模块启用 clang-tidy。默认情况下禁用。

APP_CLANG_TIDY_FLAGS

传递给项目中所有 clang-tidy 执行的标志。

APP_CONLYFLAGS

传递给项目中所有 C 编译的标志。这些标志不会用于 C++ 代码。

另请参阅:APP_CFLAGSAPP_CPPFLAGS

APP_CPPFLAGS

项目中所有 C++ 编译需要传递的标志。这些标志不会用于 C 代码。

另请参见:APP_CFLAGSAPP_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

将此可选变量定义为 releasedebug。默认情况下将构建发布版二进制文件。

发布模式启用优化,可能会生成无法与调试器一起使用的二进制文件。调试模式禁用优化,以便可以使用调试器。

请注意,您可以调试发布版或调试版二进制文件。但是,发布版二进制文件在调试期间提供的的信息较少。例如,变量可能会被优化掉,无法进行检查。此外,代码重新排序可能会使单步执行代码更加困难;堆栈跟踪可能不可靠。

在应用程序清单的 <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 文件的 defaultConfigproductFlavors 块中设置 minSdkVersion 属性。这确保您的库仅供安装在运行适当 Android 版本的设备上的应用程序使用。

请注意,NDK 并非包含所有 Android API 级别的库。没有包含新本机 API 的版本被省略,以节省 NDK 中的空间。ndk-build 按以下优先级降序使用

  1. APP_PLATFORM 匹配的平台版本。
  2. 低于 APP_PLATFORM 的下一个可用 API 级别。例如,当 APP_PLATFORMandroid-20 时,将使用 android-19,因为 android-20 中没有新的本机 API。
  3. NDK 支持的最低 API 级别。

APP_PROJECT_PATH

项目根目录的绝对路径。

APP_SHORT_COMMANDS

项目范围内的 LOCAL_SHORT_COMMANDS 等效项。有关更多信息,请参见 Android.mkLOCAL_SHORT_COMMANDS 的文档。

APP_STL

要用于此应用程序的 C++ 标准库。

默认情况下使用 system STL。其他选择包括 c++_sharedc++_staticnone。请参见 NDK C++ 运行时和功能

APP_STRIP_MODE

要传递给此应用程序中模块的 strip 的参数。默认值为 --strip-unneeded。要避免剥离模块中的所有二进制文件,请设置为 none。有关其他剥离模式,请参见 strip 文档

APP_THIN_ARCHIVE

设置为 true 以对项目中的所有静态库使用精简档案。有关更多信息,请参见 Android.mkLOCAL_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