Отключить генерацию META-INF / * в проекте kotlin

Добрый день. Я написал библиотеку андроида kotlin и загрузил его на bintray. Но когда я пытаюсь использовать его (через компиляцию града) в каком-то проекте, он не может построить со следующими ошибками:

> 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 

Я просмотрел оба этих файла .jar, и оба они содержали папку META-INF с файлом library_release.kotlin_module . Но более важно, сгенерированный .aar (архив андроидов, опубликованный в bintray), содержал эту папку, а также этот файл. Я проверил другие приличные библиотеки андроида bintray, и они, похоже, не содержат никаких файлов META-INF . Однако те, которые его включают (в большинстве случаев содержат файлы лицензий), производят одно и то же исключение DuplicateFileException и способ его устранения заключается в том, чтобы явно исключить их в файле gradle проекта-проекта.

Какая польза от этого файла library_release.kotlin_module и как я могу отключить его создание во время публикации? Потому что я не хочу явно исключать из каждого проекта, который использует эту библиотеку, и я не хочу просить других разработчиков сделать это.

Вот репозиторий библиотеки: https://github.com/arslancharyev31/Anko-ExpandableTextView/ И это bintray repo: https://bintray.com/arslancharyev31/android/Anko-ExpandableTextView

.kotlin_module целью файлов .kotlin_module является сохранение отображения частей пакета в скомпилированные файлы классов. Компилятор использует их для разрешения вызовов функций верхнего уровня в библиотеке, прикрепленной к проекту. Кроме того, отражение Kotlin использует файлы .kotlin_module для создания метаданных членов верхнего уровня во время выполнения. Подробнее: Улучшение Java Interop: функции и свойства верхнего уровня

Учитывая это, вы не хотите отключать свое поколение в библиотечных проектах, потому что это может нарушить компиляцию с библиотеками.

Вместо этого вы можете избавиться от дубликатов, используя build.gradle в своем приложении build.gradle , как сказано здесь :

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

Примечание. Исключение этих файлов из приложения APK мешает отражению во время выполнения и, следовательно, не является лучшим решением.


Другой вариант – использовать уникальные имена модулей в ваших библиотеках:

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

Выберите задачу, которая производит вывод, который затем упаковывается в AAR. Это может быть не compileReleaseKotlin , а также отметить, что это может повлиять на компиляцию тестов для этого варианта.

Или, что более надежно, просто выберите уникальные имена модулей Gradle, потому что модуль Kotlin назван в честь проекта Gradle.