一.前言
? ? ? ? 在Android10之后,所有項目工程中,官方推薦使用Android.bp去編譯構(gòu)建,以前使用Android.mk構(gòu)建的項目隨著版本迭代升級,慢慢需要變更為Android.bp, 兩者的語法都需要去了解并熟練使用。 筆者之前寫過Android.mk的語句介紹,里面有介紹每句代碼的含義編寫Android.mk把Android studio項目編譯到AOSP源碼中
后來也總結(jié)過 Android.bp基本用法:?Android.bp 語法和使用? ?比較基礎(chǔ),也是在項目中運(yùn)用到了就記錄下來。
本篇文章寫的是在項目工程中編寫Android.mk和 Android.bp 文件,引入第三方的jar包,aar包, so庫,引入特許白名單權(quán)限xml文件。
二. Android.mk 編寫
1. 引入jar包
比如,我們當(dāng)前目錄下的 libs 有okhttp-3.4.11.jar 包,我想引用它
需要兩個步驟
第一步, 聲明我們 jar 包所在的目錄,我的是AndroidStudio工程目錄,所以jar包的路徑是app/libs/okhttp-3.4.11.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := okhttp3:app/libs/okhttp-3.4.11.jar
這行代碼的意思大概可以理解成這樣,聲明一個變量 okhttp3,它的 value 是 app/libs/okhttp-3.4.11.jar
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := okhttp3:app/libs/okhttp-3.4.11.jar \
okio:app/libs/okio-1.9.0.jar
include $(BUILD_MULTI_PREBUILT) #這里是多個jar包預(yù)編譯
第二步. 引用我們聲明 jar 包的變量 引用我們上面聲明的 okhttp3
LOCAL_STATIC_JAVA_LIBRARIES := okhttp3
LOCAL_STATIC_JAVA_LIBRARIES := okhttp3 \
okio
2. 引入aar包
第一步:先聲明 aar 包的位置
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
lottie-2.8.0:app/libs/lottie-2.8.0.aar
include $(BUILD_MULTI_PREBUILT)
第二步:引用聲明的 aar 變量?lottie-2.8.0
LOCAL_STATIC_JAVA_AAR_LIBRARIES := lottie-2.8.0
第三步:添加引用的 aar 包資源
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages com.airbnb.lottie
3. 引入so庫
假如我們當(dāng)前目錄下的 lib 目錄下 有 armeabi-v7a,arm64-v8a 目錄,里面分別有 libaes-jni.so, 如果我們在編譯 apk 的時候,想把這些 so 庫 打包進(jìn)去,在 mk 文件中要怎樣配置呢?
第一步,直接在 mk 文件中配置以下內(nèi)容,預(yù)編譯處理
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
#后綴
LOCAL_MODULE_SUFFIX := .so
#模塊名
LOCAL_MODULE := libaes-jni
#編譯到system/libs/目錄下
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
#另外一種寫法,根據(jù)平臺arm arm64 去選擇編譯對應(yīng)的so文件
#ifeq ($(strip $(TARGET_ARCH)),arm64)
#LOCAL_SRC_FILES :=app/libs/arm64-v8a/libaes-jni.so
#else ifeq ($(strip $(TARGET_ARCH)),arm)
#LOCAL_SRC_FILES :=app/libs/armeabi-v7a/libaes-jni.so
#endif
#arm arm64都編譯
LOCAL_SRC_FILES_arm :=app/libs/armeabi-v7a/libaes-jni.so
LOCAL_SRC_FILES_arm64 :=app/libs/arm64-v8a/libaes-jni.so
LOCAL_MODULE_TARGET_ARCHS:= arm arm64
LOCAL_MULTILIB := both
include $(BUILD_PREBUILT)
第二步: 引用目標(biāo)?so 庫
在include $(CLEAR_VARS) 和 include $(BUILD_PACKAGE) 之間添加以下內(nèi)容
LOCAL_REQUIRED_MODULES := libaes-jni
#如果你寫這句話 把這個libaes-jni.so 同時也打包 放在out/target/產(chǎn)品名路徑/你的apk具體路徑下/lib/#目錄中
#LOCAL_JNI_SHARED_LIBRARIES := libaes-jni
備注:
LOCAL_MODULE_CLASS:(prebuilt)標(biāo)識了所編譯模塊最后放置的位置,如果不指定,不會放到系統(tǒng)中。
LOCAL_MODULE_CLASS := ETC 放于system/etc目錄
LOCAL_MODULE_CLASS := EXECUTABLES 放于/system/bin目錄
LOCAL_MODULE_CLASS := SHARED_LIBRARIES 放在/system/lib目錄
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_CLASS := APPS 放在/system/app目錄
?
LOCAL_JNI_SHARED_LIBRARIES變量主要是用在JNI的編譯中,如果你要在你的Java代碼中引用JNI中的共享庫*.so,此變量就是共享庫的名字。
那么你要注意的一點是:在你的Project根目錄下的Android.mk中要定義此變量用來引用你要使用的JNI中的共享庫*.so? 定義了要包含的so庫文件的名字,如果程序沒有采用jni,就不需要
LOCAL_JNI_SHARED_LIBRARIES := libxxx? ? 這樣在編譯的時候,NDK自動會把這個libxxx打包進(jìn)apk; 放在out/target/產(chǎn)品名路徑/你的apk具體路徑下/lib/目錄中
LOCAL_REQUIRED_MODULES?指定模塊運(yùn)行所依賴的模塊(模塊安裝時將會同步安裝它所依賴的模塊)
4. 引入特許白名單權(quán)限xml
com.test.mtk.xml 內(nèi)容:
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<privapp-permissions package="com.test.mtk">
<permission name="android.permission.MASTER_CLEAR" />
</privapp-permissions>
</permissions>
第一步:預(yù)編譯處理文章來源:http://www.zghlxwxcb.cn/news/detail-739024.html
######預(yù)編譯priv-app 權(quán)限,輸出路徑為system/etc/permissions###########
# Permissions pre-grant
include $(CLEAR_VARS)
LOCAL_MODULE := com.test.mtk.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
第二步:指定app運(yùn)行所依賴的模塊文章來源地址http://www.zghlxwxcb.cn/news/detail-739024.html
######編譯priv-app 權(quán)限到apk中###########
LOCAL_REQUIRED_MODULES := com.test.mtk.xml
到了這里,關(guān)于編寫Android.mk / Android.bp 引用三方 jar 包,aar包,so 庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!