Gradle beendet mit einem Exit-Wert ungleich Null 1 (ic_launcher.png: Fehler: Doppelte Datei)


75

Ich habe diesen seltsamen Fehler mit gradle, bitte hilf mir!

/.../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

Bevor es normal funktionierte, aber da ich den Klassenpfad com.android.tools.build:gradle:1.2.2 eingefügt habe , verursacht dies Fehler


5
Derzeit ist das letzte stabile Gradle-Plugin 1.1.3. Benutze es.
Gabriele Mariotti

Ja, ein Downgrade auf com.android.tools.build:gradle:1.1.3 hat mein Problem behoben, danke!
Back Packer

1
Kurzum: Es liegt an den ic_launcherDuplikaten.
Werde

Antworten:


109

Laut Xavier Durochets Erklärung zu G + liegt es daran, dass eine der Bibliotheken, die Sie verwenden, eine eigene hat ic_launcher.png- was sie natürlich nicht sollten (mehr dazu unten).

Wahrscheinlich unterscheiden sich die beiden im Protokoll genannten Symbole: eines gehört Ihnen und eines ist höchstwahrscheinlich das generische Android-Symbol, das jemand vergessen hat, aus der Bibliothek zu entfernen.

Um die störende Abhängigkeit zu sehen, drücken Sie Ctrl + Shift + N zweimal (für Nicht-Projekt-Matching) und geben Sie ein ic_launcher.png(siehe letzte Zeile auf dem Screenshot). Geben Sie hier die Bildbeschreibung ein

Um das Problem vorübergehend -v4zu umgehen , fügen Sie das Qualifikationsmerkmal zu Ihren zeichnbaren Ressourcenordnern hinzu (oder wechseln Sie einfach ic_launcher.pngzu, *dpi-v4wenn Sie Ihre Gründe haben) - Gutschriften an Xavier Durochet für die Lösung. Sie können Ihr Symbol auch einfach in etwas anderes umbenennen und entsprechende Änderungen an vornehmenAndroidManifest.xml

Geben Sie hier die Bildbeschreibung ein

Das eigentliche Problem ist, dass die beleidigende Bibliothek die nutzlosen Symbole enthält. Bibliotheken mit eigenen Ressourcen (wie ActionBarSherlock oder Googles eigene Support v7-Bibliothek) verwenden unterschiedliche Namensschemata, um Kollisionen mit Ihren Ressourcennamen ( abs_, abc_) zu vermeiden .

Launcher-Symbole haben nichts damit zu tun, sich in einer Bibliothek zu befinden. Ich empfehle Ihnen daher, den Autor der von Ihnen verwendeten Bibliothek darüber zu informieren, dass er vergessen hat, die redundanten ic_launcher.pngDateien zu entfernen .

Erwähnenswert ist auch , wie Barry Carroll in derselben Diskussion sehr genau bemerkte , dass Ihre Ressourcen niemals die in der Bibliothek überschneiden sollten: Es gibt viele legitime Gründe, die Ressourcen einer Bibliothek mit Ihren eigenen zu überschreiben (z. B. das Aussehen zu ändern Dies ermöglicht dies absichtlich durch die Zusammenführungslogik des Gradle-Plugins.

Es ist nur so, dass in diesem speziellen Fall der Konflikt auftritt, wenn die Bibliothek in der Android Gradle Plugin-Version (vor 1.2.2) zurückliegt. In diesem Fall landen Ressourcen in zwei verschiedenen *dpiOrdnern - mit und ohne -v4Qualifizierer. Sie befinden sich jedoch tatsächlich in derselben Ressource "Bucket", sodass das System sie als doppelt betrachtet.

Dieser Fehler führt zwar zu einer nutzlosen ic_launcher.pngÜbersteuerung (eigentlich eine Kollision - aufgrund des Fehlers), aber diese Situation ist für andere Arten von Ressourcen nicht allgemein schlecht.

Das heißt, manchmal überschreiben Sie absichtlich die Ressource einer Bibliothek, und dieser Fehler führt immer noch dazu, dass die Fehlermeldung angezeigt wird. Dieses Mal gibt es kein wirkliches Problem mit Ressourcennamen. Daher ist die obige temporäre Lösung oder das Zurückhalten der Plugin-Version der richtige Weg.


2
Darüber hinaus wird das Problem behoben, wenn dieselbe Bibliothek mit den neuesten Gradle / Build-Tools neu erstellt wird.
Danb

Ich bin mir ziemlich sicher, dass mein Setup auf dem neuesten Stand ist: Build Tools v 22.0.1, Gradle v 1.2.2
Ivan Bartsov

UPD oh, die Bibliothek wieder aufzubauen , sorry, das auf den ersten Blick falsch verstanden :) Das wäre in meinem Fall ein Vorschlag für die Autoren der Bibliothek. Nur neugierig - eine Idee, warum das Problem dadurch behoben wird? Hat die Wiederherstellungsbibliothek ihre Drawables drawable-*dpiohne das -v4Suffix? Wenn ich Xavier richtig verstanden habe, gibt es einen Fehler zwischen gradleund aapt, aaptder -v4in die Ressourcen unserer App aufgenommen werden sollte, dies aber nicht tut - so dass wir am Ende zwei Ordnerpaare haben. aaptFolglich werden wir nach der Aktualisierung immer noch -v4Ordner haben und die Bibliothek muss erneut erstellt werden, oder?
Ivan Bartsov

