本文檔介紹 ndk-build 所使用的 Application.mk 構(gòu)建文件。
我們建議先閱讀概念頁(yè)面,然后再閱讀本頁(yè)面。
概覽
Application.mk 指定 ndk-build 的項(xiàng)目級(jí)設(shè)置。默認(rèn)情況下,它位于應(yīng)用項(xiàng)目目錄中的 jni/Application.mk 下。
注意:其中許多參數(shù)也具有模塊等效項(xiàng)。例如,APP_CFLAGS 對(duì)應(yīng)于 LOCAL_CFLAGS。無(wú)論何種情況下,特定于模塊的選項(xiàng)都將優(yōu)先于應(yīng)用級(jí)選項(xiàng)。對(duì)于標(biāo)記,兩者都使用,但特定于模塊的標(biāo)記將后出現(xiàn)在命令行中,因此它們可能會(huì)替換項(xiàng)目級(jí)設(shè)置。
變量
APP_ABI
默認(rèn)情況下,NDK 構(gòu)建系統(tǒng)會(huì)為所有非棄用 ABI 生成代碼。您可以使用 APP_ABI 設(shè)置為特定 ABI 生成代碼。表 1 顯示了不同指令集的 APP_ABI 設(shè)置。
您也可以指定多個(gè)值,方法是將它們放在同一行上,中間用空格分隔。例如:
APP_ABI := armeabi-v7a arm64-v8a x86
注意:Gradle 的 externalNativeBuild 會(huì)忽略 APP_ABI。請(qǐng)?jiān)?splits 塊內(nèi)部使用 abiFilters 塊或(如果使用的是“多個(gè) APK”)abi 塊。
如需查看所有受支持 ABI 的列表以及詳細(xì)了解其用法和限制,請(qǐng)參閱 Android ABI。
APP_ASFLAGS
要傳遞給項(xiàng)目中每個(gè)匯編源文件(.s 和 .S 文件)的編譯器的標(biāo)記。
注意:ASFLAGS 與 ASMFLAGS 不同。后者專(zhuān)用于 YASM 源文件(請(qǐng)參閱關(guān)于 APP_ASMFLAGS 的部分)。
APP_ASMFLAGS
對(duì)于所有 YASM 源文件(.asm,僅限 x86/x86_64),要傳遞給 YASM 的標(biāo)記。
APP_BUILD_SCRIPT
默認(rèn)情況下,ndk-build 假定 Android.mk 文件位于項(xiàng)目根目錄的相對(duì)路徑 jni/Android.mk 中。
如需從其他位置加載 Android.mk 文件,請(qǐng)將 APP_BUILD_SCRIPT 設(shè)置為 Android.mk 文件的絕對(duì)路徑。
注意:Gradle 的 externalNativeBuild 將根據(jù) externalNativeBuild.ndkBuild.path 變量自動(dòng)配置此路徑。
APP_CFLAGS
要為項(xiàng)目中的所有 C/C++ 編譯傳遞的標(biāo)記。
注意:Include 路徑應(yīng)使用 LOCAL_C_INCLUDES 而不是顯式 -I 標(biāo)記。
另請(qǐng)參閱:APP_CONLYFLAGS、APP_CPPFLAGS。
APP_CLANG_TIDY
若要為項(xiàng)目中的所有模塊啟用 clang-tidy,請(qǐng)將此標(biāo)記設(shè)置為“True”。默認(rèn)處于停用狀態(tài)。
APP_CLANG_TIDY_FLAGS
要為項(xiàng)目中的所有 clang-tidy 執(zhí)行傳遞的標(biāo)記。
APP_CONLYFLAGS
要為項(xiàng)目中的所有 C 編譯傳遞的標(biāo)記。這些標(biāo)記不會(huì)用于 C++ 代碼。
另請(qǐng)參閱:APP_CFLAGS、APP_CPPFLAGS。
APP_CPPFLAGS
要為項(xiàng)目中的所有 C++ 編譯傳遞的標(biāo)記。這些標(biāo)記不會(huì)用于 C 代碼。
另請(qǐng)參閱:APP_CFLAGS、APP_CONLYFLAGS。
APP_CXXFLAGS
注意:APP_CPPFLAGS 應(yīng)優(yōu)先于 APP_CXXFLAGS。
與 APP_CPPFLAGS 相同,但在編譯命令中將出現(xiàn)在 APP_CPPFLAGS 之后。例如:
APP_CPPFLAGS := -DFOO
APP_CXXFLAGS := -DBAR
以上配置將導(dǎo)致編譯命令類(lèi)似于 clang++ -DFOO -DBAR,而不是 clang++ -DBAR -DFOO。
APP_DEBUG
若要構(gòu)建可調(diào)試的應(yīng)用,請(qǐng)將此標(biāo)記設(shè)置為“True”。
APP_LDFLAGS
關(guān)聯(lián)可執(zhí)行文件和共享庫(kù)時(shí)要傳遞的標(biāo)記。
注意:這些標(biāo)記對(duì)靜態(tài)庫(kù)沒(méi)有影響。不會(huì)關(guān)聯(lián)靜態(tài)庫(kù)。
APP_MANIFEST
AndroidManifest.xml 文件的絕對(duì)路徑。
默認(rèn)情況下將使用 $(APP_PROJECT_PATH)/AndroidManifest.xml)(如果存在)。
注意:使用 externalNativeBuild 時(shí),Gradle 不會(huì)設(shè)置此值。
APP_MODULES
要構(gòu)建的模塊的顯式列表。此列表的元素是模塊在 Android.mk 文件的 LOCAL_MODULE 中顯示的名稱(chēng)。
默認(rèn)情況下,ndk-build 將構(gòu)建所有共享庫(kù)、可執(zhí)行文件及其依賴(lài)項(xiàng)。僅當(dāng)項(xiàng)目使用靜態(tài)庫(kù)、項(xiàng)目?jī)H包含靜態(tài)庫(kù)或者在 APP_MODULES 中指定了靜態(tài)庫(kù)時(shí),才會(huì)構(gòu)建靜態(tài)庫(kù)。
注意:將不會(huì)構(gòu)建導(dǎo)入的模塊(在使用 $(call import-module) 導(dǎo)入的構(gòu)建腳本中定義的模塊),除非要在 APP_MODULES 中構(gòu)建或列出的模塊依賴(lài)導(dǎo)入的模塊。
APP_OPTIM
將此可選變量定義為 release 或 debug。默認(rèn)情況下,將構(gòu)建發(fā)布二進(jìn)制文件。
發(fā)布模式會(huì)啟用優(yōu)化,并可能生成無(wú)法與調(diào)試程序一起使用的二進(jìn)制文件。調(diào)試模式會(huì)停用優(yōu)化,以便可以使用調(diào)試程序。
請(qǐng)注意,您可以調(diào)試發(fā)布二進(jìn)制文件或調(diào)試二進(jìn)制文件。但是,發(fā)布二進(jìn)制文件在調(diào)試期間提供的信息較少。例如,變量可能會(huì)被優(yōu)化掉,導(dǎo)致無(wú)法檢查代碼。此外,代碼重新排序會(huì)使單步調(diào)試代碼變得更加困難;堆棧軌跡更可能不可靠。
在應(yīng)用清單的 標(biāo)記中聲明 android:debuggable 將導(dǎo)致此變量默認(rèn)為 debug,而不是 release。通過(guò)將 APP_OPTIM 設(shè)置為 release 可替換此默認(rèn)值。
注意:使用 externalNativeBuild 進(jìn)行構(gòu)建時(shí),Android Studio 將根據(jù)您的構(gòu)建風(fēng)格適當(dāng)?shù)卦O(shè)置此標(biāo)記。
APP_PLATFORM
APP_PLATFORM 會(huì)聲明構(gòu)建此應(yīng)用所面向的 Android API 級(jí)別,并對(duì)應(yīng)于應(yīng)用的 minSdkVersion。
如果未指定,ndk-build 將以 NDK 支持的最低 API 級(jí)別為目標(biāo)。最新 NDK 支持的最低 API 級(jí)別總是足夠低,可以支持幾乎所有有效設(shè)備。
警告:將 APP_PLATFORM 設(shè)置為高于應(yīng)用的 minSdkVersion 可能會(huì)生成一個(gè)無(wú)法在舊設(shè)備上運(yùn)行的應(yīng)用。在大多數(shù)情況下,庫(kù)將無(wú)法加載,因?yàn)樗鼈円昧嗽谂f設(shè)備上不可用的符號(hào)。
例如,值 android-16 指定庫(kù)使用在 Android 4.1(API 級(jí)別 16)以前的版本中不可用的 API,并且無(wú)法在運(yùn)行較低平臺(tái)版本的設(shè)備上使用。如需查看平臺(tái)名稱(chēng)和相應(yīng) Android 系統(tǒng)映像的完整列表,請(qǐng)參閱 Android NDK 原生 API。
使用 Gradle 和 externalNativeBuild 時(shí),不應(yīng)直接設(shè)置此參數(shù)。而應(yīng)在模塊級(jí)別 build.gradle 文件的 defaultConfig 或 productFlavors 塊中設(shè)置 minSdkVersion 屬性。這樣就能確保只有在運(yùn)行足夠高 Android 版本的設(shè)備上安裝的應(yīng)用才能使用您的庫(kù)。
請(qǐng)注意,NDK 不包含 Android 每個(gè) API 級(jí)別的庫(kù),省略了不包含新的原生 API 的版本以節(jié)省 NDK 中的空間。ndk-build 按以下優(yōu)先級(jí)降序使用 API:
匹配 APP_PLATFORM 的平臺(tái)版本。
低于 APP_PLATFORM 的下一個(gè)可用 API 級(jí)別。例如,APP_PLATFORM 為 android-20 時(shí),將使用 android-19,因?yàn)?android-20 中沒(méi)有新的原生 API。
NDK 支持的最低 API 級(jí)別。
APP_PROJECT_PATH
項(xiàng)目根目錄的絕對(duì)路徑。
APP_SHORT_COMMANDS
LOCAL_SHORT_COMMANDS 的項(xiàng)目級(jí)等效項(xiàng)。如需了解詳情,請(qǐng)參閱 Android.mk 中有關(guān) LOCAL_SHORT_COMMANDS 的文檔。
APP_STL
用于此應(yīng)用的 C++ 標(biāo)準(zhǔn)庫(kù)。
默認(rèn)情況下使用 system STL。其他選項(xiàng)包括 c++_shared、c++_static 和 none。請(qǐng)參閱 NDK C++ 運(yùn)行時(shí)和功能。
APP_STRIP_MODE
要為此應(yīng)用中的模塊傳遞給 strip 的參數(shù)。默認(rèn)為 --strip-unneeded。若要避免剝離模塊中的所有二進(jìn)制文件,請(qǐng)將其設(shè)置為 none。如需了解其他剝離模式,請(qǐng)參閱剝離文檔。
APP_THIN_ARCHIVE
要為項(xiàng)目中的所有靜態(tài)庫(kù)使用瘦歸檔,請(qǐng)將此變量設(shè)置為“True”。如需了解詳情,請(qǐng)參閱 Android.mk 中有關(guān) LOCAL_THIN_ARCHIVE 的文檔。
APP_WRAP_SH
要包含在此應(yīng)用中的 wrap.sh 文件的路徑。
每個(gè) ABI 都存在此變量的變體,ABI 通用變體也是如此:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-713268.html
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_ 可能無(wú)法與 APP_WRAP_SH 結(jié)合使用。如果有任何 ABI 使用特定于 ABI 的 wrap.sh,所有 ABI 都必須使用該 wrap.sh。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-713268.html
到了這里,關(guān)于Android NDK開(kāi)發(fā)詳解之Application.mk探秘的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!