2013-05-03 3 views
33

Ich benutze IntelliJ und Proguard im Debug-Modus laufen, aber ich kann nicht scheinen Warnungen wie :Proguard Warnungen "kann nicht schreiben Ressource [META-INF/MANIFEST.MF] (doppelte Postleitzahl)"

ProGuard: [MyApplication] Warning: can't write resource [META-INF/MANIFEST.MF] 
(Duplicate zip entry [android-support-v13.jar:META-INF/MANIFEST.MF]) 

Dieses Projekt hat ein paar Module und android-support-v13.jar auf 2 von ihnen verwendet wird. Ich dachte, das sei das Problem, also habe ich diese Bibliothek aus dem libs-Ordner entfernt, sie als Projektbibliothek hinzugefügt und die Abhängigkeit beiden Modulen hinzugefügt. Das hat nichts gelöst, die Warnung bleibt bestehen und ich verstehe nicht warum.

Ich weiß, dass diese Warnungen nichts beeinflussen, aber ein sauberer Build ist ein glücklicher Build!

+2

Sieht aus wie 'android-support-v13.jar' wird mehr vorhanden war eingeschlossen als einmal. Siehe auch [Warnung: Ressource nicht schreiben ... Duplizieren der Zip-Datei] (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicatezipentry). – devnull

+0

Ich verstehe nicht, wie das passiert. Wie ich schon sagte, habe ich die Bibliothek als Projektbibliothek hinzugefügt und in beiden Modulen referenziert. Ich muss dies tun, sonst wird die App nicht kompilieren. –

+0

Möglicherweise ein 'proguard.cfg' Problem. Könnten Sie es posten? Es scheint, dass einige enthaltene Darminhaltungen zweimal behandelt werden können. –

Antwort

44

Möglicherweise ein 'proguard.cfg' Problem. Beinhaltet es irgendwelche "-injars"? Wenn Ihr Projekt ein anderes Projekt als Bibliothek enthält, können die Gläser doppelt verarbeitet werden. Könntest du deine "proguard.cfg" posten?

Auszug aus http://proguard.sourceforge.net/index.html#manual/troubleshooting.html:

Ihre Eingabe Gläser mehrere Ressourcen-Dateien mit dem gleichen Namen enthalten. ProGuard kopiert wie gewohnt die Ressourcendateien und überspringt alle Dateien mit den zuvor verwendeten Namen. Noch einmal, die Warnung kann ein Hinweis auf ein Problem sein, so ist es ratsam, die Duplikate zu entfernen. Ein praktischer Weg, dies zu tun, besteht darin, Filter für die Eingabefächer anzugeben. Es gibt keine Möglichkeit, diese Warnungen auszuschalten.

OPTION # 1:

Da Sie Ihre '-injars' veröffentlichen können, überprüfen, ob sie entweder 'android-support-v13.jar' oder die Bibliothek enthalten, die in Ihrem Projekt, das selbst enthält auch "android-support-v13.jar".

Angenommen, Sie erstellen mit Ant innerhalb von IntelliJ IDEA, müssen Sie keine Optionen -injars, -outjars oder -libraryjars hinzufügen; Das Ant-Skript macht das schon für Sie.

OPTION # 2:

Obwohl die Warnungen harmlos sind, ein bereinigter Build ist ein glücklicher zu bauen, so versuchen:

http://www.dancartoon.com/2012/01/14/fixing-proguard-warning-cant-write-resource-meta-infmanifest-mf/

und

https://gist.github.com/paulpv/4439012

OPTION # 3:

Fügen Sie (!META-INF/MANIFEST.MF) nach jedem Befehl '-injars'

-injars library.jar(!META-INF/MANIFEST.MF) 

OPTION # 4:Android Proguard Duplicate Definition

dieses Fest durch die 3rd-Party-Bibliotheken in ein anderes Verzeichnis zu bewegen , in mein Fall 'lib'.Dann hinzugefügt

-injars lib/jmdns.jar 

in die Datei proguard.cfg.

OPTION # 5:Android - Proguard duplicate zip entry error

Wenn Proguard Konfigurationsdatei die folgende Zeile enthält, entfernen Sie sie:

-injars bin/classes 

OPTION # 6:Android obfuscate app using proguard keeps obfuscating library jars - or is it?