Mein Verständnis ist, dass das Gradle-Plugin verwendet wurde, um das -v4 hinzuzufügen, und jetzt nicht mehr. Solange Sie auf beiden Seiten Versionen verwenden, die entweder -v4 hinzufügen oder nicht, funktioniert alles einwandfrei. Aber es ist möglich, dass ich falsch verstanden habe :) Auf jeden Fall habe ich eine unserer Bibliotheken mit den neuesten Sachen neu aufgebaut und das Problem ist verschwunden.
Danb

Stellen Sie außerdem sicher, dass Ihre AndroidManifest.xml keinen falschen Verweis auf das App-Symbol enthält. Manchmal könnte die ic_launcher.png in mipmap / statt drawables /
IHeartAndroid

27

Ich hatte das gleiche Problem bei der Verwendung einer Drittanbieter-Bibliothek ( RomainPiel / Shimmer-Android- Bibliothek auf Github).

Um das Problem zu lösen, habe ich meine ic_launcher.png-Dateien aus dem zeichnbaren Ordner in den mipmap-Ordner verschoben. Und Problem gelöst.

Geben Sie hier die Bildbeschreibung ein


1
Omg Can, du hast meinen Hafttag und meine halbe Nacht gerettet. Vielen Dank;)
Khai Nguyen

2
Das sollte die richtige Antwort sein! Ändern Sie dann auf Manifest das Logo oder Symbol mit der richtigen Datei: @ mipmap / ic_launcher
Guilherme Simão Couto

In den neueren Versionen von Android Studio / Gradle müssen Sie Ihren ic_launcher in Mipmap-Ordnern ablegen, auch wenn keine Bibliotheken ihn verwenden (dies wird den Fehler beheben).
Sagits

Dies sollte die akzeptierte Antwort sein, wenn ein Upgrade über die Lücke zwischen dem Build-Tool des früheren 23 bis 23+
Tom

19

Ein Downgrade auf com.android.tools.build:gradle:1.1.3 hat mein Problem behoben


meins ist 1.2.3 und hat immer noch das gleiche Problem
Akshay

@ Akshay versuchen mit 1.1.3
Back Packer

Hmm ich verstehe was du sagst ... also ist das dann ein Studio Bug?
Akshay

@ Akshay Ich weiß nicht, tut mir leid: /
Back Packer

13
Und was ist die gute Lösung?
Back Packer

14

Hier ist die allgemeine Methode, um das Problem zu finden:

Lauf

./gradlew build --stacktrace --info

und Sie finden die Details der Fehler. Ich habe meinen Fehler gefunden: Eine doppelte Klasse hat einen TOP-Level-Fehler verursacht, und das Entfernen der doppelten Klasse wird das Problem lösen.


@Praveen Gerne helfen wir Ihnen weiter.
Herbert

1
Danke das hat mir geholfen. Dies ist die hilfreichste Antwort, da es für dieses Problem mehrere Quellen gibt.
Biodiv

10

