es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Los metadatos de la clase de datos se eliminan con proguard / R8 para Kotlin 1.6.0.

Tengo un paquete con algunas clases de datos y estoy tratando de acceder al constructor en tiempo de ejecución utilizando la reflexión de Kotlin clazz.primaryConstructor.
Todo está funcionando como se esperaba, pero cuando habilito R8, los metadatos de las clases de datos se eliminan, por lo que, por ejemplo, cuando verifico si el KClass esData, devuelve falso y el constructor principal también es nulo, lo cual solo ocurre al habilitar R8.
He intentado de todo, incluso agregar la anotación @keep a todas las clases de datos y agregar una regla para conservar todo en el paquete de modelos. También agregué estas reglas:

-keep class kotlin.reflect.**
-keep class kotlin.Metadata { *; }

pero aún sin suerte, ¿alguna idea de qué está saliendo mal o cómo solucionarlo?

Gracias de antemano.

Repositorio de muestra: https://www.github.com/ahmadmssm/DataClassR8

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Problema con Kotlin Reflection y R8

    Como experto en TI especializado en Android, Kotlin, Proguard, Android-R8 y Kotlin-Reflect, el problema que estás enfrentando parece estar relacionado con la eliminación de metadatos de las clases de datos por parte de R8. Esto resulta en la incapacidad de identificar si una clase es una clase de datos o no, y también provoca que el constructor principal sea nulo.

    Solución

    Ya has intentado agregar la anotación @keep a todas las clases de datos y agregar una regla para mantener todo en el paquete de modelos, pero aún no has encontrado una solución. Aquí hay algunas cosas más que puedes hacer:

    1. Intenta agregar la siguiente regla:

      -keep class com.sample.app.models.** { *; }

      Esto mantendrá todo en el paquete de models.

    2. Modifica la siguiente regla:

      -keep class kotlin.** { *; }

      a

      -keep class kotlin.reflect.** { *; }

      Esto asegurará que el paquete kotlin.reflect no sea eliminado por R8.

    3. Asegúrate de que R8 no esté eliminando ninguna clase:

      -dontobfuscate

      Esto evitará que R8 elimine cualquier clase y, por lo tanto, puede solucionar tu problema.

    4. Si ninguna de las soluciones anteriores funciona, puedes intentar deshabilitar R8 agregando lo siguiente a tu archivo gradle.properties:

      android.enableR8=false

      Esto desactivará R8 y puede solucionar tu problema. Sin embargo, no se recomienda desactivar R8, ya que proporciona optimizaciones importantes para tu aplicación.

    Puedes probar estas soluciones una por una para ver si funcionan para ti. Si el problema persiste después de probar todas estas soluciones, puedes considerar buscar ayuda en la comunidad de Kotlin o Android.

    Espero que esto te ayude a resolver tu problema. ¡Buena suerte!

Comments are closed.