Application.mk文件官方使用說明

本文檔介紹了 ndk-build 所使用的 Application.mk 編譯文件。html

咱們建議先閱讀概念頁面,而後再閱讀本頁面。android

概覽

 

Application.mk 指定了 ndk-build 的項目範圍設置。默認狀況下,它位於應用項目目錄中的 jni/Application.mk下。c++

注意:其中許多參數也具備模塊等效項。例如,APP_CFLAGS 對應於 LOCAL_CFLAGS。不管何種狀況下,特定於模塊的選項都將優先於應用範圍選項。對於標記,二者都使用,但特定於模塊的標記將後出如今命令行中,所以它們可能會替換項目範圍設置。api

變量

 

APP_ABI

默認狀況下,NDK 編譯系統會爲全部非棄用 ABI 生成代碼。您可使用 APP_ABI 設置爲特定 ABI 生成代碼。表 1 顯示了不一樣指令集的 APP_ABI 設置。app

表 1. 不一樣指令集的 APP_ABI 設置。ide

指令集
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

APP_ASFLAGS

要傳遞給項目中每一個彙編源文件(.s 和 .S 文件)的彙編器的標記。this

注意ASFLAGS 與 ASMFLAGS 不一樣。後者專門適用於 YASM 源文件(請參閱 APP_ASMFLAGS 部分)。

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 文件的絕對路徑。

注意:Gradle 的 externalNativeBuild 將根據 externalNativeBuild.ndkBuild.path 變量自動配置此路徑。

APP_CFLAGS

要爲項目中的全部 C/C++ 編譯傳遞的標記。

注意:Include 路徑應使用 LOCAL_C_INCLUDES 而不是顯式 -I 標記。

另請參閱: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_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)(若是存在)。

注意:使用 externalNativeBuild 時,Gradle 不會設置此值。

APP_MODULES

要編譯的模塊的顯式列表。此列表的元素是模塊在 Android.mk 文件的 LOCAL_MODULE 中顯示的名稱。

默認狀況下,ndk-build 將編譯全部共享庫、可執行文件及其依賴項。僅當項目使用靜態庫、項目僅包含靜態庫或者在 APP_MODULES 中指定了靜態庫時,纔會編譯靜態庫。

注意:將不會編譯導入的模塊(在使用 $(call import-module) 導入的編譯腳本中定義的模塊),除非要在 APP_MODULES中編譯或列出的模塊依賴導入的模塊。

APP_OPTIM

將此可選變量定義爲 release 或 debug。默認狀況下,將編譯發佈二進制文件。

發佈模式會啓用優化,並可能生成沒法與調試程序一塊兒使用的二進制文件。調試模式會停用優化,以即可以使用調試程序。

請注意,您能夠調試發佈二進制文件或調試二進制文件。可是,發佈二進制文件在調試期間提供的信息較少。例如,變量可能會被優化掉,致使沒法檢查代碼。此外,代碼從新排序會使單步調試代碼變得更加困難;堆棧跟蹤可能不可靠。

在應用清單的 <application> 標記中聲明 android:debuggable 將致使此變量默認爲 debug,而不是 release。經過將 APP_OPTIM 設置爲 release 可替換此默認值。

注意:使用 externalNativeBuild 進行編譯時,Android Studio 將根據您的編譯風格適當地設置此標記。

APP_PLATFORM

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:

  1. 匹配 APP_PLATFORM 的平臺版本。
  2. 低於 APP_PLATFORM 的下一個可用 API 級別。例如,APP_PLATFORM 爲 android-20 時,將使用 android-19,由於 android-20 中沒有新的原生 API。
  3. NDK 支持的最低 API 級別。

APP_PROJECT_PATH

項目根目錄的絕對路徑。

APP_SHORT_COMMANDS

LOCAL_SHORT_COMMANDS 的項目範圍等效項。有關詳情,請參閱 Android.mk 中有關 LOCAL_SHORT_COMMANDS 的文檔。

APP_STL

用於此應用的 C++ 標準庫。

默認狀況下使用 system STL。其餘選項包括 c++_sharedc++_static 和 none。請參閱 NDK 運行時和功能

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

注意APP_WRAP_SH_<abi> 沒法與 APP_WRAP_SH 相結合。若是任何 ABI 使用特定於 ABI 的 wrap.sh,則全部 ABI 都必須使用該 wrap.sh。

相關文章
相關標籤/搜索