Android插件化框架 RePlugin 初探

作者: QinGeneral | 来源:发表于2018-01-20 23:50 被阅读159次
    图片取自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
    无需授权即可转载,甚至无需保留以上版权声明;
    转载时请务必注明作者。

    扫码关注微信公众号

    相关文章

      网友评论

      本文标题:Android插件化框架 RePlugin 初探

      本文链接:https://www.haomeiwen.com/subject/qzyxaxtx.html