Compare commits

...

1 commit

Author SHA1 Message Date
firelight
cdd2856b42
Update SerializationClassTester.kt 2026-06-06 17:13:03 +00:00

View file

@ -3,7 +3,7 @@ package com.lagradost.cloudstream3
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.AppUtils.toJson
import io.github.classgraph.ClassGraph import dalvik.system.DexFile
import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.InternalSerializationApi import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.KSerializer import kotlinx.serialization.KSerializer
@ -100,19 +100,27 @@ class SerializationClassTester {
} }
} }
// DEX files are the best solution to read all our classes dynamically.
// ClassGraph() can be used instead, but it only gives results on the JVM, not Android.
@Suppress("DEPRECATION")
private fun findSerializableClasses(packageName: String): List<KClass<*>> { private fun findSerializableClasses(packageName: String): List<KClass<*>> {
val context = InstrumentationRegistry val context = InstrumentationRegistry
.getInstrumentation() .getInstrumentation()
.targetContext .targetContext
return ClassGraph() val dexFile = DexFile(context.packageCodePath)
.enableClassInfo()
.enableAnnotationInfo() return dexFile.entries()
.overrideClassLoaders(context.classLoader) .toList()
.acceptPackages(packageName) .filter { it.startsWith(packageName) }
.scan() .mapNotNull {
.getClassesWithAnnotation(Serializable::class.java.name) runCatching { Class.forName(it).kotlin }.getOrNull()
.mapNotNull { runCatching { Class.forName(it.name, false, context.classLoader).kotlin }.getOrNull() } }.filter { kClass ->
// Not possible to use .hasAnnotation() on newer Android versions.
kClass.java.annotations.any {
it is Serializable
}
}
} }
@OptIn(InternalSerializationApi::class) @OptIn(InternalSerializationApi::class)