client
client copied to clipboard
Add support for f-droids new repository format
The official F-Droid client recently gained support for delta repository index updates:
https://f-droid.org/2023/03/01/new-repo-format-faster-smaller-updates.html
It would be nice if Droid-ify could also use the entry.json file to speedup index updates.
I will start working on this tomorrow.
This is now the first priority. I will work on other topics once this is over
Have you considered making use of the official F-Droid libraries for this? At least the minimal index library should be helpful.
I looked into it but thought I will write my own implementation
Here's an early draft of a blog post about those libraries. Maybe it can convince you to not re-invent the wheel: https://gitlab.com/fdroid/fdroid-website/-/blob/80143c506cc4ea2f0a1cd10791760fd8457c7a2a/_posts/2023-05-15-three-client-libraries.md
Cool I will read it and get back. But I just wanted to tell you something, your best locale selector is probably not working as intended. I wrote my own and I think it is passing all the tests that I wrote which are inspired by your tests. Maybe you can run those test once and check? I could be very wrong.
@grote this seems to be the solution for the locale selector imo.
Also on FDroid libraries, I want to use them but they seem a little confusing and hard to integrate with my current structure but I will try it, it is harder because I will be adding support for GitHub Release soon
@grote this seems to be the solution for the locale selector imo.
Can you please point me to the test case(s) that fail for our implementation? Due to the differences in your code, it isn't obvious to spot.
Also on FDroid libraries, I want to use them but they seem a little confusing and hard to integrate with my current structure
Even just the index library? It should e the easiest to integrate into an existing project that doesn't use v2, yet.
Also remember that code is copyrighted and if you copy it into your project, there are certain conditions that apply such as crediting the original auther, etc. This is also true for test code.
Can you please point me to the test case(s) that fail for our implementation? Due to the differences in your code, it isn't obvious to spot.
This is one of the test which fails with the current implementation of LocaleChooser
Even just the index library? It should be the easiest to integrate into an existing project that doesn't use v2, yet.
Yes, I haven't looked into it thoroughly but I will reach back if I fail to implement it this time.
Also remember that code is copyrighted and if you copy it into your project, there are certain conditions that apply such as crediting the original auther, etc. This is also true for test code.
I have actually not copied it, I just took inspiration, you can see my Tests and Localization code here. I will give credits anyways. Thanks for notifying because I am not that knowledgeable about copyright rules.
This is one of the test which fails with the current implementation of LocaleChooser
This test seems to be copied one-to-one from F-Droid's source code (again without attribution and license declaration): https://gitlab.com/fdroid/fdroidclient/-/blob/680a1154cf3806390c2e4a9e95a7c6d6107b470f/libs/index/src/androidAndroidTest/kotlin/org/fdroid/BestLocaleTest.kt#L43
It is passing just fine. So maybe you were thinking of other tests that don't pass for F-Droid's locale chooser implementation?
@grote I added credits to FDroid in latest commit 3ee1064c40d8caeac5ba5719bbd86ea6d5cd8fe0. You can tell me if anything needs to be changed
It is passing just fine. So maybe you were thinking of other tests that don't pass for F-Droid's locale chooser implementation?
Idk it was failing for me. I will try to replicate it can share a ss to you here
What device do you run it on? Which Android version? Maybe there's differences on older versions.
What device do you run it on? Which Android version? Maybe there's differences on older versions.
I am not using any devices, I am just running the test on Android Studio
This is an instrumentation test. It won't work as a unit test which probably explains the failure you've been seeing. Roboelectric most likely doesn't provide the real implementation and just mocks those classes.
This is an instrumentation test. It won't work as a unit test which probably explains the failure you've been seeing. Roboelectric most likely doesn't provide the real implementation and just mocks those classes.
😵😵 My bad
It still downloads whole 1.2 mb of index from izzyondroid's repo. I wonder if it's a bug or sth else.
It still downloads whole 1.2 mb of index from izzyondroid's repo. I wonder if it's a bug or sth else.
Index v2 implementation has not been completed
@grote There seems to be a reflection error due to mismatch in ktor library version in the fdroid-download
and my versions.
Maybe this can be fixed on the library side? I am encountring this issue when I add :core:data
library to my :app
module. The full error is:
Logs
Process: com.looker.droidify.debug, PID: 14559
java.lang.ExceptionInInitializerError
at kotlin.reflect.jvm.internal.impl.types.error.ErrorModuleDescriptor.<clinit>(ErrorModuleDescriptor.kt:23)
at kotlin.reflect.jvm.internal.impl.types.error.ErrorUtils.<clinit>(ErrorUtils.kt:14)
at kotlin.reflect.jvm.internal.impl.types.error.ErrorUtils.createErrorType(Unknown Source:0)
at kotlin.reflect.jvm.internal.impl.types.TypeUtils.<clinit>(TypeUtils.java:36)
at kotlin.reflect.jvm.internal.impl.types.TypeUtils.makeUnsubstitutedType(TypeUtils.java:213)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.AbstractClassDescriptor$1.invoke(AbstractClassDescriptor.java:49)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.AbstractClassDescriptor$1.invoke(AbstractClassDescriptor.java:46)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:408)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:527)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.AbstractClassDescriptor.getDefaultType(AbstractClassDescriptor.java:175)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltInsCustomizer.createMockJavaIoSerializableType(JvmBuiltInsCustomizer.kt:91)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltInsCustomizer.<init>(JvmBuiltInsCustomizer.kt:59)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltIns$customizer$2.invoke(JvmBuiltIns.kt:76)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltIns$customizer$2.invoke(JvmBuiltIns.kt:75)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:408)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:527)
at kotlin.reflect.jvm.internal.impl.storage.StorageKt.getValue(storage.kt:42)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltIns.getCustomizer(JvmBuiltIns.kt:75)
at kotlin.reflect.jvm.internal.impl.load.kotlin.DeserializationComponentsForJava.<init>(DeserializationComponentsForJava.kt:80)
at kotlin.reflect.jvm.internal.impl.load.kotlin.DeserializationComponentsForJavaKt.makeDeserializationComponentsForJava(DeserializationComponentsForJava.kt:192)
at kotlin.reflect.jvm.internal.impl.load.kotlin.DeserializationComponentsForJava$Companion.createModuleData(DeserializationComponentsForJava.kt:123)
at kotlin.reflect.jvm.internal.impl.descriptors.runtime.components.RuntimeModuleData$Companion.create(RuntimeModuleData.kt:32)
at kotlin.reflect.jvm.internal.ModuleByClassLoaderKt.getOrCreateModule(moduleByClassLoader.kt:58)
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(KDeclarationContainerImpl.kt:36)
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(KDeclarationContainerImpl.kt:35)
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:93)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32)
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data.getModuleData(KDeclarationContainerImpl.kt:35)
at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:50)
at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:48)
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:93)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32)
at kotlin.reflect.jvm.internal.KClassImpl$Data.getDescriptor(KClassImpl.kt:48)
at kotlin.reflect.jvm.internal.KClassImpl.getDescriptor(KClassImpl.kt:182)
at kotlin.reflect.jvm.internal.KClassImpl.getDescriptor(KClassImpl.kt:44)
at kotlin.reflect.full.KClassifiers.createType(KClassifiers.kt:48)
AndroidRuntime com.looker.droidify.debug E at kotlin.reflect.jvm.internal.ReflectionFactoryImpl.typeOf(ReflectionFactoryImpl.java:124)
at kotlin.jvm.internal.Reflection.typeOf(Reflection.java:128)
at io.ktor.client.statement.HttpResponseKt.bodyAsChannel(HttpResponse.kt:101)
at com.looker.network.KtorDownloader$downloadToFile$2.invokeSuspend(KtorDownloader.kt:76)
at com.looker.network.KtorDownloader$downloadToFile$2.invoke(Unknown Source:8)
at com.looker.network.KtorDownloader$downloadToFile$2.invoke(Unknown Source:4)
at io.ktor.client.statement.HttpStatement.execute(HttpStatement.kt:50)
at io.ktor.client.statement.HttpStatement$execute$1.invokeSuspend(Unknown Source:15)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:103)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@4dcca43, Dispatchers.Main]
Caused by: java.lang.IllegalStateException: Resource not found in classpath: kotlin/kotlin.kotlin_builtins
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins.BuiltInsLoaderImpl.createBuiltInPackageFragmentProvider(BuiltInsLoaderImpl.kt:59)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins.BuiltInsLoaderImpl.createPackageFragmentProvider(BuiltInsLoaderImpl.kt:35)
at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.createBuiltInsModule(KotlinBuiltIns.java:105)
at kotlin.reflect.jvm.internal.impl.builtins.DefaultBuiltIns.<init>(DefaultBuiltIns.kt:24)
at kotlin.reflect.jvm.internal.impl.builtins.DefaultBuiltIns.<init>(DefaultBuiltIns.kt:21)
at kotlin.reflect.jvm.internal.impl.builtins.DefaultBuiltIns.<clinit>(DefaultBuiltIns.kt:31)```
</details>
Also I am getting the following error when I have both my downloader
and :core:data
in the main :app
module.
This occurs when I try to download a file. It works fine if I dont have data module(Which contains fdroid-download
) in my app module
Logs
Process: com.looker.droidify.debug, PID: 14559
java.lang.ExceptionInInitializerError
at kotlin.reflect.jvm.internal.impl.types.error.ErrorModuleDescriptor.<clinit>(ErrorModuleDescriptor.kt:23)
at kotlin.reflect.jvm.internal.impl.types.error.ErrorUtils.<clinit>(ErrorUtils.kt:14)
at kotlin.reflect.jvm.internal.impl.types.error.ErrorUtils.createErrorType(Unknown Source:0)
at kotlin.reflect.jvm.internal.impl.types.TypeUtils.<clinit>(TypeUtils.java:36)
at kotlin.reflect.jvm.internal.impl.types.TypeUtils.makeUnsubstitutedType(TypeUtils.java:213)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.AbstractClassDescriptor$1.invoke(AbstractClassDescriptor.java:49)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.AbstractClassDescriptor$1.invoke(AbstractClassDescriptor.java:46)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:408)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:527)
at kotlin.reflect.jvm.internal.impl.descriptors.impl.AbstractClassDescriptor.getDefaultType(AbstractClassDescriptor.java:175)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltInsCustomizer.createMockJavaIoSerializableType(JvmBuiltInsCustomizer.kt:91)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltInsCustomizer.<init>(JvmBuiltInsCustomizer.kt:59)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltIns$customizer$2.invoke(JvmBuiltIns.kt:76)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltIns$customizer$2.invoke(JvmBuiltIns.kt:75)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:408)
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:527)
at kotlin.reflect.jvm.internal.impl.storage.StorageKt.getValue(storage.kt:42)
at kotlin.reflect.jvm.internal.impl.builtins.jvm.JvmBuiltIns.getCustomizer(JvmBuiltIns.kt:75)
at kotlin.reflect.jvm.internal.impl.load.kotlin.DeserializationComponentsForJava.<init>(DeserializationComponentsForJava.kt:80)
at kotlin.reflect.jvm.internal.impl.load.kotlin.DeserializationComponentsForJavaKt.makeDeserializationComponentsForJava(DeserializationComponentsForJava.kt:192)
at kotlin.reflect.jvm.internal.impl.load.kotlin.DeserializationComponentsForJava$Companion.createModuleData(DeserializationComponentsForJava.kt:123)
at kotlin.reflect.jvm.internal.impl.descriptors.runtime.components.RuntimeModuleData$Companion.create(RuntimeModuleData.kt:32)
at kotlin.reflect.jvm.internal.ModuleByClassLoaderKt.getOrCreateModule(moduleByClassLoader.kt:58)
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(KDeclarationContainerImpl.kt:36)
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data$moduleData$2.invoke(KDeclarationContainerImpl.kt:35)
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:93)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32)
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl$Data.getModuleData(KDeclarationContainerImpl.kt:35)
at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:50)
at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:48)
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:93)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32)
at kotlin.reflect.jvm.internal.KClassImpl$Data.getDescriptor(KClassImpl.kt:48)
at kotlin.reflect.jvm.internal.KClassImpl.getDescriptor(KClassImpl.kt:182)
at kotlin.reflect.jvm.internal.KClassImpl.getDescriptor(KClassImpl.kt:44)
at kotlin.reflect.full.KClassifiers.createType(KClassifiers.kt:48)
AndroidRuntime com.looker.droidify.debug E at kotlin.reflect.jvm.internal.ReflectionFactoryImpl.typeOf(ReflectionFactoryImpl.java:124)
at kotlin.jvm.internal.Reflection.typeOf(Reflection.java:128)
at io.ktor.client.statement.HttpResponseKt.bodyAsChannel(HttpResponse.kt:101)
at com.looker.network.KtorDownloader$downloadToFile$2.invokeSuspend(KtorDownloader.kt:76)
at com.looker.network.KtorDownloader$downloadToFile$2.invoke(Unknown Source:8)
at com.looker.network.KtorDownloader$downloadToFile$2.invoke(Unknown Source:4)
at io.ktor.client.statement.HttpStatement.execute(HttpStatement.kt:50)
at io.ktor.client.statement.HttpStatement$execute$1.invokeSuspend(Unknown Source:15)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:103)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@4dcca43, Dispatchers.Main]
Caused by: java.lang.IllegalStateException: Resource not found in classpath: kotlin/kotlin.kotlin_builtins
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins.BuiltInsLoaderImpl.createBuiltInPackageFragmentProvider(BuiltInsLoaderImpl.kt:59)
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins.BuiltInsLoaderImpl.createPackageFragmentProvider(BuiltInsLoaderImpl.kt:35)
at kotlin.reflect.jvm.internal.impl.builtins.KotlinBuiltIns.createBuiltInsModule(KotlinBuiltIns.java:105)
at kotlin.reflect.jvm.internal.impl.builtins.DefaultBuiltIns.<init>(DefaultBuiltIns.kt:24)
at kotlin.reflect.jvm.internal.impl.builtins.DefaultBuiltIns.<init>(DefaultBuiltIns.kt:21)
at kotlin.reflect.jvm.internal.impl.builtins.DefaultBuiltIns.<clinit>(DefaultBuiltIns.kt:31)```
</details>
does it work when using the same ktor library version?
does it work when using the same ktor library version?
Nope it still fails
Does it work when excluding the ktor dependency from fdroid's downloader lib? is your kotlin-reflect dependency on the same kotlin version as your project?
I am not using kotlin-relfect
. And exclusion was not possible working (Maybe I was doing something wrong), I tried this:
implementation(FDroid.download) { exclude("io.ktor") }
but it was still available to use
Your stacktrace shows that you do use kotlin-reflect, so please as a first thing add it as an explicit dependency and ensure that it uses the same kotlin version as your project does. This is a common source of such errors.
Your stacktrace shows that you do use kotlin-reflect, so please as a first thing add it as an explicit dependency and ensure that it uses the same kotlin version as your project does. This is a common source of such errors.
That seems to have fixed it. I digged a little deeper and it seemed like Android Studio G comes with kotlin version 1.8.20
and the reflect was also using the same.
Either-way thanks 😄
I am facing a similar issue again, this time I have the latest reflect and kotlin version but still.
Details
java.util.concurrent.ExecutionException: kotlin.reflect.jvm.internal.KotlinReflectionInternalError: Unresolved class: class java.lang.String
at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:317)
at androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.java:96)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at java.lang.Thread.run(Thread.java:1012)
Caused by: kotlin.reflect.jvm.internal.KotlinReflectionInternalError: Unresolved class: class java.lang.String
at kotlin.reflect.jvm.internal.KClassImpl.reportUnresolvedClass(KClassImpl.kt:328)
at kotlin.reflect.jvm.internal.KClassImpl.access$reportUnresolvedClass(KClassImpl.kt:44)
at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:56)
at kotlin.reflect.jvm.internal.KClassImpl$Data$descriptor$2.invoke(KClassImpl.kt:48)
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:93)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32)
at kotlin.reflect.jvm.internal.KClassImpl$Data.getDescriptor(KClassImpl.kt:48)
at kotlin.reflect.jvm.internal.KClassImpl.getDescriptor(KClassImpl.kt:182)
at kotlin.reflect.jvm.internal.KClassImpl.getDescriptor(KClassImpl.kt:44)
at kotlin.reflect.full.KClassifiers.createType(KClassifiers.kt:47)
at kotlin.reflect.jvm.internal.CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1.invoke(caches.kt:37)
at kotlin.reflect.jvm.internal.CachesKt$CACHE_FOR_BASE_CLASSIFIERS$1.invoke(caches.kt:36)
at kotlin.reflect.jvm.internal.ComputableClassValue.computeValue(CacheByClass.kt:48)
at kotlin.reflect.jvm.internal.ComputableClassValue.computeValue(CacheByClass.kt:46)
at java.lang.ClassValue.getFromHashMap(ClassValue.java:230)
at java.lang.ClassValue.getFromBackup(ClassValue.java:212)
at java.lang.ClassValue.get(ClassValue.java:116)
at kotlin.reflect.jvm.internal.ClassValueCache.get(CacheByClass.kt:61)
at kotlin.reflect.jvm.internal.CachesKt.getOrCreateKType(caches.kt:55)
at kotlin.reflect.jvm.internal.ReflectionFactoryImpl.typeOf(ReflectionFactoryImpl.java:123)
at kotlin.jvm.internal.Reflection.typeOf(Reflection.java:128)
at org.fdroid.index.v1.PermissionV1Serializer$descriptor$1.invoke(PackageV1.kt:124)
at org.fdroid.index.v1.PermissionV1Serializer$descriptor$1.invoke(PackageV1.kt:95)
at kotlinx.serialization.descriptors.SerialDescriptorsKt.buildClassSerialDescriptor(SerialDescriptors.kt:58)
at org.fdroid.index.v1.PermissionV1Serializer.<init>(PackageV1.kt:95)
at org.fdroid.index.v1.PermissionV1$Companion.serializer(PackageV1.kt:88)
at org.fdroid.index.v1.PackageV1$$serializer.deserialize(PackageV1.kt:28)
at org.fdroid.index.v1.PackageV1$$serializer.deserialize(PackageV1.kt:28)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:70)
at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableElement(StreamingJsonDecoder.kt:162)
at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:533)
at kotlinx.serialization.internal.CollectionLikeSerializer.readElement(CollectionSerializers.kt:80)
at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
WM-WorkerWrapper com.looker.droidify.debug E at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:70)
at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableElement(StreamingJsonDecoder.kt:162)
at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:533)
at kotlinx.serialization.internal.MapLikeSerializer.readElement(CollectionSerializers.kt:111)
at kotlinx.serialization.internal.MapLikeSerializer.readElement(CollectionSerializers.kt:84)
at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:70)
at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableElement(StreamingJsonDecoder.kt:162)
at org.fdroid.index.v1.IndexV1$$serializer.deserialize(IndexV1.kt:13)
at org.fdroid.index.v1.IndexV1$$serializer.deserialize(IndexV1.kt:13)
at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:70)
at kotlinx.serialization.json.internal.JsonStreamsKt.decodeByReader(JsonStreams.kt:38)
at kotlinx.serialization.json.JvmStreamsKt.decodeFromStream(JvmStreams.kt:59)
at org.fdroid.index.IndexParserKt.parseV1(IndexParser.kt:25)
at com.looker.core.data.fdroid.sync.signature.IndexValidator$getIndexAndFingerprint$2.invokeSuspend(IndexValidator.kt:44)
at com.looker.core.data.fdroid.sync.signature.IndexValidator$getIndexAndFingerprint$2.invoke(Unknown Source:8)
at com.looker.core.data.fdroid.sync.signature.IndexValidator$getIndexAndFingerprint$2.invoke(Unknown Source:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:167)
at kotlinx.coroutines.BuildersKt.withContext(Unknown Source:1)
at com.looker.core.data.fdroid.sync.signature.IndexValidator.getIndexAndFingerprint(IndexValidator.kt:37)
at com.looker.core.data.fdroid.sync.signature.IndexValidator.access$getIndexAndFingerprint(IndexValidator.kt:17)
at com.looker.core.data.fdroid.sync.signature.IndexValidator$validate$2.invokeSuspend(IndexValidator.kt:22)
at com.looker.core.data.fdroid.sync.signature.IndexValidator$validate$2.invoke(Unknown Source:8)
at com.looker.core.data.fdroid.sync.signature.IndexValidator$validate$2.invoke(Unknown Source:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78)
at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:167)
at kotlinx.coroutines.BuildersKt.withContext(Unknown Source:1)
at com.looker.core.data.fdroid.sync.signature.IndexValidator.validate(IndexValidator.kt:21)
at com.looker.network.KtorDownloader$downloadToFile$2.invokeSuspend(KtorDownloader.kt:77)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.UndispatchedCoroutine.afterResume(CoroutineContext.kt:270)
at kotlinx.coroutines.AbstractCoroutine.resumeWith(AbstractCoroutine.kt:102)
WM-WorkerWrapper com.looker.droidify.debug E at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:46)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:103)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)```
ProGuard :thinking:
ProGuard 🤔
In debug builds tho
Not select text for copy