360插件Replugin踩坑之路

接入比較簡單,只需按官方給出的文檔即可

宿主接入指南

插件接入指南

文檔都非常詳細,在這我要說的是一些文檔上面沒有涉及到,接入過程中比較容易出錯的地方

首先插件分為外置插件和內(nèi)置插件

外置插件


外置插件是指可通過“下載”、“放入SD卡”等方式來安裝并運行的插件。
以下是“外置插件”的管理方案。

安裝插件

要安裝一個插件,只需使用 RePlugin.install 方法,傳遞一個“APK路徑”即可。

RePlugin.install("/sdcard/exam.apk");

注意

  • 無論安裝還是升級,都會將“源文件“移動”(而非復制)到插件的安裝路徑(如app_p_a)上,這樣可大幅度節(jié)省安裝和升級時間,但顯然的,“源文件”也就會消失

若想改變這個行為,您可以參考RePluginConfig中的 setMoveFileWhenInstalling() 方法

升級插件和此等同,故不再贅述

升級插件

為了簡化操作,升級插件的做法和“安裝”是一樣的,仍可以直接調用 RePlugin.install 方法。

RePlugin.install("/sdcard/exam_new.apk");

注意

  • 如果插件正在運行,則不會立即升級,而是“緩存”起來。直到所有“正在使用插件”的進程 結束并重啟后才會生效
  • 升級可能會占用“內(nèi)部存儲空間”(因為要釋放新的APK)
  • 不支持“插件降級”,但可以“同版本覆蓋”(在 RePlugin 2.1.5版本中開始支持)

卸載插件

要卸載插件,則需要使用 RePlugin.uninstall 方法。只需傳遞一個“插件名”即可。

RePlugin.uninstall("exam");

下載插件可能還有點問題,就是卸載之后assets里的jar文件還在,導致插件還能運行,他們說正在修復

注意

  • 如果插件正在運行,則不會立即卸載插件,而是將卸載訴求記錄下來。直到所有“正在使用 插件”的進程結束并重啟后才會生效
  • 由于內(nèi)置插件是捆在主程序包內(nèi)的,故無法卸載“內(nèi)置插件”(此處有優(yōu)化空間,我們還在商量對策)

上面是官方給出的一些內(nèi)容,我在使用的時候發(fā)現(xiàn)了很多問題,比如gradle版本不能太高

classpath 'com.android.tools.build:gradle:2.1.3'

還有就在application中忽略簽名設置,因為是開發(fā)環(huán)境都是debug版

@override

protected void attachBaseContext(Context base) {

super.attachBaseContext(base);

//-------------- 開發(fā)的時候不驗證簽名 -----------

RePluginConfig config = newRePluginConfig();

config.setVerifySign(!BuildConfig.DEBUG);

RePlugin.App.attachBaseContext(this, config);

// ========================

}

還有就是安裝外置apk之后外置apk就刪除了,這時候再安裝就會導致返回的plugininfo為空,所以你安裝之前判斷一下APK是否存在。

File externalStorageDirectory = Environment.getExternalStorageDirectory();

String path = externalStorageDirectory.toString() +"/RepluginTest/plugin01.apk";

if(fileIsExists(path)) {

Log.i(TAG,"存在:"+ path);

} else {

showToast("外置插件不存在");return;

}

PluginInfo pi = RePlugin.install(path);

if(pi !=null) {

showToast("插件的描述信息:"+ pi.toString());

booleanpreload = RePlugin.preload(pi);

showToast("預加載插件:"+ preload);

}else{

showToast("插件的描述信息Null");

}

內(nèi)置插件


內(nèi)置插件是指可以“隨著主程序發(fā)版”而下發(fā)的插件,通常這個插件會放到主程序的Assets目錄下。

針對內(nèi)置插件而言,開發(fā)者可無需調用安裝方法,由RePlugin來“按需安裝”。

“內(nèi)置插件”是可以被“升級”的。升級后的插件等同于“外置插件”

添加內(nèi)置插件

添加一個內(nèi)置插件是非常簡單的,甚至可以“無需任何Java代碼”。只需兩步即可:

  • 將APK改名為:[插件名].jar

  • 放入主程序的assets/plugins目錄

