InsertKoinIO / koin

Koin - a pragmatic lightweight dependency injection framework for Kotlin & Kotlin Multiplatform
https://insert-koin.io
Apache License 2.0
8.99k stars 713 forks source link

Random Instance creation exception #1483

Closed ngallazzi closed 9 months ago

ngallazzi commented 1 year ago

Describe the bug On some devices we have an initialisation issue we are not able to reproduce systematically. The problem seems to be the initialisation of SocialLoginHelper class, however we aren't able to see the exception clearly. Logs coming from firebase crashlytics

Expected behavior Avoid crash or print real exception

Koin project used and used version (please complete the following information): [e.g]: koin-core version 3.2.0

Additional moduleDefinition Add any other moduleDefinition about the problem here.

Caused by org.koin.core.error.InstanceCreationException: Could not create instance for [Singleton:'SocialLoginHelper']
       at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:61)
       at org.koin.core.instance.SingleInstanceFactory.create(SingleInstanceFactory.kt:46)
       at org.koin.core.instance.SingleInstanceFactory$get$1.invoke(SingleInstanceFactory.kt:53)
       at org.koin.core.instance.SingleInstanceFactory$get$1.invoke(SingleInstanceFactory.kt:51)
       at org.koin.mp.KoinPlatformTools.synchronized(KoinPlatformTools.kt:20)
       at org.koin.core.instance.SingleInstanceFactory.get(SingleInstanceFactory.kt:51)
       at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:111)
       at org.koin.core.scope.Scope.resolveValue(Scope.kt:255)
       at org.koin.core.scope.Scope.resolveInstance(Scope.kt:242)
       at org.koin.core.scope.Scope.get(Scope.kt:205)
       at com.zodiakactive.********.di.AppModuleKt$appModule$1$14.invoke(appModule.kt:132)
       at com.zodiakactive.********.di.AppModuleKt$appModule$1$14.invoke(appModule.kt:75)
       at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:54)
       at org.koin.core.instance.SingleInstanceFactory.create(SingleInstanceFactory.kt:46)
       at org.koin.core.instance.SingleInstanceFactory$get$1.invoke(SingleInstanceFactory.kt:53)
       at org.koin.core.instance.SingleInstanceFactory$get$1.invoke(SingleInstanceFactory.kt:51)
       at org.koin.mp.KoinPlatformTools.synchronized(KoinPlatformTools.kt:20)
       at org.koin.core.instance.SingleInstanceFactory.get(SingleInstanceFactory.kt:51)
       at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:111)
       at org.koin.core.scope.Scope.resolveValue(Scope.kt:255)
       at org.koin.core.scope.Scope.resolveInstance(Scope.kt:242)
       at org.koin.core.scope.Scope.get(Scope.kt:205)
       at com.zodiakactive.********.di.DataModuleKt$dataSourceModule$1$1.invoke(dataModule.kt:65)
       at com.zodiakactive.********.di.DataModuleKt$dataSourceModule$1$1.invoke(dataModule.kt:32)
       at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:54)
       at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:38)
       at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:111)
       at org.koin.core.scope.Scope.resolveValue(Scope.kt:255)
       at org.koin.core.scope.Scope.resolveInstance(Scope.kt:242)
       at org.koin.core.scope.Scope.get(Scope.kt:205)
       at com.zodiakactive.********.di.DataModuleKt$repositoryModule$1$2.invoke(dataModule.kt:65)
       at com.zodiakactive.********.di.DataModuleKt$repositoryModule$1$2.invoke(dataModule.kt:42)
       at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:54)
       at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:38)
       at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:111)
       at org.koin.core.scope.Scope.resolveValue(Scope.kt:255)
       at org.koin.core.scope.Scope.resolveInstance(Scope.kt:242)
       at org.koin.core.scope.Scope.get(Scope.kt:205)
       at com.zodiakactive.********.di.DomainModuleKt$domainModule$1$15.invoke(domainModule.kt:74)
       at com.zodiakactive.********.di.DomainModuleKt$domainModule$1$15.invoke(domainModule.kt:62)
       at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:54)
       at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:38)
       at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:111)
       at org.koin.core.scope.Scope.resolveValue(Scope.kt:255)
       at org.koin.core.scope.Scope.resolveInstance(Scope.kt:242)
       at org.koin.core.scope.Scope.get(Scope.kt:205)
       at com.*******.******.main.fragment.home.HomeViewModel$Companion$create$$inlined$inject$default$1.invoke(ComponentCallbackExt.kt:61)
       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
       at com.zodiakactive.********.main.fragment.home.HomeViewModel$Companion.create$lambda-0(HomeViewModel.kt:26)
       at com.zodiakactive.********.main.fragment.home.HomeViewModel$Companion.create(HomeViewModel.kt:30)
       at com.zodiakactive.********.main.fragment.home.HomeViewModel$Companion.create(HomeViewModel.kt:17)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.airbnb.mvrx.MavericksFactoryKt.createViewModel(MavericksFactory.kt:49)
       at com.airbnb.mvrx.MavericksFactoryKt.access$createViewModel(MavericksFactory.kt:1)
       at com.airbnb.mvrx.MavericksFactory.create(MavericksFactory.kt:22)
       at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
       at com.airbnb.mvrx.MavericksViewModelProvider.get(MavericksViewModelProvider.kt:63)
       at com.airbnb.mvrx.MavericksViewModelProvider.get$default(MavericksViewModelProvider.kt:31)
       at com.zodiakactive.********.main.fragment.home.HomeFragment$special$$inlined$activityViewModel$default$2.invoke(MavericksExtensions.kt:194)
       at com.zodiakactive.********.main.fragment.home.HomeFragment$special$$inlined$activityViewModel$default$2.invoke(MavericksExtensions.kt:188)
       at com.airbnb.mvrx.DefaultViewModelDelegateFactory$createLazyViewModel$1.invoke(ViewModelDelegateProvider.kt:93)
       at com.airbnb.mvrx.DefaultViewModelDelegateFactory$createLazyViewModel$1.invoke(ViewModelDelegateProvider.kt:92)
       at com.airbnb.mvrx.lifecycleAwareLazy.getValue(lifecycleAwareLazy.kt:79)
       at com.airbnb.mvrx.lifecycleAwareLazy$initializeWhenCreated$1.onCreate(lifecycleAwareLazy.kt:52)
       at androidx.lifecycle.FullLifecycleObserverAdapter.onStateChanged(FullLifecycleObserverAdapter.java:36)
       at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
       at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:265)
       at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:307)
       at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:148)
       at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134)
       at androidx.fragment.app.Fragment.performCreate(Fragment.java:2987)
       at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:474)
       at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:257)********
       at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1840)
       at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1764)
       at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1701)
       at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2849)
       at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:2773)
       at androidx.fragment.app.Fragment.onCreate(Fragment.java:1913)
       at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.kt:169)
       at androidx.fragment.app.Fragment.performCreate(Fragment.java:2981)
       at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:474)
       at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:257)
       at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1840)
       at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1764)
       at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1670)
       at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:323)
       at androidx.fragment.app.FragmentContainerView.<init>(FragmentContainerView.kt:158)
       at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:53)
       at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
       at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:295)
       at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:274)
       at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1078)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:970)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:1132)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1093)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:692)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:542)
       at com.zodiakactive.********.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:51)
       at com.zodiakactive.********.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:45)
       at com.zodiakactive.********.main.presentation.MainActivity.onCreate(MainActivity.kt:24)
       at android.app.Activity.performCreate(Activity.java:8145)
       at android.app.Activity.performCreate(Activity.java:8125)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1344)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3754)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3950)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:109)
       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:2346)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:238)
       at android.os.Looper.loop(Looper.java:349)
       at android.app.ActivityThread.main(ActivityThread.java:8241)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)

