Deshabilitar la generación META-INF / * en el proyecto gradle android library kotlin

Buen día. Escribí una biblioteca de Android Kotlin y la cargué en bintray. Pero cuando bash usarlo (a través de la compilation gradle) en algún proyecto, no se genera con los siguientes errores:

> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/library_release.kotlin_module File1: C:\Users\Charlie\.android\build-cache\2939fbc6b0336396c9c4912d615880645b2c729d\output\jars\classes.jar File2: C:\Users\Charlie\OneDrive\Dev\Projects\AndroidStudio\MetuCardLib\demo\build\intermediates\bundles\default\classes.jar 

He buscado estos dos files .jar y ambos contenían la carpeta META-INF con el file library_release.kotlin_module . Pero lo que es más importante, el .aar generado (el file android publicado en bintray) contenía esta carpeta además de este file. He revisado otras bibliotecas de Android dignas de bintray y no parecen include ningún file META-INF . Sin embargo, aquellos que sí lo incluyen (en la mayoría de los casos contienen files de licencia) producen la misma DuplicateFileException y la manera de resolverlo es excluyéndolos explícitamente en el file gradle de use-project.

¿Para qué sirve este file library_release.kotlin_module y cómo puedo deshabilitar su generación durante la publicación? Porque no quiero excluir explícitamente de cada proyecto que usa esta biblioteca y no quiero pedirle a otros desarrolladores que lo hagan.

Aquí está el repo de la biblioteca: https://github.com/arslancharyev31/Anko-ExpandableTextView/ Y es bintray repo: https://bintray.com/arslancharyev31/android/Anko-ExpandableTextView

El propósito original de los files .kotlin_module es almacenar el mapeo de partes del package en los files de class comstackdos. El comstackdor los usa para resolver llamadas de function de nivel superior en una biblioteca adjunta al proyecto. Además, Kotlin reflection utiliza los files .kotlin_module para build los metadatos de los miembros de nivel superior en el time de ejecución. Ver más: Mejorando la interoperabilidad de Java: Funciones y properties de nivel superior

Dado que, no desea deshabilitar su generación en proyectos de biblioteca, porque podría romper la compilation contra las bibliotecas.

En su lugar, puede deshacerse de los duplicates utilizando packagingOptions en su aplicación build.gradle , como se build.gradle aquí :

 android { // ... packagingOptions { exclude 'META-INF/library_release.kotlin_module' } } 

Nota: excluir estos files de una aplicación APK interfiere con la reflexión en el time de ejecución y, por lo tanto, tampoco es la mejor solución.


Otra opción es usar nombres de modules únicos en sus bibliotecas:

 compileReleaseKotlin.kotlinOptions.freeCompilerArgs += ["-module-name", "my.library.id"] 

Elija la tarea que produce la salida que luego se empaqueta en el AAR. Puede que no sea compileReleaseKotlin , y también tenga en count que hacer esto podría afectar la compilation de testings para esta variante.

O, lo que es más confiable, simplemente elija nombres de modules de Gradle únicos, ya que el module Kotlin lleva el nombre del proyecto Gradle.

  • Cómo pasar los valores de actividad a otra actividad en kotlin
  • Kotlin Objetos de carga demorada
  • La compilation de la aplicación Kotlin para Android falló con el post: Referencia no resuelta: kotlinx
  • La reference de identificación de Kotlin Textview no funciona con caracteres no ingleses
  • Servicio VPN local de Android: no se puede get respuesta
  • Android Studio / Kotlin: error no válido "El método de anulación debería llamarse super"
  • Convierta un ArrayMap en ArrayList - Kotlin
  • Kotlin sintético en adaptador o ViewHolder
  • registerReceiver () muestra error por método sobrecargado
  • La function Kotlin requiere nada, pero se define como un tipo diferente
  • Cómo inicializar widgets en Android usando kotlin