網(wǎng)站服務(wù)器租用有什么好學(xué)大教育一對(duì)一收費(fèi)價(jià)格表
一.前言
? ? ? ? 在Android10之后,所有項(xiàng)目工程中,官方推薦使用Android.bp去編譯構(gòu)建,以前使用Android.mk構(gòu)建的項(xiàng)目隨著版本迭代升級(jí),慢慢需要變更為Android.bp, 兩者的語(yǔ)法都需要去了解并熟練使用。 筆者之前寫過(guò)Android.mk的語(yǔ)句介紹,里面有介紹每句代碼的含義編寫Android.mk把Android studio項(xiàng)目編譯到AOSP源碼中
后來(lái)也總結(jié)過(guò) Android.bp基本用法:?Android.bp 語(yǔ)法和使用? ?比較基礎(chǔ),也是在項(xiàng)目中運(yùn)用到了就記錄下來(lái)。
本篇文章寫的是在項(xiàng)目工程中編寫Android.mk和 Android.bp 文件,引入第三方的jar包,aar包, so庫(kù),引入特許白名單權(quán)限xml文件。
二. Android.mk 編寫
1. 引入jar包
比如,我們當(dāng)前目錄下的 libs 有okhttp-3.4.11.jar 包,我想引用它
需要兩個(gè)步驟
第一步, 聲明我們 jar 包所在的目錄,我的是AndroidStudio工程目錄,所以jar包的路徑是app/libs/okhttp-3.4.11.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := okhttp3:app/libs/okhttp-3.4.11.jar
這行代碼的意思大概可以理解成這樣,聲明一個(gè)變量 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) #這里是多個(gè)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庫(kù)
假如我們當(dāng)前目錄下的 lib 目錄下 有 armeabi-v7a,arm64-v8a 目錄,里面分別有 libaes-jni.so, 如果我們?cè)诰幾g apk 的時(shí)候,想把這些 so 庫(kù) 打包進(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ù)平臺(tái)arm arm64 去選擇編譯對(duì)應(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 庫(kù)
在include $(CLEAR_VARS) 和 include $(BUILD_PACKAGE) 之間添加以下內(nèi)容
LOCAL_REQUIRED_MODULES := libaes-jni#如果你寫這句話 把這個(gè)libaes-jni.so 同時(shí)也打包 放在out/target/產(chǎn)品名路徑/你的apk具體路徑下/lib/#目錄中
#LOCAL_JNI_SHARED_LIBRARIES := libaes-jni
備注:
LOCAL_MODULE_CLASS:(prebuilt)標(biāo)識(shí)了所編譯模塊最后放置的位置,如果不指定,不會(huì)放到系統(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中的共享庫(kù)*.so,此變量就是共享庫(kù)的名字。
那么你要注意的一點(diǎn)是:在你的Project根目錄下的Android.mk中要定義此變量用來(lái)引用你要使用的JNI中的共享庫(kù)*.so? 定義了要包含的so庫(kù)文件的名字,如果程序沒(méi)有采用jni,就不需要
LOCAL_JNI_SHARED_LIBRARIES := libxxx? ? 這樣在編譯的時(shí)候,NDK自動(dòng)會(huì)把這個(gè)libxxx打包進(jìn)apk; 放在out/target/產(chǎn)品名路徑/你的apk具體路徑下/lib/目錄中
LOCAL_REQUIRED_MODULES?指定模塊運(yùn)行所依賴的模塊(模塊安裝時(shí)將會(huì)同步安裝它所依賴的模塊)
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ù)編譯處理
######預(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)行所依賴的模塊
######編譯priv-app 權(quán)限到apk中###########
LOCAL_REQUIRED_MODULES := com.test.mtk.xml