当前位置: 首页 > 知识库问答 >
问题:

将库添加到Android项目后出现错误(发现多个文件的操作系统独立路径为“META-INF/kot linx-io . kot Lin _ module”)

蒋英博
2023-03-14

我一直在玩在Android Studio 3.3(新空项目)中创建的“Hello World”项目,并决定在该项目中添加一个库(ktor)。我按照README说明,简单地将所需的东西添加到gradle文件中。当我使用web套接字时,以下行已添加到应用程序的gradle构建文件中:

    implementation "io.ktor:ktor-client-websocket:$ktor_version"
    implementation "io.ktor:ktor-client-cio:$ktor_version"
    implementation "io.ktor:ktor-client-android:$ktor_version"
    implementation "io.ktor:ktor-client-cio:$ktor_version"

添加这些后,项目立即停止编译,我收到以下错误:

More than one file was found with OS independent path 'META-INF/kotlinx-io.kotlin_module'

有人能解释一下为什么我会有这个错误吗?我没有做任何违法的事情,我只是在Android Studio中创建的简单、标准的空项目中添加了库,不知何故在添加了一个新的依赖项后,事情停止了正常工作。

我在StackOverflow和GitHub Issues上发现了一些类似的问题,但我没有找到一个很好的解释为什么会发生这种情况以及如何防止此类错误。我刚刚找到了一堆快速简短的答案/解决方案,以一种“将其添加到您的项目配置中,它会起作用,相信我,我是专家”的方式编写,但我对此并不满意,因为我认为作为开发人员,我必须了解我在做什么以及为什么它以这种方式工作,IMO 只是添加不完全理解的东西是不专业的, 希望它能解决问题。

所以,我尽力去理解这个问题。就我根据其他答案所理解的情况而言,问题来自于这样一个事实,即我的项目中有一个库的两个实例(?),所以Gradle不知道该选哪一个。但那我就不明白怎么了?(我没有添加任何其他“外部依赖项”)

对于解决方案,最常见的答案是添加'META-INF/kotlinx-io。kotlin_module'转换为excludePath打包选项,但我不明白为什么它应该是正确的。对我来说,这听起来像是在告诉构建系统“请从我的项目中排除这些路径/不要扫描它们以查找库”。但我不确定这是否是一种正确的方法,因为在这种情况下,我有效地从项目中排除了几个库/依赖项,这可能会导致运行时异常NoClassDefFoundError或将来类似的情况。

第二个最常见的答案是将pickFirst'META-INF/kotlinx-io.kotlin_module'添加到打包选项中,这看起来更好一些,因为它告诉构建系统“当你有多个库的条目时,请拿走你找到的第一个”,即库将被包含在我的项目中,所以我是安全的, 但是作为一个来自C / C / Rust / System_Programming世界的人,我仍然对这个解决方案感到担忧:就C(简化)而言,让我们想象一下,我最终拥有2个不同版本(1.1,1.2)的2个库,并且我有一个头文件,它希望我链接到库的v.1.2, 如果我选择了错误的版本库(1.1),但使用较新的版本库并期望它有效,那么......它显然不起作用,我认为同样的问题可能会发生在 Android 上(但我不确定,因为我不是专家),即 pickFirst 似乎是一个很好的解决方案,只要我们可以保证我们使用的库的“多个条目”具有相同的版本。

因此,我现在尝试使用pickFirst方法,最终在gradle构建文件中添加了一个部分:

    packagingOptions {
        pickFirst 'META-INF/kotlinx-io.kotlin_module'
        pickFirst 'META-INF/atomicfu.kotlin_module'
        pickFirst 'META-INF/kotlinx-coroutines-io.kotlin_module'
    }

这做了工作,但我仍然不确定这是否是最佳解决方案。我认为正确的方法应该是理解错误发生的原因,并消除其根本原因,而不是尝试使用其他打包选项来解决问题。

共有1个答案

左丘耀
2023-03-14

Android不需要APK包的< code>META-INF目录中的任何这些文件。

META-INF目录中的这些重复文件源自引用的库-

除了使用packagingOptions之外,没有其他事情可做。

另请参见:META-INF的目的是什么?(AndroidAPK!=JavaJAR)。

这些确实是类似的包格式,但仍然不完全相同。

 类似资料: