天天看点

android插件化框架-Replugin

Replugin是360开源的一款插件化框架,同样过多的资料就不在这展现了,github上有最完整的官网介绍。

github地址:https://github.com/DroidPluginTeam/DroidPlugin

宿主接入工作

project的gradle中加入:

classpath'com.qihoo360.replugin:replugin-host-gradle:2.2.1'

app的gradle中加入:

apply plugin: 'replugin-host-gradle'

repluginHostConfig {
    /**
     * 是否使用 AppCompat 库
     * 不需要个性化配置时,无需添加
     */
    useAppCompat = true
//    /**
//     * 背景不透明的坑的数量
//     * 不需要个性化配置时,无需添加
//     */
//    countNotTranslucentStandard = 6
//    countNotTranslucentSingleTop = 2
//    countNotTranslucentSingleTask = 3
//    countNotTranslucentSingleInstance = 2
}

dependencies {
    ...
    compile 'com.qihoo360.replugin:replugin-host-lib:2.2.1'
}      

新建application继承RepluginApplication,并在Mainfest中加入。

或者重写Application的生命周期

public class MyApplication extends Application {

   public static int a = 1;


      @Override
   protected void attachBaseContext(Context base) {
      super.attachBaseContext(base);

      RePlugin.App.attachBaseContext(this);
   }

   @Override
   public void onCreate() {
      super.onCreate();
      RePlugin.getConfig().setUseHostClassIfNotFound(true);
      RePlugin.App.onCreate();

      RePlugin.enableDebugger(this, BuildConfig.DEBUG);
//    RePlugin.getConfig().setUseHostClassIfNotFound(true);
   }

   @Override
   public void onLowMemory() {
      super.onLowMemory();

        /* Not need to be called if your application's minSdkVersion > = 14 */
      RePlugin.App.onLowMemory();
   }

   @Override
   public void onTrimMemory(int level) {
      super.onTrimMemory(level);

        /* Not need to be called if your application's minSdkVersion > = 14 */
      RePlugin.App.onTrimMemory(level);
   }

   @Override
   public void onConfigurationChanged(Configuration config) {
      super.onConfigurationChanged(config);

        /* Not need to be called if your application's minSdkVersion > = 14 */
      RePlugin.App.onConfigurationChanged(config);
   }
}      

安装插件:

360的插件有两种安装方式,一种是内置插件,一种是外置插件。 插件的生成方法会在下面说明,这里只说明宿主的接入工作。

内置插件:

插件的格式从apk重命名为jar,在android的assets目录下新建目录plugins,然后将以jar结尾的插件放入里面即可。 内置插件是app宿主会自动安装的,不需要用户去主动调用方法安装插件。

android插件化框架-Replugin

外置插件:

外置插件是以apk的形式存在,我们放入sd卡或者从网络下载即可。 安装和卸载外置插件的方法是:

RePlugin.uninstall("plugin");
RePlugin.install(Environment.getExternalStorageDirectory().getAbsolutePath() + "/plugin.apk");      

宿主与外置插件的交互:

Intent intent = RePlugin.createIntent("插件名", "要跳转的activity的包名+名字");
RePlugin.startActivity(this, intent);
//或者
RePlugin.startActivity(v.getContext(), new Intent(), "com.jumu.application",
   "com.jumu.activity.LoginActivity");      

插件的开发

插件的开发和正常app是一样的,只需要多做以下步骤: 在project的gradle中加入

classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.1'      

app中 gradle加入

apply plugin: 'replugin-plugin-gradle'

repluginPluginConfig {
    pluginName = "plugin_outer"
    hostApplicationId = "com.xiaoqi.replugindemo"
    hostAppLauncherActivity = "com.xiaoqi.replugindemo.MainActivity"
}

dependencies {
    compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.1'
    ....
}      

这样其实就已经完成了插件的制作,只需生成apk即可。

插件与宿主的交互

通过反射,例如:

private void initView() {
   mTv = (TextView) findViewById(R.id.tv);
   Class<Context> contextClass = (Class<Context>) RePlugin.getHostContext().getApplicationContext().getClass();
   try {
      Field field = contextClass.getField("a");
      int a = field.getInt(RePlugin.getHostContext().getApplicationContext());
      mTv.setText("" + a);
   } catch (NoSuchFieldException e) {
      e.printStackTrace();
   } catch (IllegalAccessException e) {
      e.printStackTrace();
   }
}      

注意点:

1、与virtualapk不同的是,360的插件是可以独立安装的 2、跳转方式不能直接使用startActivity 3、插件的资源名不像virtualapk,可以重名

demo宿主地址:https://github.com/xiaoqiAndroid/RePluginDemo 插件地址: https://github.com/xiaoqiAndroid/Plugin