[Android]用架構師角度看插件化(1)-Replugin入門剖析

你們好,我係蒼王。
java

如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。git

[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表github


多謝一直以來的支持,組件化的內容,應該會有一段時間再也不更新,一些很是關鍵的技術將會在我將要出版的組件化書籍中說起。json

組件化模塊化的開發適合於中小型企業的業務疊加,和代碼重用。而插件化的開發將組件化和模塊的功能徹底解耦出來。架構

在國內的開發環境,插件化是用戶體驗和開發週期的產物,咱們要作的是順應潮流,正如我組件化&模塊化&插件化演進中分析同樣。app

Replugin,滴滴出品的VirtualApk,還有阿里出版了一本熱修復框架的書籍,這些估計都足夠不少人學習好久了。
框架

這裏我將挑選了一下Replugin的技術做爲接下來方向的研究,將會給你們剖析他的運行過程,但願你們不膩賜教。模塊化

將會有多個章節介紹,但願你們一塊兒進步吧。組件化


一.Github介紹

Replugin地址(https://github.com/Qihoo360/RePlugin)佈局


強大的介紹,但願你們都去看看起介紹,有個基礎的瞭解吧。

其一些配置原理再這裏(詳細介紹


這裏是固然看完了應該就對他有一個基本的瞭解了。

只有真正深切去了解過插件化,才明白它作到的飛躍性。


二.工程佈局

下載一下源碼,咱們能夠看到,其裏面包含了五個文檔。


replugin-host-gradle 是宿主gradle腳本

replugin-host-library 是宿主library源代碼,咱們依賴的源代碼就是這個了

replugin-plugin-gradle 插件的Gradle腳本

replugin-plugin-library 插件的源代碼,插件都須要依賴這個

replugin-sample 固然就是例子啦

咱們看一下replugin-sample,裏面包含了host宿主,還有兩個plugin的的demo,這章就先研究這個例子,而後下節將會開始深刻的源碼介紹。



三.host宿主

首先是在build.gradle的classpath引用 gradle


而後源碼中引用


而後咱們須要在Application中配置

這裏是動態配置Application


而後固然就是通常關心的跳轉問題

這裏demo1是包名,而後以後的是跳轉Activity的地址


Replugin.startActivity是使用坑位跳轉的,坑位在哪裏聲明,下一章節會介紹。

而後官網有介紹一些跳轉方法,最重要是用到隱式跳轉,經過包名和類跳轉。


而後還有跳轉Fragment的示例

這裏面想要加載插件的Fragment,須要先註冊Fragment整個的包名+地址名稱。

而後還須要Replugin中的ClassLoader機制,而這裏每一個dex貌似都會有一個classloader,這個以後會介紹。

這裏面loadCalss是先獲取到Fragment爲Class對象,而後經過asSubClass改成Fragment.clas類型,固然newInstance就是真正的建立對象了。


而後咱們看一下app中,安裝前須要內置插件,將插件(XXX.jar)放到assets裏面,將會和app一塊兒跟隨安裝,這是做爲連同宿主初始時加載某些必要插件的內置安裝。


咱們看一下引用了replugin的gradle命令會有什麼額外的編譯


rpGenerateDebugBuiltinJson編譯出插件的json目錄


rpGenerateDebugHostConfig會顯示出整個Replugin的配置


rpShowPluginsDebug命令是打印出插件版本信息。



rpGenerateReleaseBuitInJson、rpGenerateReleaseHostConfig、rpShowPluginsRelease編譯出Release版本的文件


四.lib插件

咱們插件仍是同樣須要Gradle配置



以前說起到startActivity的方式,Replugin中在插件內由於有ClassLoader是獨立,使用日常的startActivity的跳轉方式。而插件間使用startActivity跳轉,須要使用Replugin.startActivity或者隱式跳轉來完成。


而插件間的通訊,Replugin是使用了aidl的方式來完成


這裏須要使用遠程通訊來完成。Android一開始設計IBinder就是設計爲跨進程間的通訊的,而這裏面就算插件運行爲獨立進程也是沒問題的。


咱們再看一下AndroidManifest,聲明方式和日常的Android工程並沒有不一樣

值得注意的是,AndroidManifest經過meta-data來聲明的。


而後看一下Lib中加載的額外的Gradle命令



運行reInstallPluginDebug來運行安裝,咱們看到是將其放到sdk,而後再安裝

而後使用reRunPluginDebug應該是運行命令,無奈提示失敗


之後修復後再給你們介紹。

如何生成內置的插件的jar文件,直接插件生成apk後綴改成apk,而後放到assets裏面,宿主的gradle編譯時才能識別。




總結

咱們入門剖析Replugin。

(1)配置接入-接入成本最低,並不須要編寫通常的佔坑規則

(2)跳轉效率-插件內原生跳轉,插件外隱式跳轉或佔坑跳轉

(3)插件通訊-插件間通訊使用aidl,這樣就算插件獨立進程依然通訊正常。

(4)維護成本-hook點只有一個,減小最少意味着維護成本也下降

(5)加載方式-宿主內置jar和外置加載apk加載的方式

這些就是接入插件化須要估量的方面,而後深化研究代價利弊才能更加深刻一步步評估出適合大家項目的插件化。

但願之後你們多多關注!下期將不會再在簡書首發哦。


順應潮流,才能試着改變潮流。

下一節將會更精彩,敬請期待!!!


這裏發一條廣告,我創立了一個小密圈。

天天會分享java基礎,組件化插件化相關,音視頻開源項目分享。最重要,帶有發佈者分析的點評。

還有最新插件化框架的分析和運用,組件化架構技巧的分享,都盡在這裏。

不須要一頓飯的價錢 ,68/一全年的學習資料。

付費是真乾貨,真正節省時間的途徑。

來到這裏但願影響你的不僅是技術提高,並且是人生的架構的導向。


已經有超過180+的小夥伴加入了咱們的行列了,而且持續增長,讓咱們一塊兒成長,羣內還有不定時福利。



一樣個人QQ羣裏也有不少大牛討論和分享,羣號是316556016。

相關文章
相關標籤/搜索