ktorio / ktorio/ktor

Strict mode DiskReadViolation while initializing HttpClient

Open
#4,817 4 comments 1 reaction 0 assignees View on GitHub
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.