Shadow icon indicating copy to clipboard operation
Shadow copied to clipboard

none dynamic dependsOn 配置问题

Open fanshidong1993 opened this issue 3 years ago • 3 comments

java.lang.IllegalStateException: 重复添加Component:ComponentInfo{com.hzl.newzerohelper/androidx.room.MultiInstanceInvalidationService}

a插件使用了jetpack中的room b插件也使用了jetpack中的room 先后加载会抛这个异常。 这个service 我没有注册过 数据库也要单独做一个插件吗?所有插件都依赖数据库插件?

是的。这个SDK被打包进了两个插件。而每个插件都是宿主代码的一部分。所以它们重复了。

场景是 一个 app + 若干插件, 基于none dynamic 的例子 有一个 db 插件 需要其他插件dependsOn

在初始化InstalledApk 之前 会序列化一个 LoadParameters 在这个LoadParameters初始化的时候 配置好 dependsOn 就可以了吗? dependsOn 的是 db插件的 partKey

app 本身也有 room, 理论上 也存在这个androidx.room.MultiInstanceInvalidationService, 会冲突吗? 我要把app 本身的 room 也放到 db插件中吗, none dynamic app的本身 怎么dependsOn db插件?

fanshidong1993 avatar Feb 09 '22 03:02 fanshidong1993

要先搞清楚dependsOn到底是什么,它其实就是指定各个插件ClassLoader的parent关系。按照一般双亲委派逻辑一个插件可以加载另一个插件的类。代码在这里: https://github.com/Tencent/Shadow/blob/9bb0188a5ab1067ac57ef8268fbaa493563462da/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/blocs/LoadApkBloc.kt#L60-L93

你的这个场景抽象的来说是,宿主和多个插件都依赖了一个带有Service的SDK。

宿主和多个插件依赖相同的SDK,将SDK重复打包在3个apk中是很不划算的。因此最简单的做法是宿主打包这个SDK,插件通过访问宿主类的白名单(hostWhiteList)配置直接加载宿主中的SDK类,在编译期compileOnly方式依赖。如果SDK想打包在插件apk中,宿主访问SDK则需要进行依赖注入,也需要配置白名单。

SDK中包含Service是有一点特殊性的。

  • 如果Service在插件中,插件中的代码访问Service是被Shadow Transform自动处理过的。但是宿主中的代码需要通过PluginLoader#bindPluginService方法使用。我对Room这个SDK不太熟悉,大概看了一下,MultiInstanceInvalidationService应该是SDK内部自己使用的,业务代码好像不用与它交互。因此SDK如果在宿主apk中打包,它的代码肯定是不会使用PluginLoader#bindPluginService方法的。
  • 如果Service在宿主中,对于插件中的代码来说使用这个Service就没什么特殊性了,可以正常使用。

这个场景稍微有些复杂,如果一时搞不定,建议在sample的基础上自己写一个这样带有Service的Lib,尝试复现问题,我们可以一起交流一下代码。

shifujun avatar Feb 09 '22 06:02 shifujun

https://github.com/fanshidong1993/Shadow.git 最近的2次提交 最后一次:

cannot find implementation for com.hzl.none_dynamic_room_plugin1.BDatabase. BDatabase_Impl does not exist 
根据大牛的回复,宿主依赖 room,插件 compileOnly。但是room 会找不到 实现类,原因还没搞明白,大牛有兴趣可以看看。

最后第二次

 重复添加Component:ComponentInfo{com.tencent.shadow.test.hostapp/androidx.room.MultiInstanceInvalidationService} 

复现了上面描述的情况

fanshidong1993 avatar Feb 09 '22 10:02 fanshidong1993

https://github.com/fanshidong1993/Shadow.git 最新的提交 提取 使用 room 的相关业务代码

提取了插件的 room 相关的代码,做了个lib 给其他插件 dependsOn 宿主也是用了 room, 建了个数据库

可以从App Inspection 观察到 插件、宿主的数据库均正常,没有发生冲突。

应该算是解决了

fanshidong1993 avatar Feb 10 '22 03:02 fanshidong1993