1. 程式人生 > >Android外掛化框架 RePlugin 初探

Android外掛化框架 RePlugin 初探

圖片取自Zoommy

為什麼要使用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 宿主配置教程
  1. 新增 RePlugin Host Gradle 依賴

    在專案根目錄的 build.gradle中新增 replugin-host-gradle 依賴:

    buildscript {
        dependencies {
            classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.1'
            ...
        }
    }
  2. 新增 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'
        ...
    }
  3. 配置 Application 類

    讓工程的 Application 直接繼承自 RePluginApplication。

    public class MainApplication extends RePluginApplication {
    
    }
    

    在AndroidManifest中配置這個Application。

     <application android:name=".MainApplication" 
        ... 
        />
    

只需三步就把RePlugin的宿主配置好了,之後即可在宿主的程式碼中呼叫RePlugin相關api,啟動、管理外掛。

注:如果外掛需要使用宿主的依賴庫,需要在宿主的Application類中加入以下程式碼把”外掛使用宿主類”選項開啟,預設是關閉

rePluginConfig.setUseHostClassIfNotFound(true);

RePlugin 外掛配置教程
  1. 專案根目錄的build.gradle,新增以下程式碼

    
    buildscript {
        dependencies {
            classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.1'
            ...
        }
    }
    
  2. 在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
無需授權即可轉載,甚至無需保留以上版權宣告;
轉載時請務必註明作者。

掃碼關注微信公眾號