Cómo evitar que kotlin.Unit object sea eliminado por Proguard

Proguard stripes kotlin.Unit object independiente (en la biblioteca de time de ejecución Kotlin), y que causa un error de compilation si está utilizando este tipo. La siguiente regla no ayuda a mantener este elemento (quizás porque Unit no es una class , es un object ):

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

Usamos el tipo de Unidad de esta manera:

 fun assert(func : Assert.() -> Unit) = Assert().apply(func) 

¿Hay alguna solución para este problema o me falta algo?

En las reglas de Progaurd, los comodines después del nombre de la class indican classs anidadas. Así que deshazte de .** después de Kotlin.Unit :

 -keep class kotlin.Unit { *; } 

No es directamente relevante, pero si usa las collections de Kotlin, también debe agregar la siguiente regla de Proguard:

 -keep class kotlin.collections.CollectionsKt { *; } 

Dado que la Biblioteca estándar de Kotlin tiene su propio file Collections y contiene funciones de nivel superior y debido a que los files con funciones de nivel superior no son una class Java directa, debe usar el nombre que Kotlin usa convencionalmente para almacenar este file como una class Java. De la documentation de Kotlin:

Todas las funciones y properties declaradas en un file example.kt dentro de un package org.foo.bar se ponen en una class Java llamada org.foo.bar.ExampleKt.

El nombre de la class Java generada se puede cambiar utilizando la anotación @JvmName.

Y nuevamente no use el comodín .** después del nombre de la class aquí.

  • Kotlin, Proguard y lambdas
  • ProGuard hace que Gson devuelva LinkedTreeMap en lugar de mi tipo
  • Proguard y Kotlin-Reflect / Kotlin Anotaciones
  • ¿Cómo puedo ofuscar mi sdk codificado con kotlin (y deshacerme de Metadata)
  • Jackson no deserializa las classs de datos de Kotlin
  • Reglas de ProGuard para la reflexión de Kotlin