virtualapk 是乙個 android 外掛程式化框架。如果乙個 apk 有很多功能,其中一些功能使用的場景比較少,那麼可以在這些功能被使用的時候動態載入,而不是一次性打包在整個 apk 中。外掛程式化不僅可以縮小 apk 體積,也方便各個外掛程式特性的動態更新。
使用 virtualapk 需要對主 apk (宿主)和外掛程式 apk(外掛程式)做一些修改定製。這裡以 virtualapk 0.9.8 版本為例。
在主 apk 的專案 build.gradle 配置 virtualapk 的外掛程式如下:
buildscript
}
這裡使用的是 gradle:3.2.0 的外掛程式,如果使用 3.5 版本的 gradle,會出現 android 的 gradle 外掛程式和 virtualapk 外掛程式不相容的情況,具體可以看 virtualapk 在 github 的 issue。
如果主 apk 使用了 androidx,也建議 android 的 gradle 外掛程式版本在 3.2.0 以上,這樣才能將 virtualapk 原始碼中對應 support 包的引用自動轉換為 androidx。
配置外掛程式:
配置依賴:
dependencies
配置 proguard 混淆
-keep class com.didi.virtualapk.internal.vainstrumentation
-keep class com.didi.virtualapk.internal.plugincontentresolver
-dontwarn com.didi.virtualapk.**
-dontwarn android.**
-keep class android.**
@override
protected
void
attachbasecontext
(context base)
因為宿主 apk 需要載入外掛程式,所以需要讀取外部儲存的許可權(read_external_storage)。同時在 androidmanifest 宣告許可權如下:
以宿主 apk 的 hostactivity 啟動外掛程式 apk 的 mainactivity(com.android.plugin.mainactivity)如下:
public
class
hostactivity
extends
activity
, req_write_storage);}
else
}else
}private
void
launchplugin()
startactivity
(intent);}
catch
(exception e)
}@override
public
void
onrequestpermissionsresult
(int requestcode,
@nonnull string[
] permissions,
@nonnull
int[
] grantresults)
}}
launchplugin 首先從外部儲存中載入外掛程式 apk,如果外掛程式 apk 已經載入過了,就直接跳轉,否則先呼叫 loadplugin 方法載入外掛程式。
如果正常執行,宿主 apk 會先啟動 hostactivity,然後立即跳轉到外掛程式 apk 的 mainactivity,顯示外掛程式 apk 的內容。
在外掛程式 apk 的專案 build.gradle 配置 virtualapk 的外掛程式如下:
buildscript
}
配置外掛程式:
可以看出外掛程式 apk 只需要配置 com.didi.virtualapk.plugin,而不用配置依賴,因為外掛程式 apk 這時只是作為被依賴的。
最後需要配置 virtualapk 的定製配置:
virtualapk
如果外掛程式 apk 的資源和主 apk 的資源名稱相同,建議修改為其他名稱和主 apk 的命名區分開。
比如 r.layout.activity_main 改名為 r.layout.activity_plugin_main
最後編譯外掛程式 apk 如下:
gradlew clean assembleplugin
注意外掛程式 apk 必須要先配置好簽名,不能用 debug 模式編譯。
com.android.plugin_20190921151552.apk
然後將外掛程式 apk 重新命名為 test.apk push 到手機的 /mnt/sdcard/ 目錄,方便主 apk 從外部儲存載入外掛程式 apk。
virtualapk 是乙個 android 外掛程式化框架,它支援四大元件以及資源的外掛程式化。同時 virtualapk 有它自己的 gradle 外掛程式,宿主 apk 和 外掛程式 apk 需要用 virtualapk 的 gradle 外掛程式編譯。
VirtualApk載入外掛程式原理
在virtualapk官方文件第三方技術文章中介紹了載入外掛程式四大元件和資源的原理,我想總結一下載入外掛程式的原理並畫了個流程圖。為了加深對virtualapk的理解,考慮問題 1 外掛程式中的類是被哪個classloader載入的?答 跟constants.combine classloader...
Android外掛程式化框架SpeedTools
其實ios在現在外掛程式化android以後也會限制,至少已經開有動作了,例如resource物件建立在android n之後進入了廢棄的行業。外掛程式化其實如果對許可權沒有限制他就是病毒,你想想如果你 外掛程式化原理 按照實現模式來說分為 模式,修改反射hock系統關鍵流程的。按照apk安裝來分有...
nodejs外掛程式化框架 minimajs
我們先簡單看一下,如何來使用這個框架。import from minimajs import path from path let minima new minima path.join dirname,plugins minima.start 通過這幾行 就可以建立乙個外掛程式框架,並且從當前的p...