最近项目需求,需要将公司里面多个APP都融合在一起,所以来试试360插件框架,
先贴源码和wiki连接 https://github.com/Qihoo360/RePlugin/blob/dev/README_CN.md
按照wiki上面的接入说明,很快,自己编写的Demo就能能运行了。想着也挺简单的。
于是开始接入项目,问题接踵而至!
1.如何适配Androidx
官网给的接入版本如下
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.4'
compile 'com.qihoo360.replugin:replugin-host-lib:2.2.4'
classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.4'
compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.4'
只能支持 AndroidGradle 插件版本 2.3.3 的,根本没法达到 Androidx 需要的 AndroidGradle 插件版本 3.2.0 的最低要求。
好在源码下载下来后看到,Relpugin 的版本已经更新至 2.3.4 了,尝试了更新版本,然后将 AndroidGradle 插件版本升级 3.5.3
妥了,可以编译,可以运行了,开心。
刚点开项目,报错了
Caused by: java.lang.IllegalStateException: This app has been built with an incorrect configuration. Please configure your build for VectorDrawableCompat.
百度一波, 都是让我把 AndroidGradle 插件版本升级到 2.0 以上,可是我的已经是 3.5.3 了,不明觉厉,还有说在 build.gradle 中加入
defaultConfig {
vectorDrawables.useSupportLibrary = true
...
}
不好使,没办法,降低 AndroidGradle 插件版本到 3.2.0 满足 Androidx 最低要求。编起来,等待中,报错,接下来第二个问题。
2.插件项目需要支持Java8
AndroidGradle 插件版本到降到 3.2.0 后,编译报错如下:
error processing F:\plugin_space\Plugin2\app\build\intermediates\transforms\___ReClass___\debug\7.jar
java.lang.RuntimeException
at org.objectweb.asm.ClassVisitor.visitModule(ClassVisitor.java:148)
at org.objectweb.asm.ClassReader.readModule(ClassReader.java:731)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:632)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:500)
at com.android.builder.desugaring.DesugaringClassAnalyzer.analyze(DesugaringClassAnalyzer.java:144)
at com.android.builder.desugaring.DesugaringClassAnalyzer.analyzeJar(DesugaringClassAnalyzer.java:92)
at com.android.builder.desugaring.DesugaringClassAnalyzer.analyze(DesugaringClassAnalyzer.java:63)
at com.android.build.gradle.internal.transforms.DesugarIncrementalTransformHelper.lambda$getInitalGraphData$4(DesugarIncrementalTransformHelper.java:150)
at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
莫名其妙的错,感觉不妙,像是在打包 jar 时候的错,进入知识盲区,百度也不好使了,正在慌乱之际,灵光一现,AndroidGradle 插件版本 3.5.3 的时候编译通过了,只是运行有问题,那我找个中间版本的试试,于是将 AndroidGradle 插件版本改为 3.4.0
classpath 'com.android.tools.build:gradle:3.4.0'
编译......,通过了,开心,放到宿主,安装运行....跑起来了,开心坏了。
接下来就是一些代码上调试的问题,比如
Q: 插件注册的静态广播在插件未启动的时候无法接收
A:发送广播之前调用下面代码,将插件Manifest先解析出来,静态广播就能收到了
RePlugin.fetchComponentList(P_Constants.ALIAS_PLUGIN_1);
Q:插件如何打断点,如何调试
A:在插件代码端的Studio,点击调试按钮,弹出的对话框中选择 show all processes,找到自己的进程打上断点。
Q:插件里面获取Context的方式
A:在插件中,PluginApplication.getContext(),getApplicationContext(),RePlugin.getPluginContext(),getApplication(),RePlugin.getHostContext() 都有所不一样
以下是对应的对象地址,所以在插件中如果要使用 Context,需要注意使用的对象。
2020-08-06 16:26:57.637 14270-14270/com.optima.ww_host D/WMA-WMA-PLUGIN: PluginApplication.getContext() = com.optima.ww_plugin.PluginApplication@d6c4fad
2020-08-06 16:26:57.637 14270-14270/com.optima.ww_host D/WMA-WMA-PLUGIN: getApplicationContext() = com.optima.ww_plugin.PluginApplication@d6c4fad
2020-08-06 16:26:57.637 14270-14270/com.optima.ww_host D/WMA-WMA-PLUGIN: RePlugin.getPluginContext() = com.qihoo360.loader2.PluginContext@21b3291
2020-08-06 16:26:57.637 14270-14270/com.optima.ww_host D/WMA-WMA-PLUGIN: getApplication() = com.optima.ww_host.MainApplication@1709404
2020-08-06 16:26:57.637 14270-14270/com.optima.ww_host D/WMA-WMA-PLUGIN: RePlugin.getHostContext() = com.optima.ww_host.MainApplication@1709404
接下来上传我的 Demo 地址吧
宿主:https://github.com/IamMusicBoom/Host
插件1:https://github.com/IamMusicBoom/Plugin1