在gradle android库kotlin项目中禁用META-INF / *生成

美好的一天。 我写了一个kotlin android库并将其上载到bintray。 但是当我尝试在某些项目中使用它(通过gradle编译)时,它无法生成以下错误:

> 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文件,它们都包含了带有library_release.kotlin_module文件的META-INF文件夹。 但更重要的是生成.aar(在bintray发布的Android存档)包含此文件夹以及此文件。 我已经检查了其他像样的bintray android库,它们似乎没有包含任何META-INF文件。 但是包含它的那些(在大多数情况下它们包含许可证文件)会产生相同的DuplicateFileException ,解决它的方法是在use-project的gradle文件中明确地排除它们。

这个library_release.kotlin_module文件有什么用处,我怎样在发布期间禁用它的生成? 因为我不想明确地排除使用这个库的每个项目,我也不想问其他开发者这样做。

这是图书馆的回购: https : //github.com/arslancharyev31/Anko-ExpandableTextView/它是bintray回购: https ://bintray.com/arslancharyev31/android/Anko-ExpandableTextView

.kotlin_module文件的原始目的是将包映射到已编译的类文件中。 编译器使用它们来解析附加到项目的库中的顶级函数调用。 此外,Kotlin反射使用.kotlin_module文件在运行时构建顶级成员元数据。 了解更多: 改进Java Interop:顶层函数和属性

鉴于此,您不想在图书馆项目中禁用他们的一代,因为这可能会破坏对图书馆的编译。

相反,您可以通过在应用程序build.gradle使用packagingOptions来清除重复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项目命名的。