如何解决“在APK META-INF / *中复制的重复文件”

时间:2015-11-25 18:02:29

标签: java android gradle

我正在使用商业Android应用程序。 我还使用了一些在不同许可证类型下许可的库,其中一些说明如下:

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

(其中一个是在 Apache License 2.0 下获得许可的。)

有多个图书馆。当我使用 gradle 或使用 Android 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

我在互联网和stackoverflow上找到的答案建议从包装中删除license.txt(notice.txt或其他可能会干扰此类文件的文件),方法是在build.gradle文件中添加以下内容:< / p>

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 ),许可证和通知文件应 包含

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

7 个答案:

答案 0 :(得分:47)

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

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

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

答案 1 :(得分:32)

将以下内容添加到相应的build.gradle文件

packagingOptions {
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/MANIFEST.MF'
    }

答案 2 :(得分:4)

我的申请遇到了同样的问题。 您需要确保没有添加任何库两次。 如果您已按照firebase文档进行操作 的 https://firebase.google.com/docs/android/setup

然后你不应该在android studio里面添加firebase库 即 file-&gt;项目结构 - &gt; cloud-&gt; firebase

你只需要两者中的一个,在Android应用程序中使用firebase。

最后清理并重新运行您的应用。

答案 3 :(得分:0)

您可以在gradle see this

中添加多个许可

答案 4 :(得分:0)

我认为你需要在build.gradle中只包含这些选项:

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
    }
}

答案 5 :(得分:0)

作为 Marc Plano-Lesay 答案的替代方案,您还可以合并文件:

packagingOptions {
    merge "META-INF/license.txt"
}

参考:Gradle API 4.2 Packaging Options

答案 6 :(得分:-2)

肯定会有用

packagingOptions {
 exclude 'META-INF/LICENSE.txt'
 exclude 'META-INF/NOTICE.txt'   }