@cmunaro

arnaudgiuliani commented 1 year ago

you can already try to upgrade to the latest 3.3.2 version, to get the latest fix. Is it in a special case? special device?

ngallazzi commented 1 year ago

Actually it's quite random and not related to particular devices or OS version. Looks more like a concurrency problem during initialisation across modules. We'll try to update to 3.3.2 and let you know, thanks!

arnaudgiuliani commented 1 year ago

let me know how it goes yes 👍

Jaseemakhtar commented 1 year ago

We are using 3.3.2 latest version, last week we did 50% rollout after upgrading koin, same issue still exists but for different classes. It just seems randomly happening don't know what to do. @arnaudgiuliani

ninja- commented 1 year ago

there should be an underlying exception, why isn't it in your logs? https://github.com/InsertKoinIO/koin/blob/main/core/koin-core/src/commonMain/kotlin/org/koin/core/instance/InstanceFactory.kt#L59

Is this a limitation of crashlytics client that it cuts the stacktrace too short?

arnaudgiuliani commented 1 year ago

do you have stacktraces @Jaseemakhtar ?

Jaseemakhtar commented 1 year ago

do you have stacktraces @Jaseemakhtar

Yes please check this one Stacktrace.txt

reisfernanda commented 1 year ago

Hello, we're also having this crash reported by Crashlytics, using version 3.4.0. We could not reproduce the issue.

