-
Notifications
You must be signed in to change notification settings - Fork 1.5k
自定义RePlugin
RePlugin提供了非常丰富的“自定义行为”特性。帮助您更好的在“无需修改源代码”的情况下,来使用RePlugin。
本文将分为两大部分:
- 如何自定义
- 最常见的自定义行为
RePlugin的自定义行为,全部集中在RePluginConfig类中,并写了非常详细的JavaDoc供您们参考。
推荐在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(含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);
}