本文檔介紹了 ndk-build
所使用的 Application.mk
編譯文件。html
咱們建議先閱讀概念頁面,而後再閱讀本頁面。android
Application.mk
指定了 ndk-build 的項目範圍設置。默認狀況下,它位於應用項目目錄中的 jni/Application.mk
下。c++
注意:其中許多參數也具備模塊等效項。例如,APP_CFLAGS
對應於 LOCAL_CFLAGS
。不管何種狀況下,特定於模塊的選項都將優先於應用範圍選項。對於標記,二者都使用,但特定於模塊的標記將後出如今命令行中,所以它們可能會替換項目範圍設置。api
默認狀況下,NDK 編譯系統會爲全部非棄用 ABI 生成代碼。您可使用 APP_ABI
設置爲特定 ABI 生成代碼。表 1 顯示了不一樣指令集的 APP_ABI
設置。app
指令集 | 值 |
---|---|
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 |
您也能夠指定多個值,方法是將它們放在同一行上,中間用空格分隔。例如:gradle
APP_ABI := armeabi-v7a arm64-v8a x86
注意:Gradle 的 externalNativeBuild
會忽略 APP_ABI
。請在 splits
塊內部使用 abiFilters
塊或(若是使用的是「多個 APK」)abi
塊。優化
有關全部受支持 ABI 的列表以及有關其用法和限制的詳細信息,請參閱 ABI 管理。ui
要傳遞給項目中每一個彙編源文件(.s
和 .S
文件)的彙編器的標記。this
注意:ASFLAGS
與 ASMFLAGS
不一樣。後者專門適用於 YASM 源文件(請參閱 APP_ASMFLAGS 部分)。
對於全部 YASM 源文件(.asm
,僅限 x86/x86_64),要傳遞給 YASM 的標記。
默認狀況下,ndk-build 假定 Android.mk 文件位於相對於項目根目錄的 jni/Android.mk
。
要從其餘位置加載 Android.mk 文件,請將 APP_BUILD_SCRIPT
設置爲 Android.mk 文件的絕對路徑。
注意:Gradle 的 externalNativeBuild
將根據 externalNativeBuild.ndkBuild.path
變量自動配置此路徑。
要爲項目中的全部 C/C++ 編譯傳遞的標記。
注意:Include 路徑應使用 LOCAL_C_INCLUDES
而不是顯式 -I
標記。
另請參閱:APP_CONLYFLAGS、APP_CPPFLAGS。
要爲項目中的全部模塊啓用 clang-tidy,請將此標記設置爲「True」。默認處於停用狀態。
要爲項目中的全部 clang-tidy 執行傳遞的標記。
要爲項目中的全部 C 編譯傳遞的標記。這些標記不會用於 C++ 代碼。
另請參閱:APP_CFLAGS、APP_CPPFLAGS。
要爲項目中的全部 C++ 編譯傳遞的標記。這些標記不會用於 C 代碼。
另請參閱:APP_CFLAGS、APP_CONLYFLAGS。
注意:APP_CPPFLAGS 應優先於 APP_CXXFLAGS
。
與 APP_CPPFLAGS
相同,但在編譯命令中將出如今 APP_CPPFLAGS
以後。例如:
APP_CPPFLAGS := -DFOO
APP_CXXFLAGS := -DBAR
以上配置將致使編譯命令相似於 clang++ -DFOO -DBAR
,而不是 clang++ -DBAR -DFOO
。
要編譯可調試的應用,請將此標記設置爲「True」。
關聯可執行文件和共享庫時要傳遞的標記。
注意:這些標記對靜態庫沒有影響。不會關聯靜態庫。
AndroidManifest.xml 文件的絕對路徑。
默認狀況下將使用 $(APP_PROJECT_PATH)/AndroidManifest.xml)
(若是存在)。
注意:使用 externalNativeBuild
時,Gradle 不會設置此值。
要編譯的模塊的顯式列表。此列表的元素是模塊在 Android.mk 文件的 LOCAL_MODULE
中顯示的名稱。
默認狀況下,ndk-build 將編譯全部共享庫、可執行文件及其依賴項。僅當項目使用靜態庫、項目僅包含靜態庫或者在 APP_MODULES
中指定了靜態庫時,纔會編譯靜態庫。
注意:將不會編譯導入的模塊(在使用 $(call import-module)
導入的編譯腳本中定義的模塊),除非要在 APP_MODULES
中編譯或列出的模塊依賴導入的模塊。
將此可選變量定義爲 release
或 debug
。默認狀況下,將編譯發佈二進制文件。
發佈模式會啓用優化,並可能生成沒法與調試程序一塊兒使用的二進制文件。調試模式會停用優化,以即可以使用調試程序。
請注意,您能夠調試發佈二進制文件或調試二進制文件。可是,發佈二進制文件在調試期間提供的信息較少。例如,變量可能會被優化掉,致使沒法檢查代碼。此外,代碼從新排序會使單步調試代碼變得更加困難;堆棧跟蹤可能不可靠。
在應用清單的 <application>
標記中聲明 android:debuggable
將致使此變量默認爲 debug
,而不是 release
。經過將 APP_OPTIM
設置爲 release
可替換此默認值。
注意:使用 externalNativeBuild
進行編譯時,Android Studio 將根據您的編譯風格適當地設置此標記。
APP_PLATFORM
會聲明編譯此應用所面向的 Android API 級別,並對應於應用的 minSdkVersion
。
若是未指定,ndk-build 將以 NDK 支持的最低 API 級別爲目標。最新 NDK 支持的最低 API 級別老是足夠低,能夠支持幾乎全部使用中的設備。
警告:將 APP_PLATFORM
設置爲高於應用的 minSdkVersion
可能會生成一個沒法在舊設備上運行的應用。在大多數狀況下,庫將沒法加載,由於它們引用了在舊設備上不可用的符號。
例如,值 android-16
指定庫使用在 Android 4.1(API 級別 16)之前的版本中不可用的 API,而且沒法在運行較低平臺版本的設備上使用。有關平臺名稱和相應 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-19
,由於 android-20 中沒有新的原生 API。項目根目錄的絕對路徑。
LOCAL_SHORT_COMMANDS
的項目範圍等效項。有關詳情,請參閱 Android.mk 中有關 LOCAL_SHORT_COMMANDS
的文檔。
用於此應用的 C++ 標準庫。
默認狀況下使用 system
STL。其餘選項包括 c++_shared
、c++_static
和 none
。請參閱 NDK 運行時和功能。
要爲此應用中的模塊傳遞給 strip
的參數。默認爲 --strip-unneeded
。要避免剝離模塊中的全部二進制文件,請設置爲 none
。有關其餘剝離模式,請參閱剝離文檔。
要爲項目中的全部靜態庫使用瘦歸檔,請將此變量設置爲「True」。有關詳情,請參閱 Android.mk 中有關 LOCAL_THIN_ARCHIVE
的文檔。
要包含在此應用中的 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
注意:APP_WRAP_SH_<abi>
沒法與 APP_WRAP_SH
相結合。若是任何 ABI 使用特定於 ABI 的 wrap.sh,則全部 ABI 都必須使用該 wrap.sh。