web-dev-qa-db-fra.com

Proguard warnings "ne peut pas écrire de ressource [META-INF/MANIFEST.MF] (entrée Zip en double)"

J'utilise IntelliJ et exécute Proguard en mode débogage, mais je n'arrive pas à me débarrasser des avertissements tels que:

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

Ce projet a deux modules et Android-support-v13.jar est utilisé sur 2 d'entre eux. Je pensais que c'était là le problème. J'ai donc supprimé cette bibliothèque du dossier libs, l'ajoutée en tant que bibliothèque de projet et ajouté la dépendance aux deux modules. Cela n'a rien résolu, l'avertissement persiste et je ne comprends pas pourquoi.

Je sais que ces avertissements n'affectent rien, mais une construction propre est une construction heureuse!

36
Ricardo Amaral

Peut-être un problème 'proguard.cfg'. Est-ce que cela inclut les '-jars'? Si votre projet inclut un autre projet en tant que bibliothèque, les fichiers JAR peuvent être traités deux fois. Pourriez-vous poster votre 'proguard.cfg'?

Extrait de http://proguard.sourceforge.net/index.html#manual/troubleshooting.html :

Vos fichiers JAR contiennent plusieurs fichiers de ressources portant le même nom . ProGuard continue de copier les fichiers de ressources comme d'habitude, en ignorant les fichiers fichiers avec des noms précédemment utilisés. Une fois de plus, l'avertissement peut être un indication d’un problème cependant, il est donc conseillé de supprimer le les doublons. Un moyen pratique de le faire consiste à spécifier des filtres sur le fichier pots d'entrée. Il n'y a pas d'option pour désactiver ces avertissements.

OPTION 1:

Comme vous ne pouvez pas poster vos "-injars", vérifiez s’ils incluent "Android-support-v13.jar" ou la bibliothèque incluse dans votre projet, qui inclut également "Android-support-v13.jar". 

En supposant que vous construisez avec Ant dans IntelliJ IDEA, vous ne devez pas ajouter d'options -injars, -outjars ou -libraryjars; le script Ant le fait déjà pour vous.

OPTION 2:

Bien que les avertissements soient inoffensifs, une construction propre est une construction heureuse, alors essayez:

http://web.archive.org/web/20160206204259/http://www.dancartoon.com/2012/01/14/fixing-proguard-warning-want-write-resource-meta-infmanifest-mf/

et 

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

OPTION # 3:

Inclure (!META-INF/MANIFEST.MF) après chaque commande '-injars' 

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

OPTION # 4:Android Proguard Duplicate Definition

Ce problème a été corrigé en déplaçant les bibliothèques tierces dans un autre répertoire, dans mon cas 'lib'. Puis ajouté

-injars lib/jmdns.jar 

dans le fichier proguard.cfg.

OPTION # 5:Android - Erreur d’entrée Zip en double en double

Si votre fichier de configuration Proguard comprend la ligne suivante, supprimez-le:

-injars bin/classes

OPTION # 6:L'application Android obscurcie utilisant Proguard continue à obscurcir les bocaux d'une bibliothèque - ou s'agit-il?

J'ai trouvé un autre moyen de faire en sorte que Proguard laisse les bocaux de bibliothèque seuls était de demandez-lui de conserver leurs noms de paquets, par exemple:

-keep classe javax. ** {*; } -keep class org. ** {*; } -construisez Twitter4j. ** {*; }

OPTION # 7:

Une solution étrange (suppression du dossier META-INF dans le dossier src) en quelque chose de similaire ici .

45

J'ai utilisé packagingOptions avec exclude dans build.gradle et j'ai les mêmes problèmes avec vous. 

Vous pouvez le réparer en utilisant ceci.

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'
}

Remplacez pickFirst par exclude.

3
Wooseong Kim

Ne faites pas référence à la bibliothèque de support en incluant son pot directement; lorsque vous faites cela, le système de construction ne peut pas distinguer les différentes versions de celui-ci et vous obtenez des erreurs de ce type. Incluez-le en référençant ses coordonnées Maven:

dépendances { compile 'com.Android.support:support-v13:X.X.X'}where X.X.X est le numéro de version approprié, basé sur l'API avec laquelle vous compilez. Si vous incluez cette dépendance via l'interface utilisateur dans Structure du projet> (votre module)> Dépendances> + Bouton> Dépendance de la bibliothèque, cela vous aidera à choisir le bon numéro de version.

Vous pouvez également trouver pratique d’inclure d’autres dépendances via les coordonnées Maven au lieu de quereller leurs bocaux; Cette même interface utilisateur de dépendance de bibliothèque a une fonction de recherche pour vous aider à trouver des bibliothèques. 

Assurez-vous de supprimer cette bibliothèque des bibliothèques ou de tout autre dossier dans lequel elle était présente

0
Varun Bhatia

La meilleure solution que j'ai trouvée consistait à copier la cible -obfuscate de /tools/ant/build.xml dans le fichier custom_rules.xml de votre projet. Alors le seul bloc qui doit être changé est:

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

Le seul bit ajouté est (!META-INF/MANIFEST.MF). Cela exclura tous les fichiers manifestes, qui ne seront de toute façon pas copiés dans l'APK final.

0
user1499147