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

Flo*_*ryn 91 java android gradle

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

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

(其中一个是根据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
Run Code Online (Sandbox Code Playgroud)

我在互联网和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'
}
Run Code Online (Sandbox Code Playgroud)

请参阅示例:Android Studio 0.4在APK META-INF/LICENSE.txt中复制的重复文件

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

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

Mar*_*say 47

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

packagingOptions {
   pickFirst  'META-INF/license.txt'
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你找到了自动连接许可证的方法,我全都听见了! (3认同)

Max*_*oid 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'
    }
Run Code Online (Sandbox Code Playgroud)

  • 这不包括对他们中的大多数人来说明确违反其条件的许可证。 (2认同)