为什么需要gradle构建打包选项?

问题描述 投票:0回答:2

在我的 gradle 文件中,我有以下内容:

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

根据文档:

/**
 * Adds an excluded paths.
 * @param path the path, as packaged in the APK
 */

这是什么意思?有人能给我一个现实生活中的例子来说明为什么需要进行这些排除吗?

android gradle android-gradle-plugin build.gradle
2个回答
24
投票

如果您将几个

aar
文件的扩展名更改为
zip
并打开它们,最终您将得到两个
aar
文件,其中的文件具有相同的路径。

SomeDependency-A.aar
-META-INF/LICENSE
...

SomeDependency-B.aar
-META-INF/LICENSE
...

当合并

aar
依赖项时,它会失败,因为它尝试添加文件
LICENSE
并且它已经存在。

我们通过排除重复的文件来解决此问题

android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
    }
}

4
投票

对于 Kotlin DSL (build.gradle.kts) 和 Android Gradle Plugin (AGP) 版本 7.0.0 及更高版本,

exclude
方法已被弃用,取而代之的是
resources.excludes
属性:

android {
  // ...
  packaging { // or packagingOptions in AGP < 8.x
    resources.excludes += "META-INF/LICENSE*"
    resources.excludes += "META-INF/NOTICE.txt"
    // OR
    // resources.excludes += setOf(
    //   "META-INF/LICENSE*",
    //   "META-INF/NOTICE.txt"
    // )
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.