1. 程式人生 > >RePlugin 外掛管理與許可權管理

RePlugin 外掛管理與許可權管理

圖片取自Zoommy

外掛化能夠提高我們程式的拓展能力,提高靈活性。Android中比較有特點的一個外掛化框架是RePlugin。

RePlugin分為宿主和外掛的概念。一個APP由 1個宿主 + n個外掛組成。宿主的主要功能是管理外掛的安裝、解除安裝、更新;外掛許可權管理等等(當然也可以將管理功能作為一個外掛)。那APP下的每一個模組就可以對應一個外掛。當你需要新增功能、更新功能的時候,直接把新的外掛或更新後的外掛釋出到線上即可。

外掛入門教程請 點選檢視。

本文包括以下內容:

  • 外掛安裝、更新、解除安裝
  • 線上外掛:伺服器管理外掛資訊
  • 外掛許可權管理

1. 外掛安裝、更新、解除安裝

外掛的基礎操作包括外掛的安裝、更新、解除安裝等,RePlugin不支援外掛的降級。RePlugin對此進行了很好的封裝,僅需呼叫以下程式碼。

RePlugin中的外掛分為外接外掛和內建外掛。內建外掛即隨應用安裝包(宿主)附帶的、在工程app/src/main/assets/plugins資料夾中的外掛,內建外掛的名稱格式為[外掛名].jar,檔名即為程式中的外掛名。外接外掛即應用執行時從sdcard安裝的外掛。另外,內建外掛更新後也會變成外接外掛。

安裝與升級

外掛的安裝與升級是呼叫同一程式碼即可。如果外掛正在執行,則不會立即升級,而是“快取”起來。直到所有“正在執行外掛”的程序結束並重啟APP後才會生效。

RePlugin.install("sdcard路徑");

另外可以在外掛安裝之後加入以下程式碼,提前釋放外掛的檔案,提高外掛的啟動速度。因為在外掛安裝更新之後,不做任何操作,第一次啟動會很慢。

PluginInfo pluginInfo = RePlugin.install("外掛sdcard路徑");

if (pluginInfo != null) {
    RePlugin.preload(pluginInfo);
}
解除安裝

要解除安裝外掛,則需要使用 RePlugin.uninstall方法。只需傳遞一個“外掛名”即可。

RePlugin.uninstall
("pluginName");
啟動

呼叫以下程式碼啟動外掛中的Activity

RePlugin.startActivity()

建議在使用者第一次啟動應用時,主動對所有的內建外掛呼叫 preload 方法,並在介面顯示處理進度。否則,使用者每當第一次開啟應用中的外掛時,框架會先解壓外掛,耗時比較長

2. 線上外掛

為了讓應用真正擁有靈活更新其功能的能力,就需要把一些外掛放到伺服器上,按需下載、安裝外掛。

伺服器端就不再詳說,主要是可以檢視外掛列表,下載外掛,外掛許可權管理等功能。下載功能的簡單實現可以參考部落格 Tomcat檔案下載伺服器

主要說一下伺服器外掛資訊的資料結構,當然不同的需求有不同的結構。

[{
    "showName": "外掛展示給使用者的名字",
    "realName": "程式中的外掛名",  
    "isBuiltIn": "是否內建",
    "updateInfo": "更新資訊",
    "iconTypeAndName": "外掛圖示名字mipmap/ic_launcher",
    "version": "外掛版本號",
    "host2PluginActivities": [
      {
        "name": "外掛中可以被啟動的activity"
      }
    ]
},
...
]

3. 外掛許可權管理

當一個應用需要對不同使用者控制其許可權時,就要在伺服器端對外掛的許可權進行管理。比如說公司內部軟體需要對不同角色的人員給與不同的功能,限制其對其他部門功能的使用。

簡單描述一下外掛的許可權管理功能。主要就是實現能夠控制不同使用者使用不同組合的外掛。

可以採用以下的關係:

角色外掛關係對應

就是說“許可權”是外掛和使用者的連線點,每個外掛擁有一個對應的許可權,一個使用者擁有多個角色,一個角色對應多個許可權。

那我們首先需要有三張表:使用者表、角色表、外掛資訊表。我對三張表的處理和說明如下

使用者表

使用者表在外掛管理中擁有欄位 repluginRole 即可,代表使用者的外掛角色。

角色表repluginRole
欄位 說明
id 角色id
roleName 角色名稱
permission 所擁有的許可權
外掛資訊表 repluginPluginInfo

這裡簡化其他欄位,只保留外掛許可權相關欄位

欄位 說明
id 使用者id
requirePermission 外掛要求的許可權
isOnline 外掛是否線上,即是否釋出

那麼去伺服器獲取某員工外掛列表的過程如下:
1. 獲取該員工的角色,repluginRole欄位
2. 通過repluginRole獲取該角色所擁有的許可權列表
3. 獲取外掛列表,用上一步的許可權列表去匹配各個外掛的許可權,如果isOnline為true(外掛已上線)且擁有外掛許可權就放入外掛列表

Tips
目前RePlugin存在bug(2.2.1版本),即安裝、更新外掛並重啟App關閉後,讀取外掛資訊出錯,無法載入剛剛更新的外掛。

解決:
1. 關閉應用時,手動殺死:GuardService程序即可。GuardService程序為RePlugin框架後臺處理外掛安裝等操作的程序。官方回覆,2.2.2版本已經修復,但還未放出此版本。
2. 在Host工程的app module對應的build.gradle中設定persistentEnable = false,使用主程序為外掛管理程序。這樣做的原理同上,在關閉APP的時候關閉框架的外掛管理程序。但是我這樣做的時候這會導致APP啟動特別慢,執行卡頓,還可能會崩潰。推薦用方法1,雖然這樣做需要去處理各種APP關閉的情況。

版權宣告
本文首發自簡書:搜尋作者 QinGeneral
無需授權即可轉載,甚至無需保留以上版權宣告;
轉載時請務必註明作者。