VirtualApk載入外掛程式原理

2021-08-19 06:36:08 字數 2435 閱讀 5300

在virtualapk官方文件第三方技術文章中介紹了載入外掛程式四大元件和資源的原理, 我想總結一下載入外掛程式的原理並畫了個流程圖。

為了加深對virtualapk的理解, 考慮問題:

1、外掛程式中的類是被哪個classloader載入的? 答:跟constants.combine_classloader引數有關。

2、外掛程式能載入宿主的類是如何實現的? 答:將宿主的dexelements插入到外掛程式dexclassloader的dexelements前面。

3、外掛程式之間能相互載入對方的類嗎? 答:不能;

4、如果宿主和外掛程式有相同的類, 到底載入的是哪乙個?答:跟constants.combine_classloader引數有關。

5、外掛程式能載入其它外掛程式嗎? 答:不能;

6、各個外掛程式的包名能相同嗎? 答:不能;

8、class.forname和new someclass()的區別是forname只載入當前類和靜態成員, 而new物件則載入當前類、靜態成員和成員變數類。

以virtualapk裡的demo為例,按照流程圖的順序依次講解:

2、 下面看看loadplugin函式做了什麼。 每個apk檔案最後都會生成乙個loadedplugin例項,並快取到mplugins裡。 注意:virtualapk只能載入apk格式的外掛程式,不能直接載入dex;各個外掛程式的包名必須不同。 

3、下面看看create函式做了什麼, 就是new個例項, 業務邏輯封裝在建構函式裡。

public static loadedplugin create(pluginmanager pluginmanager, context host, file apk) throws exception
4、下面仔細分析loadedplugin建構函式。 快取了宿主中pluginmanager例項的引用和宿主上下文, 解析外掛程式檔案(注意必須是apk格式!)並載入資源檔案和dex,解析外掛程式裡的androidmanifest.xml並快取activity、instrument、service、provider資訊,註冊靜態廣播, 載入資源檔案原理見virtualapk 資源載入機制分析

5、 下面著重分析一下mclassloader是怎麼生成的。  使用dexclassloader載入外掛程式中的dex, 然後判斷布林值constants.combine_classloder,預設值是true即可以載入宿主中的類, 值是false是不能載入宿主中的類。

如何實現的呢? 關鍵是insertdex函式。

6、 除錯insertdex函式, 可以看到將宿主dexelements插入到外掛程式dexelements前面, 因為classloader的雙親委派機制, 會按照dexelements陣列順序依次查詢載入類。 如果在前面的dexelement裡成功載入了乙個類, 就不會嘗試去後面的dexelement裡查詢了。

ps: 宿主和外掛程式有同乙個類(包名、類名相同), 如果combine_classloader為true則外掛程式會載入宿主中的類;如果值為false則會載入外掛程式中的類。

, 即當前loadedplugin的classloader。

8、 載入完外掛程式後啟動其中的activity, 如何使用外掛程式中的classloader和資源呢?  首先在啟動外掛程式中activity時最終走到newactivity函式, 使用外掛程式plugin.getclassloader()載入對應類。

好了, 以上就是virtualapk載入外掛程式的流程原理。 如有遺漏,歡迎補充。

ps:在除錯宿主apk時, 不要混淆外掛程式**, 否則找不到外掛程式中的函式。 發布版本時,宿主、外掛程式都要用release版本。 

VirtualAPK 外掛程式化框架介紹

virtualapk 是乙個 android 外掛程式化框架。如果乙個 apk 有很多功能,其中一些功能使用的場景比較少,那麼可以在這些功能被使用的時候動態載入,而不是一次性打包在整個 apk 中。外掛程式化不僅可以縮小 apk 體積,也方便各個外掛程式特性的動態更新。使用 virtualapk 需...

spring boot mybatis載入原理

在學習springboot原理的時候,一直想找個現實版的例項檢測和梳理下內容,於是著手打算從正在使用的mybatis試用開始。因為專案用到了tk.mybatis 因此直接從這個開始分析,慢慢梳理下 先從自動配置 開始mybatis的自動配置 auto configure org.springfram...

載入外掛程式(三)

接著 二 重新把vlc entry core 寫出來 int vlc entry core vlc set cb vlc set,void opaque 注意 va arg ap,module t submodule 這句,ap正好對應第四個引數,它是 module,因此module被建立出來了。後...