【问题标题】:Duplicate files copied in APK META-INF/library_release.kotlin_module在 APK META-INF/library_release.kotlin_module 中复制的重复文件
【发布时间】:2017-11-14 12:43:29
【问题描述】:

我最近通过JitPack添加了两个Android库,出现如下错误:

Duplicate files copied in APK META-INF/library_release.kotlin_module

我已清除缓存并尝试使用排除模块

exclude group: 'org.jetbrains'

exclude group: 'org.jetbrains.kotlin'

但似乎都没有解决问题。有什么方法可以阻止通过 JitPack 添加 kotlin stdlib?奇怪的是,像 DbFlow 这样的其他库没有这个问题,尽管我没有看到它们的设置有什么特别之处(除了它不是通过 JitPack 实现的)

【问题讨论】:

    标签: android kotlin conflicting-libraries


    【解决方案1】:

    您应该将此添加到您应用的build.gradle 文件中的android 标记内

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

    【讨论】:

    • 你知道文件本身在应用中是否有任何意义吗?还是只是作为信息存在?
    • 我从未见过在 Android 中排除那些 META-INF 文件的问题。顺便说一句,我对 Kotlin 的了解还不够,无法确定这在 100% 时是无用的。正如我在另一条评论中建议的那样,您应该先尝试排除,如果它正在工作,请继续使用它(应用程序会轻一些 KBs XD),如果不切换到 pickFirst ;)
    • 是不是说当我们切换到不同的buildType或者productFlavor时,同样的错误又出现了,因为它生成了新名字的文件?
    • 导致 Kotlin 类无法识别
    【解决方案2】:

    正如Kotlin M13 is out! jetbrains 的帖子中所建议的那样:

    确保这些 .kotlin_module 文件不会被您的打包过程剥离。

    所以,我们不能使用exclude 选项来排除这个资源文件的生成。

    正如Kotlin M13 is out! 中所述,我们应该:

    在 Maven 中,我们使用 groupId 和 artifactId 作为模块名称,但你可以说

    <configuration>
        <moduleName>com.example.mymodule</moduleName>
    </configuration>
    

    在 Gradle 中是项目名称 + 构建任务名称,用于自定义:

    compileKotlin {
        kotlinOptions.moduleName = "com.example.mymodule"    
    }
    

    这是我对Android库项目的配置:

    ext {
        GROUP_ID = 'custom.group.id'
        ARTIFACT_ID = 'artifactid'
    }
    
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.0"
    
        compileOptions {
            kotlinOptions.freeCompilerArgs += ['-module-name', "$GROUP_ID.$ARTIFACT_ID"]
        }
    
        defaultConfig {
            ...
        }
        buildTypes {
            ...
        }
    }
    

    将生成名为META-INF/custom.group.id.artifactId.kotlin_module 的资源文件,而不是META-INF/library_release.kotlin_module。不会再找到重复文件。

    您可以阅读此post 和此post 了解更多信息。

    【讨论】:

    • 是的,添加 compileOptions { kotlinOptions.freeCompilerArgs += ['-module-name', "$GROUP_ID.$ARTIFACT_ID"] } 解决了问题而且我认为它比仅仅排除更好
    • 我测试了两种解决方案(排除和这个),它们都有效并且没有明显的副作用。有人可以提供任何额外的论点 - 或示例 - 为什么一个比另一个更好?
    【解决方案3】:

    查看其他冲突后,似乎解决方法是

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

    在应用 gradle 中的 android 下。

    这允许构建 apk

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 2016-12-27
      • 2017-12-08
      • 1970-01-01
      • 2014-07-06
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多