Für mich hat ein einfaches "sauberes Projekt" und "Projekt neu erstellen" den Trick gemacht.


Das hat bei mir funktioniert, aber mit, ./gradlew cleanweil ich auf Jenkins lief. Vielen Dank!
Epool

2

Aktualisieren Sie auf 1.2.3, stellen Sie jedoch sicher, dass Ihr gradle und buildToolsVersion in Ihrem Projekt und den verwendeten aars identisch sind.

Falls Sie externe Bibliotheken verwenden, in denen Sie die Gradle / Build-Version nicht steuern können: Wenden Sie sich an den Autor oder überprüfen Sie die Quellen selbst. Einige Bibliotheken verfügen über nicht verwendete Startsymbole, die diesen Konflikt verursachen. Das Entfernen dieser Symbole löst Ihr Problem. Identisch benannte Quellen (z. B. menu.xml) können dieses Problem in seltenen Fällen ebenfalls verursachen. Eine einfache Problemumgehung wäre das Umbenennen Ihrer Ressource.


Dies löste mein Problem (und spricht auch für Ivan Bartsovs Antwort oben im Abschnitt "Erwähnenswert"). In einem Bibliotheksprojekt (das ich aus Eclipse importiert habe) war in build.gradle eine ältere "buildToolsVersion" definiert. Dies führte dazu, dass gradle beim Erstellen der Anwendungen, die diese Bibliothek verwendeten, mit dem Müll "doppelte Datei" fehlschlug. Nachdem sichergestellt wurde, dass die "buildToolsVersion" der Bibliothek mit der "buildToolsVersion" der Anwendung identisch war, wurde der Gradle "ein verdammter Gradle" gestoppt und alle Versionen wurden in Ordnung kompiliert. Gibt es nicht eine Flusenprüfung oder etwas, um eine bessere Fehlerbeschreibung zu geben?
Dell116

1

Benennen Sie ic_launcher.png einfach in etwas anderes um (z. B. ico_launcher.png).


Wenn Sie mehrere Bibliotheken verwenden, die jeweils einen ic_launcher haben, ist dies keine Lösung
Daniel Wilson

Ich hatte das gleiche Problem mit einer anderen PNG-Datei, die nicht ic_launcher war, und das Umbenennen behebt das Problem.
Tot Zam

1

In meinem Fall habe ich der Datei strings.xml Apostroph (e) hinzugefügt. Überprüfen Sie die Leute auf solche Fehler und entfernen Sie sie auf jeden Fall. Es ist so ärgerlich, dass die IDE den Fehler nicht richtig anzeigen kann, sondern alle Ressourcen nicht mehr synchron sind.

Ich weiß, dass dies nicht der Fall ist, der in Frage gestellt wird, aber der Fehler ist ziemlich gleich, dh die Ausführung von Gradle schlägt fehl.


1

Einfach Renamedas Image( Rightclick on the Image, Select Refactor and select Rename). Es wird das Problem lösen, da das Problem aufgetreten ist, da einer der libraryauch das imagemit dem verwendet same name.


1

Ich hatte das gleiche Problem und das Folgende hat bei mir funktioniert:

  • Benennen Sie Ihr Symbol um
  • Fügen Sie tools:replace="android:icon"Ihrem <application>Tag im Manifest hinzu

Sie können nur den ersten Schritt versuchen, aber ich hatte immer noch Probleme beim Zusammenführen der Manifestdateien. Auf diese Weise sollte die in der Bibliothek verwendete Ressource überschrieben werden.


0

Folgen Sie diesem Link hier

Oder

Nehmen Sie so eine Änderung vor.

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

0

Das Update auf das neueste Gradle-Plugin 1.5.0 hat dieses Problem behoben. Aktualisieren Sie folgende Skript in der build.gradleStammdatei

buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
    ...
}

0

Ich habe es geschafft, dieses Problem durch inkonsistente Großschreibung von Dateinamenerweiterungen auszulösen. Ich hatte ein JPG-Bild in einem Zeichenverzeichnis, aber ein Bild mit demselben Dateinamen, aber JPG in einem anderen Zeichenverzeichnis. Die Dateinamen und Verzeichnisse stimmten, die Erweiterungen jedoch nicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.