Ich habe einen anderen Weg gefunden, Progua zu machen rd verlassen Bibliotheksgläser allein war bitten sie, ihre Paketnamen zu bewahren, zB:

-halten Klasse javax. ** {*; } -halte Klasse org. ** {*; } -halte Klasse twitter4j. ** {*; }

OPTION # 7:

Eine seltsame Lösung etwas ähnliches here (META-INF-Ordner im src Ordner zu löschen).

+0

Ja, es enthält einen Abschnitt mit "-injars". Ich kann die Datei nicht veröffentlichen, da sie vertrauliche Daten enthält, die ich nicht anzeigen kann. –

+0

Die android-support-v13.jar war nur ein Beispiel, alle anderen Bibliotheken innerhalb des libs-Ordners des Hauptmoduls erzeugten diese Warnung ebenfalls. –

+0

Versuchen Sie, diese Bibliotheken aus den -injars zu entfernen –

-4

hinzufügen -dontwarn-proguard.cfg Warnungen zu ignorieren

+2

Dies ist keine gute Option, weil Sie einfach alle Warnungen ignorieren, egal was passiert. Einige von ihnen können dir tatsächlich helfen! – Richard

0

Die beste Lösung, die ich das -obfuscate Ziel von /tools/ant/build.xml in Ihr Projekt custom_rules.xml kopieren zu finden war. Dann ist der einzige Block, der geändert werden muss, ist:

<pathconvert property="project.all.classes.value" refid="project.all.classes.path"> 
    <firstmatchmapper> 
     <regexpmapper from='^([^ ]*)(.*)$$' to='"\1\2"(!META-INF/MANIFEST.MF)'/> 
     <identitymapper/> 
    </firstmatchmapper> 
</pathconvert> 

Der einzige hinzugefügte Bit (!META-INF/MANIFEST.MF) ist. Dadurch werden alle Manifestdateien ausgeschlossen, die sowieso nicht in die endgültige APK kopiert werden.

1

Ich verwendete mit exclude in build.gradle, und ich habe die gleichen Probleme mit Ihnen.

Sie können es mit diesem beheben.

packagingOptions { 
    pickFirst 'META-INF/services/javax.annotation.processing.Processor' 
    pickFirst 'META-INF/DEPENDENCIES.txt' 
    pickFirst 'META-INF/DEPENDENCIES' 
    pickFirst 'META-INF/LICENSE.txt' 
    pickFirst 'META-INF/LICENSE' 
    pickFirst 'META-INF/NOTICE.txt' 
    pickFirst 'META-INF/NOTICE' 
    pickFirst 'META-INF/LGPL2.1' 
} 

ersetzen pickFirst mit exclude.

+4

Entweder mit 'pickFirst' oder' exclude' wird die Warnung immer ausgegeben, wenn ein Release-Build ausgeführt wird. Kannst du das bestätigen? – JJD

+0

@JJD es gibt immer noch die Warnungen aus. –

+0

pickFirst verhindert nicht, dass Warnungen ausgegeben werden. –

0

Verweisen Sie nicht auf die Support-Bibliothek, indem Sie ihr JAR direkt einschließen; Wenn Sie dies tun, kann das Build-System nicht zwischen mehreren Versionen davon disambiguieren, und Sie erhalten Fehler dieses Typs. Fügen Sie es durch seine Maven Referenzierung Koordinaten:

Abhängigkeiten { Kompilierung ‚com.android.support:support-v13:X.X.X‘ } wo X.X.X ist die richtige Versionsnummer basierend auf welche API Sie kompilieren gegen. Wenn Sie diese Abhängigkeit über die UI unter Projektstruktur> (Ihr Modul)> Abhängigkeiten> + Schaltfläche> Bibliotheksabhängigkeit einbeziehen, hilft Ihnen dies bei der Wahl der richtigen Versionsnummer.

Sie können es auch bequem finden, andere Abhängigkeiten über Maven-Koordinaten einzuschließen, anstatt ihre Gläser zu verwirren; Diese Bibliotheksabhängigkeits-UI verfügt über eine Suchfunktion, mit der Sie Bibliotheken finden können.

sicher sein, diese Bibliothek aus den Bibliotheken oder einem anderen Ordner zu entfernen, es in