這樣,當編譯主程序時,我們的“動態(tài)編譯方案”會自動在assets目錄下生成一個名叫“plugins-builtin.json”文件,記錄了其內(nèi)置插件的主要信息,方便運行時直接獲取。

必須改成“[插件名].jar”后,才能被RePlugin-Host-Gradle識別,進而成為“內(nèi)置插件”。

[插件名]可以是“包名”,也可以是“插件別名”。

有關這方面的說明,請點擊此處閱讀《插件的信息》中“插件命名”一節(jié)。

刪除內(nèi)置插件

刪除內(nèi)置插件非常簡單,直接移除相應的Jar文件,其余均交給RePlugin來自動化完成。

注意:若用戶已使用了內(nèi)置插件,則即便用戶升級主程序,其包內(nèi)已不帶這個內(nèi)置插件,但用戶仍可繼續(xù)使用它
這樣可防止出現(xiàn)“用戶升級主程序后,發(fā)現(xiàn)內(nèi)置插件突然用不了”的情況。

使用內(nèi)置插件的時機

不同于“外置插件”需要先調用 RePlugin.install 方法后才能使用,內(nèi)置插件可無需調用此方法。而一旦插件被使用,則RePlugin會在觸發(fā)相應邏輯前,為您做下列操作:

  • 將內(nèi)置插件釋放到數(shù)據(jù)目錄下(近似于調用install方法)
  • 若需要加載Dex,則還會釋放“優(yōu)化后的Dex”到數(shù)據(jù)目錄下,這可能會需要一些時間

這樣做的好處是,不會占用太多的“內(nèi)部存儲空間”,畢竟不是所有內(nèi)置插件,都一定會被用到。

內(nèi)置插件的升級

內(nèi)置插件的升級分為兩種情況:主程序隨包升級、通過install方法升級

  • 主程序隨包升級:當用戶升級了帶“新版本內(nèi)置插件”的主程序時,則RePlugin會在使用插件前先做升級

  • 通過install方法升級:若通過 RePlugin.install 方法做的升級(大多為用戶從服務器上下載并更新),則RePlugin在調用install方法時開始做升級。當然,其規(guī)則仍遵循安裝插件的規(guī)則,例如“插件運行時先不覆蓋”等。

值得注意的是,無論采用何種方式,均“不支持降級”,但支持“同版本覆蓋”升級,也即:

  • 內(nèi)置插件:只要APK的時間戳和大小發(fā)生變化就升級,若兩者均無變化,則不會升級。(在 RePlugin 2.1.5版本中開始支持)

  • 外置插件:只要調用 RePlugin.install 方法即可將“內(nèi)置插件”轉化為“外置插件”。同樣的,需遵循安裝插件規(guī)則。

這里要說比較重要的2點

1 . 無論外置插件,還是內(nèi)置插件都要在清單文件上注冊版本號和名字,名字可以用來跳轉的時候使用,而且上文說到卸載插件的時候可以傳遞一個名字就是這個名字,插件每一次更新都要增加,

android:name="com.qihoo360.plugin.name"

android:value="zhy"/>

android:name="com.qihoo360.plugin.version.ver"

android:value="100"/>

2 . 第二點比較重要,也是使用的時候一致困擾我的,就是在使用內(nèi)置插件形式的時候,要在asstes文件夾下,新建一個plugins文件用來放我們的插件文件(xxx.jar),這樣沒有問題,但是之前把官方demo下載并run的時候發(fā)現(xiàn)這樣只能在內(nèi)置的時候使用,外置不可以,幾經(jīng)磨難啊,發(fā)現(xiàn)在外置插件的時候要把plugins文件名改為replugin_plns,因為如果這個文件名不對會導致Plugins-builtin.json錯誤,

當編譯主程序時,我們的“動態(tài)編譯方案”會自動在Assets目錄下生成一個名叫“Plugins-builtin.json”文件,所以文件名不對導致了json的錯誤

總的來說Replugin插件花方案使用比較簡單,支持功能比較多。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容