Strict mode DiskReadViolation while initializing HttpClient
- Dominant language
- Kotlin
- Stars
- 14.5k
- Forks
- 1.3k
- Avg merge
- 2d 13h
- Merged PRs (30d)
- 49
Description
Hi all,
I'm facing a disk read violation while initializing my HttpClient with Koin DI.
Here is how I initialize the HttpClient:
`val remoteModule = module {
single { HttpClientFactory.create(CIO.create()) }
}`
Here is the configuration of StrictMode:
` StrictMode.setThreadPolicy(
ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.build()
)`
And here is a stack of a StrinctMode itself:
`StrictMode policy violation; ~duration=227 ms: android.os.strictmode.DiskReadViolation (Ask Gemini)
at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1728)
at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:301)
at java.io.File.isDirectory(File.java:859)
at dalvik.system.DexPathList$Element.findResource(DexPathList.java:788)
at dalvik.system.DexPathList.findResources(DexPathList.java:572)
at dalvik.system.BaseDexClassLoader.findResources(BaseDexClassLoader.java:330)
at java.lang.ClassLoader.getResources(ClassLoader.java:1450)
at java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1157)
at java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1184)
at java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1238)
at java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1367)
at java.nio.channels.spi.SelectorProvider.loadProviderAsService(SelectorProvider.java:122)
at java.nio.channels.spi.SelectorProvider.-$$Nest$smloadProviderAsService(Unknown Source:0)
at java.nio.channels.spi.SelectorProvider$1.run(SelectorProvider.java:180)
at java.nio.channels.spi.SelectorProvider$1.run(SelectorProvider.java:176)
at java.security.AccessController.doPrivileged(AccessController.java:46)
at java.nio.channels.spi.SelectorProvider.provider(SelectorProvider.java:175)
at io.ktor.network.selector.SelectorManagerSupport.(SelectorManagerSupport.kt:18)
at io.ktor.network.selector.ActorSelectorManager.(ActorSelectorManager.kt:18)
at io.ktor.network.selector.SelectorManagerKt.SelectorManager(SelectorManager.kt:13)
at io.ktor.client.engine.cio.CIOEngine.(CIOEngine.kt:32)
at io.ktor.client.engine.cio.CIO.create(CIOCommon.kt:34)
at io.ktor.client.engine.HttpClientEngineFactory$DefaultImpls.create$default(HttpClientEngine.kt:118)
at kma.voice.text.recorder.di.RemoteModuleKt.remoteModule$lambda$1$lambda$0(RemoteModule.kt:12)
at kma.voice.text.recorder.di.RemoteModuleKt.$r8$lambda$wr-v9Z4C-b0NtNszDlru3pGEF6g(Unknown Source:0)
at kma.voice.text.recorder.di.RemoteModuleKt$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:51)
at org.koin.core.instance.SingleInstanceFactory.create(SingleInstanceFactory.kt:46)
at org.koin.core.instance.SingleInstanceFactory.get$lambda$0(SingleInstanceFactory.kt:55)
at org.koin.core.instance.SingleInstanceFactory.$r8$lambda$DuRNwghYWsMwMsdJERKYXVNSM_0(Unknown Source:0)
at org.koin.core.instance.SingleInstanceFactory$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
at org.koin.mp.KoinPlatformTools.synchronized(KoinPlatformTools.kt:36)
at org.koin.core.instance.SingleInstanceFactory.get(SingleInstanceFactory.kt:53)
at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:110)
at org.koin.core.scope.Scope.resolveFromRegistry(Scope.kt:321)
at org.koin.core.scope.Scope.resolveFromContext(Scope.kt:311)
at org.koin.core.scope.Scope.stackParametersCall(Scope.kt:273)
at org.koin.core.scope.Scope.resolveInstance(Scope.kt:259)
at org.koin.core.scope.Scope.resolveWithOptionalLogging(Scope.kt:232)
at org.koin.core.scope.Scope.get(Scope.kt:215)
at kma.voice.text.recorder.di.RemoteModuleKt$remoteModule$lambda$1$$inlined$singleOf$default$1.invoke(SingleOf.kt:227)
at kma.voice.text.recorder.di.RemoteModuleKt$remoteModule$lambda$1$$inlined$singleOf$default$1.invoke(SingleOf.kt:52)
at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:51)
at org.koin.core.instance.SingleInstanceFactory.create(SingleInstanceFactory.kt:46)
at org.koin.core.instance.SingleInstanceFactory.get$lambda$0(SingleInstanceFactory.kt:55)
at org.koin.core.instance.SingleInstanceFactory.$r8$lambda$DuRNwghYWsMwMsdJERKYXVNSM_0(Unknown Source:0)
at org.koin.core.instance.SingleInstanceFactory$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
2025-04-29 16:56:04.094 20596-20596 StrictMode kma.voice.text.recorder D at org.koin.mp.KoinPlatformTools.synchronized(KoinPlatformTools.kt:36) (Ask Gemini)
at org.koin.core.instance.SingleInstanceFactory.get(SingleInstanceFactory.kt:53)
at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:110)
at org.koin.core.scope.Scope.resolveFromRegistry(Scope.kt:321)
at org.koin.core.scope.Scope.resolveFromContext(Scope.kt:311)
at org.koin.core.scope.Scope.stackParametersCall(Scope.kt:273)
at org.koin.core.scope.Scope.resolveInstance(Scope.kt:259)
at org.koin.core.scope.Scope.resolveWithOptionalLogging(Scope.kt:232)
at org.koin.core.scope.Scope.get(Scope.kt:215)
at kma.voice.text.recorder.di.AppModuleKt$appModule$lambda$18$$inlined$singleOf$1.invoke(SingleOf.kt:227)
at kma.voice.text.recorder.di.AppModuleKt$appModule$lambda$18$$inlined$singleOf$1.invoke(SingleOf.kt:76)
at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:51)
at org.koin.core.instance.SingleInstanceFactory.create(SingleInstanceFactory.kt:46)
at org.koin.core.instance.SingleInstanceFactory.get$lambda$0(SingleInstanceFactory.kt:55)
at org.koin.core.instance.SingleInstanceFactory.$r8$lambda$DuRNwghYWsMwMsdJERKYXVNSM_0(Unknown Source:0)
at org.koin.core.instance.SingleInstanceFactory$$ExternalSyntheticLambda0.invoke(D8$$SyntheticClass:0)
at org.koin.mp.KoinPlatformTools.synchronized(KoinPlatformTools.kt:36)
at org.koin.core.instance.SingleInstanceFactory.get(SingleInstanceFactory.kt:53)
at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:110)
at org.koin.core.scope.Scope.resolveFromRegistry(Scope.kt:321)
at org.koin.core.scope.Scope.resolveFromContext(Scope.kt:311)
at org.koin.core.scope.Scope.stackParametersCall(Scope.kt:273)
at org.koin.core.scope.Scope.resolveInstance(Scope.kt:259)
at org.koin.core.scope.Scope.resolveWithOptionalLogging(Scope.kt:232)
at org.koin.core.scope.Scope.get(Scope.kt:215)
at kma.voice.text.recorder.di.AppModuleKt$appModule$lambda$18$$inlined$viewModelOf$default$2.invoke(ViewModelOf.kt:226)
at kma.voice.text.recorder.di.AppModuleKt$appModule$lambda$18$$inlined$viewModelOf$default$2.invoke(ViewModelOf.kt:67)
at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:51)
at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:38)
at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:110)
at org.koin.core.scope.Scope.resolveFromRegistry(Scope.kt:321)
at org.koin.core.scope.Scope.resolveFromContext(Scope.kt:311)
at org.koin.core.scope.Scope.stackParametersCall(Scope.kt:281)
at org.koin.core.scope.Scope.resolveInstance(Scope.kt:259)
at org.koin.core.scope.Scope.resolveWithOptionalLogging(Scope.kt:232)
at org.koin.core.scope.Scope.get(Scope.kt:215)
at org.koin.viewmodel.factory.KoinViewModelFactory.create(KoinViewModelFactory.kt:39)
at androidx.lifecycle.viewmodel.ViewModelProviderImpl_androidKt.createViewModel(ViewModelProviderImpl.android.kt:34)
at androidx.lifecycle.viewmodel.ViewModelProviderImpl.getViewModel$lifecycle_viewmodel_release(ViewModelProviderImpl.kt:65)
at androidx.lifecycle.viewmodel.ViewModelProviderImpl.getViewModel$lifecycle_viewmodel_release$default(ViewModelProviderImpl.kt:47)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.android.kt:91)
at org.koin.viewmodel.GetViewModelKt.resolveViewModel(GetViewModel.kt:60)
at kma.voice.text.recorder.presentation.record_list.RecordListScreenKt.RecordListScreenRoot(RecordListScreen.kt:463)
at kma.voice.text.recorder.ComposableSingletons$MainActivityKt$lambda-1$1$2$1$1$1.invoke(MainActivity.kt:107)
at kma.voice.text.recorder.ComposableSingletons$MainActivityKt$lambda-1$1$2$1$1$1.invoke(MainActivity.kt:106)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:139)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.navigation.compose.NavHostKt$NavHost$32$1.invoke(NavHost.kt:704)
2025-04-29 16:56:04.094 20596-20596 StrictMode kma.voice.text.recorder D at androidx.navigation.compose.NavHostKt$NavHost$32$1.invoke(NavHost.kt:703) (Ask Gemini)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:401)
at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:85)
at androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:65)
at androidx.navigation.compose.NavBackStackEntryProviderKt.access$SaveableStateProvider(NavBackStackEntryProvider.kt:1)
at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:52)
at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:51)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:380)
at androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:47)
at androidx.navigation.compose.NavHostKt$NavHost$32.invoke(NavHost.kt:703)
at androidx.navigation.compose.NavHostKt$NavHost$32.invoke(NavHost.kt:683)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:139)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$5.invoke(AnimatedContent.kt:803)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1$5.invoke(AnimatedContent.kt:792)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:118)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedVisibilityKt.AnimatedEnterExitImpl(AnimatedVisibility.kt:771)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:774)
at androidx.compose.animation.AnimatedContentKt$AnimatedContent$6$1.invoke(AnimatedContent.kt:757)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
at androidx.compose.animation.AnimatedContentKt.AnimatedContent(AnimatedContent.kt:816)
at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:655)
at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:356)`
Any ideas why there might be a problem with a disk read violation?
Contributor guide
Research direction
Start with io.ktor.client.engine.cio.CIOEngine.kt and io.ktor.network.selector.SelectorManagerSupport.kt, following the initialization path shown in the stack trace. Reproduce HttpClientFactory.create(CIO.create()) under Android StrictMode with the reported Koin setup, then determine the expected initialization behavior and how it should be verified.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- kotlin
- Domain
- mobile-dev, networking
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100