shifujun

Results 282 comments of shifujun

这里也要同步修改: https://github.com/Tencent/Shadow/blob/9f1d8b2d0bedef6a5234e835c52fbf8ecc0eadda/projects/sample/source/sample-plugin/sample-app/build.gradle#L117 这里没实现自动关联buildTask主要是因为buildTask在项目中不经常变化,实现略麻烦。

> 目前不太清该问题应该如何进行排查? 这个之前回答过的:https://github.com/Tencent/Shadow/issues/1046#issuecomment-1244943401

我看了一下代码,这个表现是很正常的。 你在宿主和插件中都打包了`androidx.appcompat:appcompat:1.4.1`。这个包中与`androidx.appcompat.app.AlertDialog`相关的不止有Java类,还有它的资源`androidx.appcompat.R.styleable.AppCompatTheme`等。 你没有像`hostWhiteList = ["com.tencent.shadow.sample.host.lib"]`一样,将`androidx.appcompat`添加到白名单中。因此你在插件和宿主中使用的`androidx.appcompat.app.AlertDialog`是两个不同的类。但也并不是你把这个包加到白名单中就行了。Shadow没有提供插件复用宿主资源的能力,因此插件和宿主中的`androidx.appcompat.R`类会分别生成不同的值。因此appcompat这种带有资源的第三方库确实不能在插件和宿主中简单的复用。需要更复杂的、额外的固定复用R值的构建流程。 由于你把`MPermissions`放到了本就在白名单中的`com.tencent.shadow.sample.host.lib`包,所以这个类插件和宿主访问的都是宿主中的类。它引用的`androidx.appcompat.app.AlertDialog`也是宿主中的类。因此当你把插件的context传给它时,它的`AppCompatDelegateImpl.java:850`行代码` if (!a.hasValue(R.styleable.AppCompatTheme_windowActionBar))`中向这个插件context查询的R值是来自宿主的。向插件context查询宿主中的R值,这显然是会失败的。 从你的代码意图来看,你是想让插件通知宿主弹出一个Dialog。那么你的MPermissions对象应该提前持有宿主Activity作为Context。

壳Activity用的是插件的资源,它没有宿主的资源。你既然想让宿主弹出dialog,就让用宿主那个前台activity作为context就是正确的。

因为那个MainActivity和要启动的,比如TestActivityOnCreate,对系统来说都是PluginDefaultProxyActivity。所以PluginDefaultProxyActivity已经显示在最前面了,你再启动一个single top的PluginDefaultProxyActivity,当然就没反应了。 这个配对关系在这里: https://github.com/Tencent/Shadow/blob/d27e984aff6caaa2cf6812c5edbc0aa817ade486/projects/sample/source/sample-plugin/sample-loader/src/main/java/com/tencent/shadow/sample/plugin/loader/SampleComponentManager.java#L50-L57

简要来说就是Database的name是允许包含`/`路径分隔符的,Shadow在`businessName`不为空时不支持这种路径。 兼容的方案应该是在有分隔符时,找出第一段作为需要添加前缀的名字。 可以在`SubDirContextThemeWrapperTest`中先补充一下测试用例。 你如果急用的话,可以先自己尝试修复一下。

我看不懂你说的两种方式和PluginManifest报找不到符号是什么关系,以及两种方式的区别是什么。 PluginManifest应该是从xml内容生成的,所以不需要你自己用两种方式去写,所以我不明白。但PluginManifest中确实有`applicationTheme`会引用一个R类中的值。这个值的包名前缀应该是AndroidManifest.xml中的manifest package,编译插件是通过AGP获取到它的。也许这里有bug,获取到错误的前缀了,可以提供一个可以复现问题的测试用例。 如果你说的两种方式是想获取同一个style值,那我觉得你可能是搞错了,没理解这些R值的原理。如果说插件demo依赖你的某个aar可以以你说的两个方式获取到NoActionBar。那实际上两个方式应该是获取到了两个不相关的值,只是恰好同名而已。 AGP生成的R类在这个路径下:build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/pluginDebug/R.jar,你可以解包看看。这个jar包在编译时被传到classpath里了,但没有被IDE索引,所以能编译到但IDE跳转不到。 如果你还是不能自行分析问题,你得把能复现问题的代码push上来才行了。没有代码我只能猜这么多。https://github.com/Tencent/Shadow/blob/abb72db13292982ebf5bf9f36af6ae8d2a3678a6/CONTRIBUTING.md

在so是32位还是64位这个问题上,插件的so就相当于宿主作为一个普通的app在运行时下载的额外的so。你自己学习和调试一下在没有shadow的应用中混用32位和64位so。如果可行的话,你就可以在issue中给出在混用的用例,我们再讨论下Shadow怎么样以同样的原理支持。

这个其实没多大用处,这是较早的业务代码需要的,所以一直没有删除。 它实际上就是自动给符合规则的context参数套了一层`getBaseContext()`调用: https://github.com/Tencent/Shadow/blob/aa7dcf4b834fccb3d024f2c87b8a7485a2366545/projects/sdk/core/transform/src/main/kotlin/com/tencent/shadow/core/transform/specific/KeepHostContextTransform.kt#L78 实际上应该让宿主和插件约定好如何获取宿主Context,以便插件代码可以按业务场景需要使用。

我测了一下,确实是在AGP 7.2.1下有bug,没能将`build/generated/source/pluginManifest/pluginDebug/com/tencent/shadow/core/manifest_parser/PluginManifest.java`作为源码加入到编译中。 目前代码已测试的最新版本是: https://github.com/Tencent/Shadow/blob/abb72db13292982ebf5bf9f36af6ae8d2a3678a6/projects/test/gradle-plugin-agp-compat-test/test.sh#L32-L33