Skip to content

自定义RePlugin

Jiongxuan Zhang edited this page Jul 14, 2017 · 4 revisions

RePlugin提供了非常丰富的“自定义行为”特性。帮助您更好的在“无需修改源代码”的情况下,来使用RePlugin。

本文将分为两大部分:

  • 如何自定义
  • 最常见的自定义行为

如何自定义?

RePlugin的自定义行为,全部集中在RePluginConfig类中,并写了非常详细的JavaDoc供您们参考。

设置Config

推荐在RePluginApplication中覆写createConfig方法,如下:

public class SampleApplication extends RePluginApplication {
    @Override
    protected RePluginConfig createConfig() {
        RePluginConfig c = new RePluginConfig();
        ...
        return c;
    }

如果您是“非继承式”,则需要在调用 RePlugin.App.attachBaseContext() 的地方,传递RePluginConfig即可。具体做法如下:

RePluginConfig c = new RePluginConfig();
...
RePlugin.App.attachBaseContext(context, c);

注意:RePluginConfig中的东西是“只允许写一次的”。一旦在上述两个地方设置了RePluginConfig之后,则其内变量不允许再修改,其表现为调用所有set方法均失效,提示“rpc.cam: do not modify”错误。

设置Callbacks

Callbacks(含EventCallbacks)都存在RePluginConfig内,设置方法:

  • RePluginConfig.setCallbacks()
  • RePluginConfig.setEventCallbacks()

除此之外,针对RePluginCallbacks,我们还提供了一套更便捷的设置方式,同样,可以继承RePluginApplication中的createCallbacks方法,并让其继承RePluginCallbacks,如下:

public class SampleApplication extends RePluginApplication {
    @Override
    protected RePluginCallbacks createCallbacks() {
        return new HostCallbacks(this);
    }
    
    private class HostCallbacks extends RePluginCallbacks {
        private HostCallbacks(Context context) {
            super(context);
        }
        ...
    }
}

只需createCallbacks即可,无需配置RePluginConfig,其RePluginApplication类内部会做相应的处理。

常见的自定义行为

以下是您们经常用到的常见自定义行为,在Sample的Host中已经都体现了,大家欢迎参考。

除了这些常见自定义行为外,RePlugin还提供了大量的方法帮助您设置。具体可参见以下类的JavaDoc帮助:

  • RePluginConfig
  • RePluginCallbacks
  • RePluginEventCalbacks
  • RePlugin

在插件不存在时,提示下载

通过覆写 RePluginCallbacks.onPluginNotExistsForActivity() 方法,当插件"没有安装"时触发此逻辑,可打开您的"下载对话框"并开始下载。其中"intent"需传递到"对话框"内,这样可在下载完成后,打开这个插件的Activity。

@Override
public boolean onPluginNotExistsForActivity(Context context, String plugin, Intent intent, int process) {
    ...
    return super.onPluginNotExistsForActivity(context, plugin, intent, process);
}

开启“插件类不存在时读取宿主”功能

RePlugin默认不鼓励大家使用此功能(具体原因参见FAQ的说明)。但由于此类需求相对较多(包括360手机助手在内)。我们研究出一套“稳定的”插件与宿主共享类方案,插件可“无缝”使用宿主类,且没有Hook,无需改变父子类加载器关系。

具体做法很简单,调用RePluginConfig.setUseHostClassIfNotFound(true)即可。如不调用,则默认不支持此功能,这样更稳定。

开启/关闭“签名校验”功能

有关“签名校验”的具体信息,请点击此处阅读《插件的管理》中“安全与签名校验”一节。其开关在RePluginConfig.setVerifySign()中。

针对打点统计数据,或特殊事件的处理

RePluginEventCallbacks就是为此需求而设计。请详见JavaDoc以及Sample中所述,这里只展示最常用的“插件安装失败”的示例。

@Override
public void onInstallPluginFailed(String path, InstallResult code) {
    QDasStats.reportFail(xxx);
    super.onInstallPluginFailed(path, code);
}