Gradle finished with non-zero exit value 1 (ic_launcher.png: error: Duplicate file)

Gradle finished with non-zero exit value 1 (ic_launcher.png: error: Duplicate file)

我在使用 gradle 时遇到了这个奇怪的错误,请帮助我!

/.../app/build/intermediates/res/debug/drawable-xxhdpi-v4/ic_launcher.png:
    error: Duplicate file
/.../app/build/intermediates/res/debug/drawable-xxhdpi/ic_launcher.png:
    Original is here. The version qualifier may be implied.
Error:Execution failed for task ':app:processDebugResources'.
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException:
Process 'command '/.../sdk/build-tools/22.0.1/aapt'' finished with non-zero exit value 1

之前它运行正常,但是因为我把类路径com.android.tools.build:gradle:1.2.2,这导致我出错

根据 Xavier Durochet's explanation on G+,这是因为您使用的其中一个库拥有自己的 ic_launcher.png —— 他们当然不应该这样做(更多内容在底部)。

日志中提到的两个图标很可能是不同的:一个是您的,另一个很可能是有人忘记从库中删除的通用 android 图标。

要查看有问题的依赖项,请点击 Ctrl + Shift + N 两次 (对于非项目匹配)并输入 ic_launcher.png(请参阅最后一行截屏)

要暂时解决此问题,请将 -v4 限定符添加到您的可绘制资源文件夹(或仅将 ic_launcher.png 移动到 *dpi-v4如果你有你的理由)——解决方案归功于 Xavier Durochet。您也可以将您的图标重命名为其他名称并对 AndroidManifest.xml

进行相应的更改

真正的问题是有问题的库带有无用的图标。 有自己资源的库(比如 ActionBarSherlock 或 Google 自己的 Support v7 库)使用独特的命名方案以避免与您的资源名称冲突(abs_abc_)。

启动器图标在库中没有任何业务,因此我鼓励您通知您正在使用的库的作者他们忘记删除多余的 ic_launcher.png 文件。

还值得一提,因为 Barry Carroll noted very precisely in the same discussion,这并不意味着您的资源永远不应与图书馆中的资源重叠:有很多 合法 有理由用您自己的资源覆盖库的资源(例如,更改库提供的 activity 的外观)和 gradle 插件的资源合并逻辑确实允许这样做,故意的。

只是在这种特殊情况下,当库落后于 android gradle 插件版本(1.2.2 之前)时会发生冲突,在这种情况下,资源最终分为两部分不同的 *dpi 文件夹——有和没有 -v4 限定符;但它们实际上在同一个资源中 "bucket" 所以系统认为它们是重复的。

这个故障 确实 带来了无用的 ic_launcher.png 覆盖(实际上是碰撞——由于故障)但这种情况对其他类型来说并不是普遍的坏资源。

即有时你故意覆盖一个库的资源,这个故障仍然会导致错误消息弹出。这次资源名称没有真正的问题,所以上面的临时解决方案或阻止插件版本是可行的。

降级到 com.android.tools.build:gradle:1.1.3 解决了我的问题

我在使用第三方库时遇到了同样的问题。(RomainPiel/Shimmer-android Github 上的库)

为了解决这个问题,我将 ic_launcher.png 文件从 drawable 文件夹移到了 mipmap 文件夹。问题解决了。

升级到 1.2.3,但确保您的 gradle 和 buildToolsVersion 在您的项目和使用的 aars 中相同。

如果您使用无法控制 gradle/build 版本的外部库: 联系作者或自行查看来源。一些库有未使用的启动器图标,这将导致此冲突。删除此图标将解决您的问题。在极少数情况下,同名来源(例如 menu.xml)也可能导致此问题。一个简单的解决方法是重命名您的资源。

只需将 ic_launcher.png 重命名为其他名称(例如 ico_launcher.png)

这里是查找问题的一般方法:

运行

./gradlew build --stacktrace --info

并且您会找到错误的详细信息。 我发现了我的错误:重复的 class 导致了顶级错误,删除重复的将解决问题。

对我来说,简单的 "clean project" 和 "rebuild project" 就可以了。

关注这个linkHere

像这样改变。

repositories {
maven {url "https://clojars.org/repo/"}
}
dependencies {
compile 'frankiesardo:icepick:{{latest-version}}'
**provided** 'frankiesardo:icepick-processor:{{latest-version}}'
}

在我的例子中,我在 strings.xml 文件中添加了撇号 ('s)。 请检查人员是否有任何此类错误并将其删除肯定会有所帮助。 IDE 无法正确显示错误,而是使所有资源不同步,这太烦人了。

我知道问题中的情况并非如此,但错误完全相同,即 Gradle 执行失败。

只是 Rename Image (Rightclick on the Image, Select Refactor and select Rename)。它将解决问题,因为问题已经出现,因为 library 之一也在使用 imagesame name

我遇到了同样的问题,下面的内容对我有用:

  • 重命名您的图标
  • tools:replace="android:icon" 添加到清单中的 <application> 标签

您可以只尝试第一步,但我在合并清单文件时仍然遇到问题。这样它应该覆盖库中使用的任何资源。

更新到最新的 gradle 插件 1.5.0 解决了这个问题。在根 build.gradle 文件

中更新以下脚本
buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
    ...
}

我设法通过文件扩展名的大小写不一致触发了这个问题。我在一个 drawable 目录中有一个 .jpg 图像,但在不同的 drawable 目录中有一个相同文件名但 .JPG 的图像。文件名和目录正确,但扩展名不正确。