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

我在一个商业Android应用程序工作。我还使用了一些在不同许可证类型下获得许可的库,其中一些库说明了以下内容:

如果图书馆有"通知" 如果文件包含归属说明,则在分发时必须包含该通知

(其中一个是根据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文件:

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在APK META-INF / LICENSE.txt中复制的重复文件

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

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

Flowryn asked 2019-08-13T10:11:06Z
6个解决方案
47 votes

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

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

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

Marc Plano-Lesay answered 2019-08-13T10:11:26Z
32 votes

将以下内容添加到相应的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'
    }
Max Droid answered 2019-08-13T10:11:51Z
4 votes

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

那么你不应该在android studio里面添加firebase库即file->项目结构 - > cloud-> firebase

你必须只做两者之一,在Android应用程序中使用firebase。

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

aMighty answered 2019-08-13T10:12:37Z
0 votes

您可以在gradle中添加多个许可证,请参阅此处

Akhil Jayakumar answered 2019-08-13T10:13:02Z
0 votes

我认为你需要在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'
    }
}
S.sadham hussain answered 2019-08-13T10:13:21Z
-2 votes

当然它会奏效

packagingOptions {
 exclude 'META-INF/LICENSE.txt'
 exclude 'META-INF/NOTICE.txt'   }
Mahendran Candy answered 2019-08-13T10:13:46Z
translate from https://stackoverflow.com:/questions/33923461/how-do-i-resolve-duplicate-files-copied-in-apk-meta-inf