本文件說明 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 清單,以及進一步瞭解 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_CONLYFLAGS、APP_CPPFLAGS。
APP_CLANG_TIDY
如要為專案中所有模組啟用 clang-tidy,請將此旗標設為 true。根據預設,系統會停用此旗標。
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 值指定程式庫使用的 API 不適用於低於 Android 4.1 (API 級別 16) 的版本,而且無法在執行較低平台版本的裝置上使用。如需查看平台名稱與對應的 Android 系統映像檔的完整清單,請參閱 Android NDK 原生 API。
在使用 Gradle 和 externalNativeBuild 時,不應直接設定此參數,而應該在模組層級 build.gradle 檔案的 defaultConfig 或 productFlavors 區塊中設定 minSdkVersion 屬性。這樣可以確保只有在應用程式安裝於執行適當 Android 版本的裝置時,才能使用您的程式庫。
請注意,NDK 不包含 Android 每個 API 級別的程式庫,並省略了不包含新的原生 API 的版本,藉此節省 NDK 中的空間。ndk-build 會依照以下條件,優先使用符合最多條件的 API:
- 與
APP_PLATFORM相符的平台版本。 - 低於
APP_PLATFORM的下一個可用 API 級別。例如,當APP_PLATFORM為android-20時,由於沒有版本是 android-20 的新原生 API,因此會使用android-19。 - 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。如要瞭解其他移除模式,請參閱移除說明文件。
APP_THIN_ARCHIVE
如要為專案中的所有靜態程式庫使用精簡封存,請將這個值設為 true。詳情請參閱 Android.mk 中有關 LOCAL_THIN_ARCHIVE 的說明文件。
APP_WRAP_SH
要包含在應用程式中的 wrap.sh 檔案的路徑。
每個 ABI 都有這個變數的變化版本,ABI 通用的變化版本也是如此,具體如下所示:
APP_WRAP_SHAPP_WRAP_SH_armeabi-v7aAPP_WRAP_SH_arm64-v8aAPP_WRAP_SH_x86APP_WRAP_SH_x86_64