java - 如何解决 "Duplicate files copied in APK META-INF/*"

标签 java android gradle

我正在开发一个商业 android 应用程序。 我还使用了一些在不同许可类型下获得许可的库,其中一些说明如下:

如果图书馆有一个带有归属说明的“通知”文件,您必须在分发时包含该通知

(例如,其中一个是根据 Apache License 2.0 获得许可的)。

有不止一个图书馆。当我使用 gradleAndroid Studio 进行构建时,我收到以下构建错误:

* What went wrong:
Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/license.txt

到目前为止,我在 Internet 和 stackoverflow 上找到的答案建议通过添加到 build.gradle 从打包中删除 license.txt(notice.txt 或其他可能会干扰的文件)提交以下文件:

packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LGPL2.1'
}

例如:Android Studio 0.4 Duplicate files copied in APK META-INF/LICENSE.txt

根据这些库的许可(例如Apache License 2.0),应该包含许可和通知文件。 p>

我的问题:如何从 gradle 添加多个与许可相关的文件(例如 license.txtnotice.txt 等)进入我的项目以符合许可证(技术细节:许可证文本将被连接)?

最佳答案

如果您只有一个使用名称 license.txt 的许可证(阅读:所有 license.txt 副本都是相同的),则有一个解决方案:

packagingOptions {
   pickFirst  'META-INF/license.txt'
}

否则,Google 还发布了一个 Gradle 插件来管理依赖项许可证。见 here .我没有尝试过,但它看起来能够聚合每个依赖项,甚至生成一个显示所有这些许可证的 Activity 。

关于java - 如何解决 "Duplicate files copied in APK META-INF/*",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33923461/

相关文章:

android - PluginApplicationException : Failed to apply plugin class 'FlutterPlugin'

java - Google Dataflow/Dataprep Shuffle key 太大 (INVALID_ARGUMENT)

java - 设置系统属性的可能方法在哪里

java - 将字符数组中的小写字符转换为大写字符(java)

Android CSS布局不会使用全屏宽度

java - Android 上不一致的 SSLv3 握手失败

grails - 如何在Grails 3中更改应用程序名称?

java - 具有返回类型而不是 void 的性能影响是什么?

android - Cordova android 应用程序未在主屏幕上显示图标

android - 如何将项目导入Android Studio?