本文件說明 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_SH
APP_WRAP_SH_armeabi-v7a
APP_WRAP_SH_arm64-v8a
APP_WRAP_SH_x86
APP_WRAP_SH_x86_64