具体的技术文档可以直接搜索360RePlugin官方技术文档,本文只解决问题
问题一:
classpath 'com.android.tools.build:gradle:3.1.4'
和官方文档一样配置的,但是使用的是外部插件加载也就是说我们把插件plugin下载到sdcard,然后在RePlugin.intsall("xxx")
但是发现加载成功了,然后
PluginInfo pi = RePlugin.install(fileName);
这里我说明下repload最好使用线程,不然直接嗝屁。
if (pi != null) { new Thread(new Runnable() { @Override public void run() { boolean preload = RePlugin.preload(pi); Message msg = new Message(); msg.what = 100; msg.obj = preload; handler.sendMessage(msg); } }).start(); } else { Toast.makeText(getApplicationContext(), "插件的描述信息Null", Toast.LENGTH_SHORT).show(); }
也没有问题,但是就是无法调用。我们看logcat会发现一具报错:plugininfo == null 或者叫 plugin == null
这个时候的解决办法是在app.gradle
repluginHostConfig { useAppCompat = true persistentEnable = false }
主要是这一句话 persistentEnable = false
然后这是我的调用方法是
Intent i = RePlugin.createIntent("mobWork", "xxxxxxxxx.login.LoginActivity"); i.putExtra("token",token); RePlugin.startActivity(getActivity(), i);
就成功了,大家注意这里的第一个参数mobWork是插件中配置的PluginName 反正我在android.support.v7工程中没什么问题。后面有一个巨大的坑就是AndroidX化后,必须要使用包名,别名和插件中定义的插件名称都是不行的。
接下来我们来说一下360RePlugin AndroidX化,大家都知道360RePlugin的gralde的上线是3.1.4 但是AndroidX的最低要求是3.2.0
所以可以看出来360目前为止在官方技术文档是没有对AndroidX进行支持的,但是他的分支有非正式的方案:
https://github.com/froyohuang/RePlugin-AndroidX
至于工程如何AndroidX化就不需要我多说了吧,AndroidStudio自己有工具,如果有第三方的jar,aar,so等都是可以使用jetifier工具的命令行来转换的,也可以反向,自己去查就可以了。接下里当所有的都配置好以后,发现调用的时候没用,日志中弹出的错误是 isNeedToDownload(): V5 file not exists. Plugin = xxx 是不是很炸裂,原理我没去自己研究,但是我直接给方案吧,就是调用的时候直接给包名即可
Intent i = RePlugin.createIntent("com.xxx.xxx", "com.xxx.xxx.moduleImp.login.LoginActivity"); i.putExtra("token",token); RePlugin.startActivity(getActivity(), i);
相关知识点和坑 Linux的守护进程机制,目前存在的问题如果去去除persistentEnable = false这句话,貌似启动的时候会崩溃,我还需要研究。
我再提一下内置插件,很简单,把给你的apk插件包,改为.jar然后直接在assets文件夹下建立plugins目录,放进去就ok了
new Thread(new Runnable() { @Override public void run() { boolean preload = RePlugin.preload(pi); Message msg = new Message(); msg.what = 100; msg.obj = preload; handler.sendMessage(msg); } }).start();
Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 100: boolean isPreload = (boolean) msg.obj; if (isPreload) { showToastshort("插件预加载成功"); } else { showToastshort("插件预加载失败"); } break; } } };
直接ok,很简单,但是就不好更新。360官网的擦肩管理的大小限制为5M,我也是笑了,大家还是自己写下载的方法吧,我使用的是
DownloadManager+广播机制下载进度直接通知状态来.