Replugin的插件架构 分成内置插件和外置插件两种。
内置插件:将apk修改成jar后,直接放入assets/plugins包下。
外置插件:可以将apk放到sd卡或者网络下载进行安装使用。
这一篇文章是关于内置插件的实战(尽量按照如下配置,否则总是有意想不到的问题)
宿主工程(配置)
第一步:项目gradle添加插件
dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }第二步:app gradle中添加配置
首先要在android{}中将buildToolsVersion版本加上
android { compileSdkVersion 26 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.malei.pluginhost" minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } }然后在android{}的后面添加如下配置:
apply plugin: 'replugin-host-gradle' repluginHostConfig { useAppCompat = true }最后在dependencies中添加依赖包
compile 'com.qihoo360.replugin:replugin-host-lib:2.2.4'
第三步:在Applicaiton进行RePluginApk进行初始化工作
public class MyApplication extends RePluginApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); // FIXME 允许接收rpRunPlugin等Gradle Task,发布时请务必关掉,以免出现问题 RePlugin.enableDebugger(base, BuildConfig.DEBUG); } // ---------- // 自定义行为 // ---------- /** * RePlugin允许提供各种“自定义”的行为,让您“无需修改源代码”,即可实现相应的功能 */ @Override protected RePluginConfig createConfig() { RePluginConfig c = new RePluginConfig(); // 允许“插件使用宿主类”。默认为“关闭” c.setUseHostClassIfNotFound(true); // FIXME RePlugin默认会对安装的外置插件进行签名校验,这里先关掉,避免调试时出现签名错误 c.setVerifySign(!BuildConfig.DEBUG); // 针对“安装失败”等情况来做进一步的事件处理 c.setEventCallbacks(new HostEventCallbacks(this)); // FIXME 若宿主为Release,则此处应加上您认为"合法"的插件的签名,例如,可以写上"宿主"自己的。 // RePlugin.addCertSignature("AAAAAAAAA"); return c; } @Override protected RePluginCallbacks createCallbacks() { return new HostCallbacks(this); } /** * 宿主针对RePlugin的自定义行为 */ private class HostCallbacks extends RePluginCallbacks { private static final String TAG = "HostCallbacks"; private HostCallbacks(Context context) { super(context); } @Override public boolean onPluginNotExistsForActivity(Context context, String plugin, Intent intent, int process) { // FIXME 当插件"没有安装"时触发此逻辑,可打开您的"下载对话框"并开始下载。 // FIXME 其中"intent"需传递到"对话框"内,这样可在下载完成后,打开这个插件的Activity if (BuildConfig.DEBUG) { Log.d(TAG, "onPluginNotExistsForActivity: Start download... p=" + plugin + "; i=" + intent); } return super.onPluginNotExistsForActivity(context, plugin, intent, process); } } private class HostEventCallbacks extends RePluginEventCallbacks { private static final String TAG = "HostEventCallbacks"; public HostEventCallbacks(Context context) { super(context); } @Override public void onInstallPluginFailed(String path, InstallResult code) { // FIXME 当插件安装失败时触发此逻辑。您可以在此处做“打点统计”,也可以针对安装失败情况做“特殊处理” // 大部分可以通过RePlugin.install的返回值来判断是否成功 if (BuildConfig.DEBUG) { Log.d(TAG, "onInstallPluginFailed: Failed! path=" + path + "; r=" + code); } super.onInstallPluginFailed(path, code); } @Override public void onStartActivityCompleted(String plugin, String activity, boolean result) { // FIXME 当打开Activity成功时触发此逻辑,可在这里做一些APM、打点统计等相关工作 super.onStartActivityCompleted(plugin, activity, result); } } }第四步:启动插件apk
this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { RePlugin.startActivity(MainActivity.this, RePlugin.createIntent("com.malei.pluginson", "com.malei.pluginson.MainActivity")); } });
插件工程(配置)
在项目gradle中添加依赖
dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }然后在app gradle 添加配置
// 这个plugin需要放在android配置之后,因为需要读取android中的配置项 apply plugin: 'replugin-plugin-gradle' repluginPluginConfig { pluginName = "son" hostApplicationId = "com.malei.pluginson" //插件包名 hostAppLauncherActivity = "com.malei.pluginhost.MainActivity" //宿主包名 }
最后添加依赖
compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.4'
完成,记着将realse版本的apk,修改成jar就可以了