一、集成步骤
第 1 步:添加 RePlugin Plugin Gradle 依赖
在项目根目录的 build.gradle(注意:不是 app/build.gradle) 中添加 replugin-plugin-gradle依赖:
buildscript {
dependencies {
classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.1'
}
}
第 2 步:添加 RePlugin Plugin Library 依赖
在 app/build.gradle 中应用 replugin-plugin-gradle 插件,并添加 replugin-plugin-lib 依赖:
apply plugin: 'replugin-plugin-gradle'
repluginPluginConfig {
pluginName = "当前插件名称"
hostApplicationId = " com.jtv.replugin"
hostAppLauncherActivity = "com.jtv.replugin.MainActivity"
}
dependencies {
compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.0
}
第 3 步:在清单文件中,注册插件名称
<meta-data
android:name="com.qihoo360.plugin.name"
android:value="设置的插件名" />
Intent intent = new Intent();
第 4 步:跳转宿主中的地图页面
String longitude=
SharedPrefUtils.get(RePlugin.getHostContext(),"longitude", "");
String latitude= SharedPrefUtils.get(RePlugin.getHostContext(),"latitude", "");
intent.setComponent(new ComponentName(RePlugin.getHostContext().getPackageName(), "com.jtv.maplibrary.LocationActivity"));
intent.putExtra("latitude"," latitude);
intent.putExtra("longitude", longitude);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MainActivity.this.startActivity(intent);
二、插件使用注意事项:
1.插件中共享数据以jar的方式放在每一个插件中。
2.插件中调用宿主中的上下文:RePlugin.getHostContext()
3.SharedPrefUtils,工具类,可以获取宿中保存的信息(例如:登录成功的信息)
String userInfo = SharedPrefUtils.get(RePlugin.getHostContext(), "userInfo", "");
4.插件中声明的权限无效,所有权限声明必须放在宿主中
5.插件化无法与宿主共享v7包,若插件化要使用,必须单独引入
6.若插件中包含so文件,宿主需要有该so文件或者空包
7.插件中跳转宿主:
Intent intent = new Intent();
intent.setComponent(new ComponentName(RePlugin.getHostContext().getPackageName(), "com.qihoo360.replugin.sample.host.MainActivity"));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
MainActivity.this.startActivity(intent);
8.插件间互相跳转
Intent intent = new Intent();
intent.setComponent(new ComponentName("demo2", "com.qihoo360.replugin.sample.demo2.activity.for_result.ForResultActivity"));
MainActivity.this.startActivityForResult(intent, REQUEST_CODE_DEMO2);
9.插件安装和卸载,必须重启杀死进程,清除缓存。
插件引入规范
1:代码绝对要完全隔离;
2:是通信全部走aidl(RePlugin提供了Binder);
3:aidl接口要严格管控,每一个接口都要设计好,不能随便修改,顺序不能乱,发出去就定了;
4:插件和宿主之间的消息传递,一律用Bundle;宿主内传递,插件内传递,随便;
5:当插件和宿主直接有回调时,走本地广播(RePlugin提供了LocalBroadCast的封装,支持跨进程,也支持本进程);
6:在开发插件的时候,当独立进程来设计(即便当前是同一个进程,也有有这种意识);
7.如果你想花哨的用,就先看一下代码,熟悉整体架构,这样,遇到问题的时候,能定位解决。
优点:
1.极其灵活:主程序无需升级即可升级内部插件,外置插件放置在服务端统一管理升级,内部跳转无需再安装
2.非常稳定:Hook点仅有一处(ClassLoader),无任何Binder Hook!如此可做到其崩溃率仅为“万分之一”,并完美兼容市面上近乎所有的Android ROM
3.特性丰富:支持近乎所有在“单品”开发时的特性。包括静态Receiver、Task-Affinity坑位、自定义Theme、进程坑位、AppCompat、DataBinding等
4.易于集成:无论插件还是主程序,只需“数行”就能完成接入
缺点:
1.未知相关插件问题出现自己无法解决,查询官方若无相应的解决方案,只能挂起或者自己做规避操作,无法彻底解决
2.初次打开插件apk速度较慢,只能添加等待框,无法进一步优化
3.目前发现引入身份证识别包插件化后无法打包,未在官方文档找到答案