Android外掛化框架 RePlugin 初探
為什麼要使用Android外掛化框架?
寫軟體時,軟體的擴充套件性至關重要。而軟體的擴充套件性跟其程式碼的解耦程度相關。解耦程度大,就是模組化強。解耦程度小,即模組化弱。
外掛化框架RePlugin,所做的就是將軟體解耦,實現了程式碼的模組化。這對軟體本身的後續開發、功能新增等,是十分有利的。大大降低了擴充套件軟體的成本,程式碼的清晰度也提高了。
RePlugin帶來的好處不止這些,它還給應用提供了“不用更新APP,直接更新、新增功能”的能力。能幫助我們以更低的使用者成本,更加快速的進行迭代。
Android外掛化框架要解決什麼問題?
從Android的FrameWork結構來看,Android外掛化都要解決基本的三個問題:
1. 資源管理,比如drawable、string等資源
2. 四大元件的生命週期,主要是activity、service元件
3. ClassLoader類載入
目前已經開源的Android外掛化框架
開源的外掛化框架:
1. Atlas(阿里 點選訪問GitHub)
2. VirtualAPK(滴滴 點選訪問GitHub)
3. RePlugin(360 點選訪問GitHub)
其中,Atlas主要概念是元件化。RePlugin的優點是隻hook了一處——ClassLoader。所以穩定性極強,適配十分簡單。
RePlugin 兩個主要概念
RePlugin分為宿主和外掛的概念。一個APP由 1個宿主 + n個外掛組成。宿主的主要功能是管理外掛的安裝、解除安裝、更新;外掛許可權管理等等(當然也可以將管理功能作為一個外掛)。那APP下的每一個模組就可以對應一個外掛。當你需要新增功能、更新功能的時候,直接把新的外掛或更新後的外掛釋出到線上即可。
RePlugin 宿主配置教程
新增 RePlugin Host Gradle 依賴
在專案根目錄的 build.gradle中新增 replugin-host-gradle 依賴:
buildscript { dependencies { classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.1' ... } }
新增 RePlugin Host Library 依賴
在 app/build.gradle 中應用 replugin-host-gradle 外掛,並新增 replugin-host-lib 依賴:
android { // 要配置applicationId defaultConfig { applicationId "com.qihoo360.replugin.sample.host" ... } ... } // apply語句必須放置到android標籤之後,以讀取applicationId屬性 apply plugin: 'replugin-host-gradle' dependencies { compile 'com.qihoo360.replugin:replugin-host-lib:2.2.1' ... }
配置 Application 類
讓工程的 Application 直接繼承自 RePluginApplication。
public class MainApplication extends RePluginApplication { }
在AndroidManifest中配置這個Application。
<application android:name=".MainApplication" ... />
只需三步就把RePlugin的宿主配置好了,之後即可在宿主的程式碼中呼叫RePlugin相關api,啟動、管理外掛。
注:如果外掛需要使用宿主的依賴庫,需要在宿主的Application類中加入以下程式碼把”外掛使用宿主類”選項開啟,預設是關閉
rePluginConfig.setUseHostClassIfNotFound(true);
RePlugin 外掛配置教程
專案根目錄的build.gradle,新增以下程式碼
buildscript { dependencies { classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.1' ... } }
在app/build.gradle中,新增以下程式碼
apply plugin: 'replugin-plugin-gradle' dependencies { implementation 'com.qihoo360.replugin:replugin-plugin-lib:2.2.1' ... }
兩步即可將外掛配置好。編寫外掛程式碼之後,將外掛工程匯出apk,改名為 [PluginName].jar 放到宿主工程的assets/plugins資料夾,啟動APP即可。
注:
配置外掛別名時,在外掛的AndroidManifest.xml中,新增以下內容即可(和activity標籤並列)
<meta-data android:name="com.qihoo360.plugin.name" android:value="[你的外掛別名]" />
外掛的版本號即app/build.gradle中配置的 versionCode
- 更新外掛時迭代外掛版本號,重啟應用,框架會自動過載、更新外掛(RePlugin是這樣設計的,但是有bug,解決方法見下,新版本的RePlugin已解決此bug但未釋出,可自行去官網下載編譯)
- 當前版本的RePlugin框架的bug:更新外掛後,重啟應用不會自動載入外掛。要解決這個bug,需要在APP關閉時,同時將:GuardService程序(這是外掛管理程序,預設啟動)關閉即可。
- compileOnly(provide) : 庫只用於編譯期,不會打入apk中;implement(compile) : 會打入apk中。在外掛使用宿主的依賴庫時,只需使用compileOnly即可,可以減小包的體積
版權宣告
本文首發自簡書:搜尋作者 QinGeneral
無需授權即可轉載,甚至無需保留以上版權宣告;
轉載時請務必註明作者。