Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

partKey==login-plugin在map中找不到 #802

Closed
yatoooon opened this issue Feb 11, 2022 · 22 comments
Closed

partKey==login-plugin在map中找不到 #802

yatoooon opened this issue Feb 11, 2022 · 22 comments

Comments

@yatoooon
Copy link

 Caused by: java.lang.IllegalStateException: partKey==login-plugin在map中找不到。此时map:{base-plugin=com.tencent.shadow.core.loader.infos.PluginParts@bb4af51}

我先加载了一个base插件 login插件依赖base插件 然后加载login插件 就出现这个错误了

@shifujun
Copy link
Collaborator

你Debug一下那个map里的base-plugin是什么时候添加进去的,就理解为什么缺少login-plugin了。

@yatoooon
Copy link
Author

还是不太明白 大佬能否明示解决办法

@shifujun
Copy link
Collaborator

问题应该不复杂,搞不定就把代码push上来帮你看看吧。我前面说的意思就是告诉你去debug下那个map添加的过程。

@yatoooon
Copy link
Author

https://github.com/yatoooon/MVVMArms feature_plugin分支
const val isRunAlone = true
const val isRunPlugin = true
这两个改为false可以打插件包 两个改为true是整个包
加载逻辑在 com.arms.template.mvvm.fragment.MineFragment btnMineCommon先加载base插件 btnMineGuide然后加载splash插件

@yatoooon
Copy link
Author

上面说错了 改为true可以打插件包 改为false是整个包

@shifujun
Copy link
Collaborator

@yatoooon
Copy link
Author

startPluginActivity 点进去 convertActivityIntent 这个里面有调用的哇 这个应该是我从shadow项目中抄过来的代码

@yatoooon
Copy link
Author

是不是因为重复的contentprovider 导致loadplugin没有成功 这个androidx.lifecycle.ProcessLifecycleOwnerInitializer provier我就剔除不掉

@shifujun
Copy link
Collaborator

我晚些再看看,找到问题后补些便于定位这种问题的log。

@shifujun
Copy link
Collaborator

@yatoooon 你这个项目编译有点困难呢。我先加了一个CI构建(shifujun/MVVMArms@7a4db38 ),复现了一下编译问题。麻烦先修复下编译吧。

https://github.com/shifujun/MVVMArms/runs/5213485261?check_suite_focus=true

@yatoooon
Copy link
Author

yatoooon commented Feb 16, 2022

https://github.com/yatoooon/MVVMArms/runs/5216132587?check_suite_focus=true
跑完这个 把manager apk和 base plugin , splash plugin 推到手机里面
后面就是改
const val isRunAlone = false
const val isRunPlugin = false
编译 运行app
点击下面导航栏 我的 点我加载通用插件 点我加载引导页面

@shifujun
Copy link
Collaborator

调试了一下,这里的问题是多个插件存在相同authorities的ContentProvider。因为你这些插件在AndroidManifest.xml中的package都是com.arms.splash,所以从androidx.lifecycle:lifecycle-process:2.2.0中添加的android:authorities="${applicationId}.lifecycle-process"就都变成一样的了。

自动添加到manifest中的组件来源可以从:
build/intermediates/manifest_merge_blame_file/pluginDebug/manifest-merger-blame-plugin-debug-report.txt
看到。

然后这里错误提示看到"partKey==login-plugin在map中找不到 ",确实是有问题的。这里是因为跨进程通信的关系,插件进程其实已经先有一次Crash了,但是在插件进程关闭之前,主进程又用通过另一个线程触发了新的Crash。如果把插件都改到主进程,就不会看到第2次Crash了。

这里需要改进应该是loadPlugin调用的跨进程异常传递。

shifujun added a commit to shifujun/Shadow that referenced this issue Feb 18, 2022
如不支持抛出异常,控制端可能会认为调用成功继续调用其他方法。
Loader所在进程在没有及时Crash退出前收到调用,会出现进一步的异常Crash,
从而出现Loader所在进程打印两次不同的Crash信息。

Tencent#802
shifujun added a commit that referenced this issue Feb 18, 2022
如不支持抛出异常,控制端可能会认为调用成功继续调用其他方法。
Loader所在进程在没有及时Crash退出前收到调用,会出现进一步的异常Crash,
从而出现Loader所在进程打印两次不同的Crash信息。

