Kotlin, Proguard y lambdas

Tengo una function clara que hace algo en una vista:

fun<T : View> Activity.withView(nr : Int, fn : T.()->Unit) { (findViewById(nr) as T?)?.fn() } 

Ahora, cuando uso esta function en mi actividad:

  withView<Spinner>(R.id.spinner_toolbar) { adapter = AdapterIndeksuDlaSpinnera(this@NewMainActivity, PlaylistIndex) 

… todo está bien hasta que use ProGuard. Puedo ver que AdapterIndeksuDlaSpinnera se destroza, como se esperaba, pero la aplicación falla cuando se prohíbe con "No se puede cargar la class AdapterIndeksuDlaSpinnera" (mientras que debería quejarse sobre el nombre del adaptador destruido).

Pude crear una solución temporal desactivando el cambio de todos los adaptadores que se pueden usar dentro de mi withView

 -keep class pl.qus.xenoamp.adapter.** { *; } 

pero no creo que sea una buena solución (¡y no tengo idea de qué otras classs pueden fallar de esta manera!). Entonces, ¿alguien puede explicar cuál es el problema y qué línea de ProGuard debo agregar para potencialmente arreglar incidencias similares de otras classs usadas dentro con withView ?

Esta es una pregunta difícil. En pocas palabras, Proguard no sabe nada sobre Kotlin. Está utilizando un análisis de código simple para detectar cosas como Class.forName() y Class.forName() , pero puede fallar para algo más complejo. .class search los files .class generados desde subdirectorys de build (¿puede publicar los más relevantes?) Para averiguar qué sucede realmente.

Por ahora puedes hacer dos cosas:

  • Pídales a los desarrolladores de Kotlin que agreguen soporte adecuado de ofuscación / optimization para el comstackdor de Kotlin: esta es realmente la manera correcta de hacer las cosas, como lo demuestran todos los comstackdores no java existentes;
  • Excluya sus propias fonts de la ofuscación (la mayoría de las actividades y vistas no van a estar bien ofuscadas de todos modos).
  • ProGuard hace que Gson devuelva LinkedTreeMap en lugar de mi tipo
  • Regla de Kotlin Proguard para enum?
  • Jackson no deserializa las classs de datos de Kotlin
  • Proguard y Kotlin-Reflect / Kotlin Anotaciones
  • Reglas de ProGuard para la reflexión de Kotlin
  • Proguard: no ofusque las classs de datos de Kotlin