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 deshabilitar el button de punto en Android Kotlin
  • No se puede networkingucir una list de booleans en kotlin
  • ¿Insertar o agregar un elemento en ArrayList en Kotlin?
  • La biblioteca de Android no puede comstackr kotlin
  • Kotlinx inyecta vista desde el layout incorrecto
  • Extensión de Kotlin Any? .toString ()
  • Prueba unitaria de la function de extensión de Kotlin en las classs de Android SDK
  • Genéricos Java vs Kotlin
  • El complemento gradle de Android se queja de un error de traducción no detectada
  • Servicio VPN local de Android: no se puede get respuesta
  • Extienda la comprobación de Mockito para que Kotlin no funcione (de manera "kotlin")