Tengo un paquete con algunas clases de datos y estoy tratando de acceder al constructor en tiempo de ejecución usando Kotlin reflection clazz.primaryConstructor . Todo funciona como se esperaba, pero cuando habilito R8, los metadatos de las clases de datos se eliminan, por ejemplo, cuando verifico si el KClass isData devuelve falso y el constructor principal también es nulo, lo que ocurre solo cuando se habilita R8. Intenté todo, incluso agregar la anotación @keep a todas las clases de datos y agregar una regla para mantener todo en el paquete de modelos, también agregué estas reglas
-keep class kotlin.reflect.** -keep class kotlin.Metadata { *; }pero aún no tuve suerte, ¿alguna idea de qué está pasando o cómo solucionarlo?
Gracias por adelantado.
Lo que resultó ser el problema es que R8 incluido con AGP 7.0 (versión con Android Studio - Arctic Fox ) no maneja correctamente los metadatos de Kotlin para Kotlin 1.6.0.
Si usa Kotlin 1.6.0 ( classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0" ) con AGP 7.0, se requiere la versión 3.0.77 de R8 para reducir las bibliotecas de Kotlin y usar kotlin-reflect . Actualizar a AGP 7.0.4 no es suficiente, ya que esa versión se incluye con R8 3.0.76.
Para usar R8 3.0.77, agregue lo siguiente a su settings.gradle o settings.gradle.kts :
pluginManagement { buildscript { repositories { mavenCentral() maven { url = uri("https://storage.googleapis.com/r8-releases/raw") } } dependencies { classpath("com.android.tools:r8:3.0.77") classpath('com.google.guava:guava:30.1.1-jre') } } }Otra opción para AGP 7.0 es usar Kotlin 1.5.31.
También considere alinear su versión de kotlin-reflect con la versión del compilador de Kotlin.