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

标签 android gradle android-gradle-plugin kotlin kotlin-android-extensions

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

> 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 android 库,它们似乎不包含任何 META-INF 文件。但是那些确实包含它的(在大多数情况下它们包含许可证文件)会产生相同的 DuplicateFileException 并且解决它的方法是在 use-project 的 gradle 文件中明确排除它们。

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

这是图书馆的 repo :https://github.com/arslancharyev31/Anko-ExpandableTextView/ 它是 bintray 仓库:https://bintray.com/arslancharyev31/android/Anko-ExpandableTextView

最佳答案

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

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

相反,您可以通过在应用程序 build.gradle 中使用 packagingOptions 来消除重复项,如 here 所述:

android {
    // ...

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

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


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

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

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

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

关于android - 在 gradle android library kotlin 项目中禁用 META-INF/* 生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45232350/

相关文章:

java - 如何在同一个 onTimeSet() 中提取两个时间选择器对话框的小时和分钟?

android - uniqueUntilChanged 不起作用(例如,不同的列表大小不被视为不同)

java - Ubuntu 14.04 LTS 上的 Grails 出现奇怪的错误 .../3.1.5/grails-dependencies-3.1.5.jar'。从服务器 : Conflict 收到状态代码 409

spring-boot - 使用 Node Js 配置 Spring Boot-Gradle

android - 使用 gradle 模块作为具有特定风格的依赖项

android - 在 Android Studio 和 Gradle 中使用模块依赖

java - Android Gradle 插件导致的重复类

android - Adobe Media Server - 如何使用 Android 发布和播放直播视频

java - 无法直接将我的 .cert 文件 .key 配置为 gretty ssl config

react-native - 在模拟器 udara 上运行 React Native 项目时 spawnSync ./gradlew EACCES 错误