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

2022-08-31 11:11:16

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

如果库有一个带有归属说明的“通知”文件,则在分发时必须包含该声明

(例如,其中之一是在Apache许可证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

到目前为止,我在互联网上找到的答案和stackoverflow建议通过向文件添加以下内容,从打包中删除许可证.txt(注意.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许可证2.0),应包含许可证和通知文件。

我的问题:如何将多个与许可相关的文件(如许可证.txt通知.txt等)从 gradle 添加到我的项目中,以便与许可证兼容(技术细节:许可证文本将被串联)?


答案 1

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

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

除此之外,Google还发布了一个Gradle插件来管理依赖许可证。请参阅此处。我没有尝试过,但看起来它能够聚合每个依赖项,甚至可以生成显示所有这些许可证的活动。


答案 2

将以下内容添加到相应的 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'
    }

推荐