This crash happens repeatedly with the same user. Some devices that had the crash happening:

According to Crashlytics, this crash event happened in the first second of the user's session, and in 97% of the occurrences the app was in the background.

Any help on this?

This is the stack trace: InstanceCreationException_logs.txt

reisfernanda commented 1 year ago

Hello, does anyone have any update on how to reproduce or fix this issue?

reisfernanda commented 1 year ago

Hello @arnaudgiuliani and @ngallazzi I identified what happened on our app and fixed this issue. On some of the classes that were being injected by Koin, we had a init block that was causing a crash on some specific devices when initializing a property. My solution was to set this property as lazy and catch the exception. After this change, the InstanceCreationException is not happening anymore. So, at least on our app, it wasn't a Koin issue.

@ngallazzi You mentioned that it happened on your SocialLoginHelper, maybe you can check if there is any possible crash on this class. In my case, the crash was happening when trying to create a EncryptedSharedPreferences.

stale[bot] commented 9 months ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

koolfreak commented 8 months ago

private val sharedPrefs: SharedPreferences by inject()

using koin 3.5.0

..having this issue

Caused by org.koin.core.error.InstanceCreationException: Could not create instance for '[Singleton:'android.content.SharedPreferences']'

Thanks

arnaudgiuliani commented 8 months ago

Please reopen an issue with the full error stack. thanks :)

kaiyrzhanDE commented 8 months ago

We also have a similar bag This is error stack

org.koin.core.error.InstanceCreationException: Could not create instance for [Single:'asia.koom.app.LocaleManager',binds:asia.koom.app.LocaleManager] at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:62) at org.koin.core.instance.SingleInstanceFactory.create(SingleInstanceFactory.kt:39) at org.koin.core.instance.SingleInstanceFactory.get(SingleInstanceFactory.kt:47) at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:103) at org.koin.core.scope.Scope.resolveInstance(Scope.kt:236) at org.koin.core.scope.Scope.get(Scope.kt:204) at asia.koom.app.SingleActivity$special$$inlined$inject$default$1.invoke(ComponentCallbackExt.kt:69) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at asia.koom.app.SingleActivity.getLocaleManager(SingleActivity.kt:29) at asia.koom.app.SingleActivity.attachBaseContext(SingleActivity.kt:79) at android.app.Activity.attach(Activity.java:8027) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3543) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3763) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 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:2202) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:236) at android.app.ActivityThread.main(ActivityThread.java:8069) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011) Caused by: org.koin.core.error.InstanceCreationException: Could not create instance for [Single:'asia.koom.app.preferences.PreferencesImpl',binds:asia.koom.app.preferences.Preferences] at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:62) at org.koin.core.instance.SingleInstanceFactory.create(SingleInstanceFactory.kt:39) at org.koin.core.instance.SingleInstanceFactory.get(SingleInstanceFactory.kt:47) at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:103) at org.koin.core.scope.Scope.resolveInstance(Scope.kt:236) at org.koin.core.scope.Scope.get(Scope.kt:204) at asia.koom.app.di.CommonModule$create$1$17.invoke(CommonModule.kt:194) at asia.koom.app.di.CommonModule$create$1$17.invoke(CommonModule.kt:155) at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:51) ... 22 more Caused by: org.koin.core.error.InstanceCreationException: Could not create instance for [Single:'android.content.SharedPreferences',binds:android.content.SharedPreferences] at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:62) at org.koin.core.instance.SingleInstanceFactory.create(SingleInstanceFactory.kt:39) at org.koin.core.instance.SingleInstanceFactory.get(SingleInstanceFactory.kt:47) at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:103) at org.koin.core.scope.Scope.resolveInstance(Scope.kt:236) at org.koin.core.scope.Scope.get(Scope.kt:204) at asia.koom.app.di.CommonModule$create$1$13.invoke(CommonModule.kt:194) at asia.koom.app.di.CommonModule$create$1$13.invoke(CommonModule.kt:143) at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:51) ... 30 more