Shadow
Shadow copied to clipboard
在插件里面添加lifecycle依赖的时候,闪退
在插件里面添加lifecycle依赖的时候,编译能过,在点击启动插件的时候闪退,是否shadow的包有冲突?
请参考https://github.com/Tencent/Shadow/blob/0e5d9d8d935d296bc40555b07d8396ba539de214/CONTRIBUTING.md#issue 提供一个复现问题的代码。这样我们才能交流问题。
https://github.com/sindicly/Shadow.git 分支:problem,
那个source sample是用support包写的,跟androidx有冲突。
不过单说lifecycle的话,代码里有一个测试用例是用了的。LiveDataWithActivityTestActivity
可以搜一下这个,在这个测试用例基础上修改一下试试。
@shifujun 插件中引入lifecycle依赖,其会自动添加一个provider
其中会做一些Lifecycle的初始化
执行到这里时 就会崩溃,提示无法强转
((Application) context.getApplicationContext()) .registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
不知道有什么方法可以解决或者避免这个问题
@shifujun 插件中引入lifecycle依赖,其会自动添加一个provider
其中会做一些Lifecycle的初始化
执行到这里时 就会崩溃,提示无法强转
((Application) context.getApplicationContext()) .registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
不知道有什么方法可以解决或者避免这个问题
可以参考这个:https://github.com/Tencent/Shadow/issues/732#issuecomment-1002471704
我不是很理解这个,可以大概说一下嘛
我不是很理解这个,可以大概说一下嘛
好像搞错了。你这个lifecycle不像是插件里的代码。插件里的代码不会再有Application类型了,不会遇到你这个错误。你要不把代码push上来看看吧。
使用以下依赖 引入lifecycle ` def lifecycle_version = "2.4.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
// Lifecycles only (without ViewModel or LiveData)
implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
// Saved state module for ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"
// Annotation processor
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
// alternately - if using Java8, use the following instead of lifecycle-compiler
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
`
其中
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
这个lifecycle插件会在插件项目的manifest中注册provider
再往后就是执行插件的Application,会先执行provider。但是lifecycle的provider 会强转Application导致崩溃
代码push这块 我想修改demo但是因为用到androidx 冲突比较多 还在处理
代码push这块 我想修改demo但是因为用到androidx 冲突比较多 还在处理
projects/test/plugin/androidx-cases/test-plugin-androidx-cases
这有androidx的测试项目。
使用最新的lifecycle依赖 目前复现不出来 但是代码我已经上传了
就这个类里面有这句强转操作,导致崩溃 集成的demo 好像没有执行这句
使用最新的lifecycle依赖 目前复现不出来 但是代码我已经上传了
就这个类里面有这句强转操作,导致崩溃 集成的demo 好像没有执行这句
这个是代码地址 https://github.com/Daimhim/Shadow/tree/lifecycle-error-repeat
我运行你的代码Crash在:
Caused by: android.content.pm.PackageManager$NameNotFoundException: ComponentInfo{com.tencent.shadow.test.hostapp/androidx.startup.InitializationProvider}
at android.app.ApplicationPackageManager.getProviderInfo(ApplicationPackageManager.java:480)
at androidx.startup.AppInitializer.discoverAndInitialize(AppInitializer.java:181)
我检查了下,现在代码就不支持getProviderInfo
方法。要么是你用的Shadow代码自己改过才支持的,所以你也可能改了其他地方。要么是你能复现问题的项目宿主中也有这个Provider。
如果是宿主中也有这个Provider,那么前面的Application强转的Crash也应该是加载到宿主中的LifecycleDispatcher
类了。如果你没有设置白名单,那么应该是受Android系统内联优化Bug(https://github.com/Tencent/Shadow/issues/603#issuecomment-915810715 )影响了。
上次找到原因改好了,再次遇到 忘了当时怎么处理的。。。
求问这个问题现在怎么解决的?
求问这个问题现在怎么解决的?
这个issue原本的问题看起来也不是很清楚。你如果有类似的问题就fork一下,如果能在sample中修改复现,就新提一个issue吧。注意在sample或者test中搜一下,可能有lifecycle的用例。
这个问题解决了,是因为依赖lifecycle时会自动在manifest中添加InitializationProvider,shadow的gradle plugin在插件项目没有直接依赖InitializationProvider类时无法对其进行编译时改造。解决方法是显式在插件项目中依赖androidx.startup:startup-runtime 即可