Gradle完成时出现非零退出值1 (ic_launcher.png:错误:重复文件)。

75

我在使用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 这个classpath后,就导致出现错误。


5
目前最后一个稳定的Gradle插件版本是1.1.3,请使用它。 - Gabriele Mariotti
是的,将 com.android.tools.build:gradle:1.1.3 降级解决了我的问题,谢谢! - Fayçal
1
简而言之:这是由于“ic_launcher”重复导致的。摆脱它们 - 删除或重命名即可。 - Ujjwal Singh
请参考以下链接:https://dev59.com/814b5IYBdhLWcg3wYAb6#32350792 - Pranav
13个回答

109
根据Xavier Durochet在G+上的解释,这是由于您使用的库之一有自己的ic_launcher.png -- 当然他们不应该有(底部更多相关内容)。
很可能日志中提到的两个图标是不同的:一个是您自己的图标,另一个很可能是某个人忘记从库中删除的通用Android图标。
要查看有问题的依赖项,请连续按Ctrl + Shift + N两次(用于非项目匹配),并键入ic_launcher.png(请参见截图上的最后一行)。

为了暂时解决这个问题,请在drawable资源文件夹中添加-v4限定符(或者如果有理由的话,将ic_launcher.png移动到*dpi-v4中)--感谢Xavier Durochet提供的解决方案。您也可以将图标重命名为其他名称,并对AndroidManifest.xml进行相应更改。

enter image description here

真正的问题在于有冲突的库携带了无用的图标。具有自己资源的库(例如ActionBarSherlock或Google自己的Support v7库)使用独特的命名方案来避免与您的资源名称冲突(abs_abc_)。
启动器图标不应该出现在库中,因此我鼓励您通知您正在使用的库的作者,他们忘记删除多余的ic_launcher.png文件。
另外值得一提的是,正如Barry Carroll同一讨论中非常精确地指出的那样,这并不意味着您的资源永远不应该重叠库中的资源:有很多合法的理由可以使用自己的资源覆盖库的资源(例如更改库提供的活动的外观),gradle插件的资源合并逻辑也允许这样做。
只是在这种特殊情况下,当lib的android gradle插件版本落后于(pre-1.2.2)时,冲突会发生。在这种情况下,资源最终出现在两个不同的*dpi文件夹中 -- 带有和不带有-v4限定符;但它们实际上位于同一个资源“bucket”中,因此系统认为它们是重复的。这个故障确实会导致无用的ic_launcher.png覆盖(实际上是由于故障引起的冲突),但对于其他类型的资源来说,这种情况并不普遍糟糕。也就是说,有时你会有意地覆盖一个lib的资源,而这个故障仍然会导致错误消息弹出。这时,资源名称没有真正的问题,所以上面的临时解决方案或者保持插件版本是可行的方法。

2
此外,使用最新的gradle/build工具重新构建相同的库也可以解决该问题。 - danb
我相当确信我的设置是最新的:构建工具v 22.0.1,gradle v 1.2.2。 - Ivan Bartsov
UPD哦,正在重建,抱歉,一开始看错了 :) 在我的情况下,这将是对库作者的建议。只是好奇 - 有什么想法可以解决这个问题吗?重建库是否具有drawable-*dpi中的可绘制对象而没有-v4后缀?如果我正确理解Xavier的话,gradleaapt之间存在故障,aapt应该在_我们的_应用程序资源中放置-v4,但实际上并没有这样做 - 所以我们最终会得到2对文件夹。因此,在aapt更新后,我们仍然会得到-v4文件夹,并且必须重新构建库,对吗? - Ivan Bartsov
请确保您的AndroidManifest.xml文件中没有对应用程序图标的错误引用。有时,ic_launcher.png可能位于mipmap/而不是drawables/目录中。 - JoachimR
这个问题会由Gradle/Android Studio自己解决,还是需要用户自己处理? - Akshat
显示剩余2条评论

27

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

为了解决它,我将我的ic_launcher.png文件从drawable文件夹移动到mipmap文件夹。问题已解决。

enter image description here


1
哇,Can,你救了我的半天和半夜。非常感谢你 ;) - Khai Nguyen
2
这应该是正确的答案!然后在清单中使用正确的文件更改标志或图标:@mipmap/ic_launcher - Guilherme Simão Couto
在较新版本的Android Studio/Gradle中,即使没有使用它的库,您也需要将ic_launcher放置在mipmap文件夹中(这将解决错误)。 - Renato Probst
如果要升级早期23版本的构建工具到23+,则应该接受此答案。 - tom nobleman

19

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


我的版本是1.2.3,但仍然存在相同的问题。 - Akshay
@Akshay 尝试使用 1.1.3 版本。 - Fayçal
13
什么是好的解决方案? - Fayçal
太好了,那个起作用了。希望他们很快修复1.2.3版本。 - Hamzeh Soboh
用户使用Gradle版本2.2.1和Android构建工具1.1.3(Y),谢谢。好的解决方案 :p - AZ_
显示剩余3条评论

14

以下是找到问题的一般方法:

运行

./gradlew build --stacktrace --info

你将会找到错误的详细信息。我发现我的错误:一个重复的类导致了一个顶层错误,删除重复的类将会解决这个问题。


@Praveen 很高兴能帮助你。 - herbertD
1
谢谢,这对我很有帮助。这是最有用的答案,因为这个问题有多个来源。 - biodiv

10

对我来说,进行简单的"清理项目"和"重新构建项目"即可解决问题。


这对我有用,但因为我在 Jenkins 上运行,所以使用 ./gradlew clean。谢谢! - epool

2
升级到1.2.3版本,但要确保您的项目和使用的aar中gradle和buildToolsVersion完全相同。
如果您使用外部库,无法控制gradle/build版本: 请联系作者或自行检查源代码。一些库中有未使用的启动器图标会导致冲突。删除这些图标将解决您的问题。在罕见的情况下,具有相同名称的资源(例如menu.xml)也可能导致此问题。一个简单的解决方法是重命名您的资源。

这解决了我的问题(也印证了Ivan Bartsov在“值得一提”部分的回答)。一个库项目(我从Eclipse导入)在其build.gradle中定义了一个较旧的“buildToolsVersion”。这导致gradle在构建使用该库的应用程序时失败,出现“重复文件”的垃圾。确保库的“buildToolsVersion”与应用程序的“buildToolsVersion”相同后,gradle停止了“成为一个可恶的gradle”,并编译了所有版本。难道没有一些lint检查或其他东西可以提供更好的错误描述吗? - dell116

1

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


如果您正在使用多个具有ic_launcher的库,则这不是解决方案。 - Daniel Wilson
我遇到了另一个不是ic_launcher的png文件出现了同样的问题,将其重命名后问题得到了解决。 - Tot Zam

1

我遇到了同样的问题,以下方法适用于我:

  • 将你的图标重命名
  • 在清单文件中的<application>标签中添加tools:replace="android:icon"

你可以尝试只做第一步,但是当合并清单文件时,我仍然遇到了问题。这种方法应该覆盖库中使用的任何资源。


1

只需重命名图像(右键单击图像,选择重构并选择重命名)。这将解决问题,因为问题已经出现,其中一个库也使用了相同名称的图像。


1
在我的情况下,我已经在strings.xml文件中添加了撇号s('s)。 检查一下是否有这样的错误,并删除它肯定会有帮助。 很烦人的是IDE不能正确显示错误,而是使所有资源不同步。 我知道这不是问题所要求的情况,但错误非常相似,即Gradle执行失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接