Shadow icon indicating copy to clipboard operation
Shadow copied to clipboard

在插件里面添加lifecycle依赖的时候,闪退

Open sindicly opened this issue 3 years ago • 14 comments

在插件里面添加lifecycle依赖的时候,编译能过,在点击启动插件的时候闪退,是否shadow的包有冲突?

sindicly avatar May 27 '21 03:05 sindicly

请参考https://github.com/Tencent/Shadow/blob/0e5d9d8d935d296bc40555b07d8396ba539de214/CONTRIBUTING.md#issue 提供一个复现问题的代码。这样我们才能交流问题。

shifujun avatar May 27 '21 06:05 shifujun

https://github.com/sindicly/Shadow.git 分支:problem, image

sindicly avatar May 27 '21 08:05 sindicly

那个source sample是用support包写的,跟androidx有冲突。

不过单说lifecycle的话,代码里有一个测试用例是用了的。LiveDataWithActivityTestActivity可以搜一下这个,在这个测试用例基础上修改一下试试。

shifujun avatar May 28 '21 08:05 shifujun

@shifujun 插件中引入lifecycle依赖,其会自动添加一个provider image 其中会做一些Lifecycle的初始化

image

image

执行到这里时 就会崩溃,提示无法强转 ((Application) context.getApplicationContext()) .registerActivityLifecycleCallbacks(new DispatcherActivityCallback()); 不知道有什么方法可以解决或者避免这个问题

Daimhim avatar Jan 25 '22 05:01 Daimhim

@shifujun 插件中引入lifecycle依赖,其会自动添加一个provider image 其中会做一些Lifecycle的初始化

image

image

执行到这里时 就会崩溃,提示无法强转 ((Application) context.getApplicationContext()) .registerActivityLifecycleCallbacks(new DispatcherActivityCallback()); 不知道有什么方法可以解决或者避免这个问题

可以参考这个:https://github.com/Tencent/Shadow/issues/732#issuecomment-1002471704

shifujun avatar Jan 25 '22 08:01 shifujun

我不是很理解这个,可以大概说一下嘛

Daimhim avatar Jan 25 '22 10:01 Daimhim

我不是很理解这个,可以大概说一下嘛

好像搞错了。你这个lifecycle不像是插件里的代码。插件里的代码不会再有Application类型了,不会遇到你这个错误。你要不把代码push上来看看吧。

shifujun avatar Jan 25 '22 10:01 shifujun

使用以下依赖 引入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 image

再往后就是执行插件的Application,会先执行provider。但是lifecycle的provider 会强转Application导致崩溃

Daimhim avatar Jan 25 '22 11:01 Daimhim

代码push这块 我想修改demo但是因为用到androidx 冲突比较多 还在处理

Daimhim avatar Jan 25 '22 11:01 Daimhim

代码push这块 我想修改demo但是因为用到androidx 冲突比较多 还在处理

projects/test/plugin/androidx-cases/test-plugin-androidx-cases

这有androidx的测试项目。

shifujun avatar Jan 25 '22 11:01 shifujun

使用最新的lifecycle依赖 目前复现不出来 但是代码我已经上传了

就这个类里面有这句强转操作,导致崩溃 集成的demo 好像没有执行这句

image

Daimhim avatar Jan 25 '22 12:01 Daimhim

使用最新的lifecycle依赖 目前复现不出来 但是代码我已经上传了

就这个类里面有这句强转操作,导致崩溃 集成的demo 好像没有执行这句

image

这个是代码地址 https://github.com/Daimhim/Shadow/tree/lifecycle-error-repeat

Daimhim avatar Jan 25 '22 12:01 Daimhim

我运行你的代码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 )影响了。

shifujun avatar Jan 26 '22 07:01 shifujun

上次找到原因改好了,再次遇到 忘了当时怎么处理的。。。

Daimhim avatar Mar 28 '22 16:03 Daimhim

求问这个问题现在怎么解决的?

miaorenjieZzz avatar Apr 26 '23 12:04 miaorenjieZzz

求问这个问题现在怎么解决的?

这个issue原本的问题看起来也不是很清楚。你如果有类似的问题就fork一下,如果能在sample中修改复现,就新提一个issue吧。注意在sample或者test中搜一下,可能有lifecycle的用例。

shifujun avatar Apr 26 '23 12:04 shifujun

这个问题解决了,是因为依赖lifecycle时会自动在manifest中添加InitializationProvider,shadow的gradle plugin在插件项目没有直接依赖InitializationProvider类时无法对其进行编译时改造。解决方法是显式在插件项目中依赖androidx.startup:startup-runtime 即可

miaorenjieZzz avatar Apr 27 '23 05:04 miaorenjieZzz