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

Cang_Wang發表於2017-07-10

大家好,我係蒼王。

以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。

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


多謝一直以來的支援,元件化的內容,應該會有一段時間不再更新,一些非常關鍵的技術將會在我將要出版的元件化書籍中提及。

元件化模組化的開發適合於中小型企業的業務疊加,和程式碼重用。而外掛化的開發將元件化和模組的功能完全解耦出來。

在國內的開發環境,外掛化是使用者體驗和開發週期的產物,我們要做的是順應潮流,正如我元件化&模組化&外掛化演進中分析一樣。

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

這裡我將挑選了一下Replugin的技術作為接下來方向的研究,將會給大家剖析他的執行過程,希望大家不膩賜教。

將會有多個章節介紹,希望大家一起進步吧。


一.Github介紹

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

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

強大的介紹,希望大家都去看看起介紹,有個基礎的瞭解吧。

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

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

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

只有真正深切去了解過外掛化,才明白它做到的飛躍性。


二.工程佈局

下載一下原始碼,我們可以看到,其裡面包含了五個文件。

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

replugin-host-gradle 是宿主gradle指令碼

replugin-host-library 是宿主library原始碼,我們依賴的原始碼就是這個了

replugin-plugin-gradle 外掛的Gradle指令碼

replugin-plugin-library 外掛的原始碼,外掛都需要依賴這個

replugin-sample 當然就是例子啦

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

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


三.host宿主

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

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

然後原始碼中引用

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

然後我們需要在Application中配置

這裡是動態配置Application

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

然後當然就是一般關心的跳轉問題

這裡demo1是包名,然後之後的是跳轉Activity的地址

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

Replugin.startActivity是使用坑位跳轉的,坑位在哪裡宣告,下一章節會介紹。

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

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

然後還有跳轉Fragment的示例

這裡面想要載入外掛的Fragment,需要先註冊Fragment整個的包名+地址名稱。

然後還需要Replugin中的ClassLoader機制,而這裡每個dex貌似都會有一個classloader,這個之後會介紹。

這裡面loadCalss是先獲取到Fragment為Class物件,然後通過asSubClass改為Fragment.clas型別,當然newInstance就是真正的建立物件了。

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

然後我們看一下app中,安裝前需要內建外掛,將外掛(XXX.jar)放到assets裡面,將會和app一起跟隨安裝,這是作為連同宿主初始時載入某些必要外掛的內建安裝。

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

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

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

rpGenerateDebugBuiltinJson編譯出外掛的json目錄

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

rpGenerateDebugHostConfig會顯示出整個Replugin的配置

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

rpShowPluginsDebug命令是列印出外掛版本資訊。

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


rpGenerateReleaseBuitInJson、rpGenerateReleaseHostConfig、rpShowPluginsRelease編譯出Release版本的檔案


四.lib外掛

我們外掛還是一樣需要Gradle配置

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

之前提及到startActivity的方式,Replugin中在外掛內因為有ClassLoader是獨立,使用平常的startActivity的跳轉方式。而外掛間使用startActivity跳轉,需要使用Replugin.startActivity或者隱式跳轉來完成。

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

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

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

這裡需要使用遠端通訊來完成。Android一開始設計IBinder就是設計為跨程式間的通訊的,而這裡面就算外掛執行為獨立程式也是沒問題的。

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

我們再看一下AndroidManifest,宣告方式和平常的Android工程並無不同

值得注意的是,AndroidManifest通過meta-data來宣告的。

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

然後看一下Lib中載入的額外的Gradle命令

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

執行reInstallPluginDebug來執行安裝,我們看到是將其放到sdk,然後再安裝

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

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

以後修復後再給大家介紹。

如何生成內建的外掛的jar檔案,直接外掛生成apk字尾改為apk,然後放到assets裡面,宿主的gradle編譯時才能識別。

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



總結

我們入門剖析Replugin。

(1)配置接入-接入成本最低,並不需要編寫一般的佔坑規則

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

(3)外掛通訊-外掛間通訊使用aidl,這樣就算外掛獨立程式依然通訊正常。

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

(5)載入方式-宿主內建jar和外接載入apk載入的方式

這些就是接入外掛化需要估量的方面,然後深化研究代價利弊才能更加深入一步步評估出適合你們專案的外掛化。

希望以後大家多多關注!下期將不會再在簡書首發哦。


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

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


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

每天會分享java基礎,元件化外掛化相關,音視訊開源專案分享。最重要,帶有釋出者分析的點評。

還有最新外掛化框架的分析和運用,元件化架構技巧的分享,都盡在這裡。

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

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

來到這裡希望影響你的不只是技術提升,而且是人生的架構的導向。

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

已經有超過180+的小夥伴加入了我們的行列了,並且持續增加,讓我們一起成長,群內還有不定時福利。

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


同樣我的QQ群裡也有很多大牛討論和分享,群號是316556016。

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


相關文章