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

时间:2017-07-21 08:07:09

标签: android gradle android-gradle kotlin kotlin-android-extensions

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

使用此library_release.kotlin_module文件的原因是什么?如何在发布期间禁用其生成?因为我不想明确地从每个使用此库的项目中排除,我不想让其他开发人员这样做。

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

2 个答案:

答案 0 :(得分:9)

.kotlin_module文件的最初目的是将包部件映射存储到已编译的类文件中。编译器使用它们来解析附加到项目的库中的顶级函数调用。此外,Kotlin反射使用.kotlin_module文件在运行时构造顶级成员元数据。查看更多:Improving Java Interop: Top-Level Functions and Properties

鉴于此,您不希望在库项目中禁用它们的生成,因为它可能会破坏对库的编译。

相反,您可以在应用packagingOptions中使用build.gradle来摆脱重复项,如here所述:

android {
    // ...

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

注意:从应用程序中排除这些文件APK会在运行时干扰反射,因此也不是最佳解决方案。

另一种选择是在库中使用唯一的模块名称:

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

选择生成输出的任务,然后将其打包到AAR中。  它可能不是compileReleaseKotlin,并且还注意到这样做可能会影响此变体的测试编译。

或者,更可靠的是,只需选择唯一的Gradle模块名称,因为Kotlin模块以Gradle项目命名。

答案 1 :(得分:1)

当更简单的模块名称发生冲突时,我能够通过将模块重命名为 uniquem 来解决此问题。