shifujun

Results 282 comments of shifujun

> 问题确实都是在android 12上报的,询问部分用户是在升级OS后进入插件发生,但非必现。 如果能确定同一台设备在同一个版本的系统上没法稳定复现,甚至只复现了一次。那我们也许只能大胆的猜测是不是某些odex文件在系统升级前后出现了不兼容的情况。

应该是因为'flavorDimensions flavorDevice, flavorDistrict'把plugin自动添加的Shadow Dimension给覆盖掉了。

https://github.com/Tencent/Shadow/blob/57fe9126c281d39ee5bbb350a74d486426abcd22/projects/test/gradle-plugin-agp-compat-test/stub-project/build.gradle#L50 这样写,把已存在的Dimension也添加回去就可以了。

> 还有个问题是不是我们插件的Gradle和AGP是不是也得和你们的框架的兼容 不用完全一致。可以在这里看到Shadow有自动化测试这些版本的兼容性: https://github.com/Tencent/Shadow/blob/57fe9126c281d39ee5bbb350a74d486426abcd22/projects/test/gradle-plugin-agp-compat-test/test.sh#L30-L48

> 和当前issue不相关的问题最好另外提issue。如果不需要使用WebView,可以删掉这段代码。

可以的。运行的class包含有debug信息,信息中有源码文件名和行号。只要没被Proguard去掉这个信息,正常编译的类都有。反编译可以看到它们。所以只要IDE知道源码在哪就行了,也就是一般你打开插件的源码工程就可以。因此Shadow的source sample中可以调试宿主、插件、SDK的任何一处代码。 这个问题其实和Shadow没有关系,可以自行搜索更多的资料。

支持。请注意没有代码的交流是低效的。https://github.com/Tencent/Shadow/blob/89205f6d7c59982612736cb5bf0dc5485e0d856d/CONTRIBUTING.md#issue

要先搞清楚`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,尝试复现问题,我们可以一起交流一下代码。

Android插件这个领域,有两类技术: 1. 免安装运行别人的应用,用于沙箱场景,多开场景。这种技术需要支持apk不修改就能免安装运行。 2. 免安装运行自己家的应用,用于快速启动和更新应用,利用流量入口。这种技术只需要app的源码不用大量修改就可以了。 Shadow是后一种技术。前一种技术往往需要使用非公开接口,而我们的需求又是后一种的,所以我们开发了Shadow替代了原有方案。

> > Android插件这个领域,有两类技术: > > > > 1. 免安装运行别人的应用,用于沙箱场景,多开场景。这种技术需要支持apk不修改就能免安装运行。 > > 2. 免安装运行自己家的应用,用于快速启动和更新应用,利用流量入口。这种技术只需要app的源码不用大量修改就可以了。 > > > > Shadow是后一种技术。前一种技术往往需要使用非公开接口,而我们的需求又是后一种的,所以我们开发了Shadow替代了原有方案。 > > 大大,如果是开发一个类似应用市场的应用,我能理解为Shadow不支持打开非自家(未注册在清单文件中)的第三方插件应用吗 只要第三方插件应用也经过Shadow transform修改过就行。