【问题标题】:Why are gradle build packagingOptions needed?为什么需要 gradle build PackagingOptions?
【发布时间】:2016-02-15 19:25:34
【问题描述】:

在我的 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
 */

这是什么意思?谁能给我一个真实的例子,说明为什么需要进行这些排除?

【问题讨论】:

  • 如果 2+ 个库包含这些文件,您将遇到构建冲突。由于您的 APK 中不需要这些文件,因此典型的解决方案是排除它们。
  • android{ buildTypes{ packagingOptions{...} } }android{ packagingOptions{...} }下设置这个有区别吗?
  • packagingOptions 闭包在 buildTypes 块上不可用。您通过将其放置在那里创建一个新的buildType

标签: android gradle android-gradle-plugin build.gradle


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    对于 Kotlin DSL 和 Android Gradle Plugin (AGP) 版本 7.0.0 及更高版本,exclude 方法已被弃用,取而代之的是 resources.excludes 属性:

    android {
      // ...
      packagingOptions {
        resources.excludes += "META-INF/LICENSE*"
        resources.excludes += "META-INF/NOTICE.txt"
        // OR
        // resources.excludes += setOf(
        //   "META-INF/LICENSE*",
        //   "META-INF/NOTICE.txt"
        // )
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-18
      • 2015-05-15
      • 2014-01-22
      • 1970-01-01
      • 2020-08-21
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多