#802
@yatoooon
Copy link
Author

存在相同authorities的ContentProvider这个问题该怎么搞啊 大佬有什么好的建议吗 这个ProcessLifecycleOwnerInitializer是com.android.tools.build:gradle引入的 感觉就剔除不掉 也改不掉插件的包名啊 宿主和插件的包名必须是相同的

@shifujun
Copy link
Collaborator

AndroidManifest.xml中的package都是com.arms.splash

这里不是最终的包名,所以要设置成不同的。最终applicationID设置成一样的就行了。sample里的多插件也都是这样的。

@yatoooon
Copy link
Author

好的 我去看看 感谢

@yatoooon
Copy link
Author

我看了一下 写法和 ample里的多插件没有区别哇 sample里的provider都是可以自己控制 authorities 的 我这个没有办法控制

@yatoooon
Copy link
Author

我的每个module AndroidManifest.xml中的package 值是不一样的 只是最后打成插件会变一样

@shifujun
Copy link
Collaborator

OK,我明白问题了。那确实不应该把lifecycle-process放到每个module里。可以放到base里,然后其他插件依赖它。

其他插件打包时通过`tools:node="remove"把这个Provider从插件的manifest里删掉。https://developer.android.com/studio/build/manage-manifests#node_markers

@yatoooon
Copy link
Author

感谢 这一步终于可以走过去了 感觉每走一步都是步履维艰 现在又出现了另一个问题 子插件的databinding找不到 我看错误日志 就没有去子插件里面找 只在通用插件里面找

@yatoooon
Copy link
Author

大佬 求指点 子插件依赖base插件 两个插件我看了一下都有这个类 但是加载的时候就报这个错了
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.databinding.DataBinderMapperImpl" on path: DexPathList[[zip file "/data/user/0/com.arms.sample/files/ShadowPluginManager/UnpackedPlugin/sample-manager/41eaad0392a6eb1506d7634b27fb3875/base-plugin-debug.zip/base-plugin-debug.apk"],nativeLibraryDirectories=[/data/user/0/com.arms.sample/files/ShadowPluginManager/UnpackedPlugin/sample-manager/lib/1234567890_lib, /system/lib64, /system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218)
at com.tencent.shadow.core.loader.classloaders.PluginClassLoader.loadClass(PluginClassLoader.kt:101)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at androidx.databinding.DataBindingUtil.(DataBindingUtil.java:32) 
at androidx.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:284) 
at com.arms.core.base.BaseActivity.setContentView(BaseActivity.java:101) 
at com.arms.core.base.BaseActivity.onCreate(BaseActivity.java:87) 
at com.arms.splash.mvvm.activity.Hilt_SplashActivity.onCreate(Hilt_SplashActivity.java:30) 
at com.tencent.shadow.core.loader.delegates.ShadowActivityDelegate.onCreate(ShadowActivityDelegate.kt:150) 
at com.tencent.shadow.core.runtime.container.PluginContainerActivity.onCreate(PluginContainerActivity.java:84) 
at android.app.Activity.performCreate(Activity.java:8051) 
at android.app.Activity.performCreate(Activity.java:8031) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3612) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3796) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2214) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loopOnce(Looper.java:201) 
at android.os.Looper.loop(Looper.java:288) 
at android.app.ActivityThread.main(ActivityThread.java:7842) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
Suppressed: java.lang.ClassNotFoundException: Didn't find class "androidx.databinding.DataBinderMapperImpl" on path: DexPathList[[zip file "/data/user/0/com.arms.sample/files/ShadowPluginManager/UnpackedPlugin/sample-manager/41eaad0392a6eb1506d7634b27fb3875/base-plugin-debug.zip/runtime-debug.apk"],nativeLibraryDirectories=[/system/lib64, /system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.tencent.shadow.core.loader.classloaders.PluginClassLoader.loadClass(PluginClassLoader.kt:95)

@shifujun
Copy link
Collaborator

Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.databinding.DataBinderMapperImpl"

这个问题和这个issue不相关吧?看起来就是一般的找不到类的错误,最好自己仔细检查。如果能在sample上复现的话,可以一起看看。

@yatoooon
Copy link
Author

好的 那我就先关掉这个了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants