天天看點

Android插件化-RePlugin項目內建與使用

前言:前一段時間新開源了一種全面插件化的方案-- RePlugin,之前一種都在關注 DroidPlugin 并且很早也在項目中試用了,但最終沒有投入到真正的生産環節,一方面是項目中沒有特别需要插件化的需求,另一方面也考慮到 DroidPlugin 不是特别穩定,Android系統每更新一次 DroidPlugin 可能就會出現一些 Bug,畢竟 Hook 了 Android 原生的太多東西,系統一旦更新引發 Bug 是在所難免的。當然,這些并不能否認 DroidPlugin 的優秀,它的原理和思路值得我們深入探究、學習,前一段時間更新過幾篇插件化的原理分析的文章(基于 DrodiPlugin 原理)學習過程中不得不歎服作者的思路和技術深度!前幾篇小白也能看懂的插件化系列文章仍然會不定期更新,但目前我們可以先來學習學習 RePlugin,畢竟多學無害,也能互相參考他們的思路,比較優缺點。

RePlugin 是一套完整的、穩定的、适合全面使用的、占坑類插件化方案:

完整的:讓插件運作起來“像單品那樣”,支援大部分特性。

穩定的:官方宣稱,其架構奔潰率“萬分之一”。

适合全面使用的:其目的是讓應用内的“所有功能皆為插件”。

占坑類:以穩定為前提的 Manifest 占坑思路。

插件化方案:基于 Android 原生 API 和語言來開發,充分利用原生特性。

(以上定義引自官方wiki)

以上代碼有三點需要注意:

需要将 apply plugin: 'replugin-host-gradle' 放在 android {...} 之後。

如果項目需要支援 AppComat,則需要将 repluginHostConfig 的 userAppCompat 置為 true。

如果應用需要個性化配置坑位數量,則需要在 repluginHostConfig 中添加以下代碼進行配置:

當然,同時不要忘了在 AndroidManifest 對 MyApplication 的相關配置。

說明:有時候由于項目原有結構的需要,我們可能不能直接使用繼承 RePluginApplication 的方式,這個問題看來 RePlugin 開發者也想到了,是以還特地多了一種選擇,下面是項目的 Application 不繼承 RePluginApplication 的方式:

建立一個工程做為插件APP,這裡為了友善起見,直接在主工程中建立了一個 Module。

RePlugin 對插件定義兩種方式一種是外置插件、一種是内置插件。

外置插件:即從網絡下載下傳或者從SD卡中獲得的,以 .apk 結尾。

内置插件:内置于 APP 之中,并随 APP 一并發版,需要将插件 apk 改成 .jar 結尾放入主程式的assets/plugins目錄。

安裝插件:

同時别忘了添加檔案讀寫的權限。 輸出日下:

安裝成功了! (更新插件也是用 install() 方法,不可降級,同本版可覆寫安裝)

啟動插件

先來看一下 RePlugin.java 中啟動插件相關的源碼:

根據 RePlugin 的 startActivity() 和 createIntent() 方法注釋中的示例可知,啟動插件需要先用插件的名字和目标Activity的全路徑建立一個 Intent,然後調用 RePlugin.startActviity() 啟動即可:

點選按鈕,輸出如下:

啟動失敗了!(插件名稱确實是:Plugin1,而不是 plugin1 )

把 ==createIntent() 方法的第一參數換成插件的包名 cn.codingblock.plugin1 ==試一試,居然可以了。

但是,注釋總不會這樣赤裸裸的坑我們吧!

解除安裝插件

點選解除安裝,輸入如下:

沒解除安裝成功?哈哈,這個簡單,原套路把參數換成包名,果然可以了:

啟動插件那裡畢竟在官方教程裡面找不到,但是 Plugin.uninstall() 方法傳入插件名即可這可是官方文檔說的,這次不會是官方文檔和源碼注釋合起夥來坑我們把? 經過多次試驗後,有個有趣的發現:對于啟動插件建立 Intent 的createIntent() 方法和 解除安裝插件的 RePlugin.uninstall() 方法,如果項目是使用繼承 RePluginApplication 方式的話,參數傳包名才生效;如果不是繼承的方式傳插件名才生效!(本人是在一款小米3手機上試驗的,由于并沒有廣泛測試,是以不保證其他手機也是這個套路)這真是奇了葩了!

解除安裝插件時有一點需要注意:如果插件正在運作,則不會立即解除安裝插件,而是将解除安裝訴求記錄下來。直到所有“正在使用插件”的程序結束并重新開機後才會生效。(引自官方說明)

添加内置插件非常簡單,首先在主工程的 assets 目錄下建立一個 plugins 檔案夾,然後将要作為插件的 apk 字尾名改成 .jar 并放入到建立的 plugins 檔案夾下,剩下的事情就不用管了,交給 RePlugin 即可,也就說,架構會自動加載插件。

内置插件無需開發者安裝,啟動方式和外置插件一緻,但不可删除。

内置插件可通過 RePlugin.install() 更新(需要先将更新包下載下傳好),更新後等同于外置插件。

初步體驗了一下發現,雖然目前有可能會有那麼一點坑需要踩一踩,在使用起來也不比 DroidPlugin 友善,需要在宿主和插件兩端都要做內建工作。但總體明顯發現,這次的插件化架構明顯比以前那些的插件化架構資料更加的全面、豐富,而且從 wiki 上發現 RePlugin 團隊充滿了很大的熱情在孜孜不倦維護、更新,并且計劃明确,哪些功能在未來會添加、哪些功能在未來會被舍棄,一目了然,讓我們更加看到了 RePlugin 美好的未來,我相信在未來的插件化領域即使 RePlugin 不能一家獨大,也必然處于一個非常重要的地位!