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 清單,以及進一步瞭解 ABI 用法和限制,請參閱 Android ABI

APP_ASFLAGS

傳遞至專案中每個組譯來源檔案 (.s.S 檔案) 組譯工具的旗標。

APP_ASMFLAGS

針對所有 YASM 來源檔案 (僅限 .asm、x86/x86_64),要傳遞至 YASM 的旗標。

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

如要為專案中所有模組啟用 clang-tidy,請將此旗標設為 true。根據預設,系統會停用此旗標。

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 值指定程式庫使用的 API 不適用於低於 Android 4.1 (API 級別 16) 的版本,而且無法在執行較低平台版本的裝置上使用。如需查看平台名稱與對應的 Android 系統映像檔的完整清單,請參閱 Android NDK 原生 API

在使用 Gradle 和 externalNativeBuild 時,不應直接設定此參數,而應該在模組層級 build.gradle 檔案的 defaultConfigproductFlavors 區塊中設定 minSdkVersion 屬性。這樣可以確保只有在應用程式安裝於執行適當 Android 版本的裝置時,才能使用您的程式庫。

請注意,NDK 不包含 Android 每個 API 級別的程式庫,並省略了不包含新的原生 API 的版本,藉此節省 NDK 中的空間。ndk-build 會依照以下條件,優先使用符合最多條件的 API:

  1. APP_PLATFORM 相符的平台版本。
  2. 低於 APP_PLATFORM 的下一個可用 API 級別。例如,當 APP_PLATFORMandroid-20 時,由於沒有版本是 android-20 的新原生 API,因此會使用 android-19
  3. NDK 支援的最低 API 級別。

APP_PROJECT_PATH

專案根目錄的絕對路徑。

APP_SHORT_COMMANDS

相當於 LOCAL_SHORT_COMMANDS 的專案層級項目。詳情請參閱 Android.mk 中有關 LOCAL_SHORT_COMMANDS 的說明文件。

APP_STL

用於應用程式的 C++ 標準程式庫。

根據預設,系統會使用 system STL。其他選項包括 c++_sharedc++_staticnone。請參閱 NDK C++ 執行階段與功能

APP_STRIP_MODE

要為應用程式中的模組傳遞至 strip 的引數,預設為 --strip-unneeded。如要避免移除模組中的所有二進位檔,請將此引數設為 none。如要瞭解其他移除模式,請參閱移除說明文件

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