proguard hell - impossible de trouver la classe référencée


125

Donc, j'ESSAYE de sortir un logiciel mais Proguard me donne mal à la tête.

Lorsque j'essaie d'exporter avec proguard, je reçois beaucoup d'avertissement, c'est-à-dire "impossible de trouver la classe référencée"

Par exemple:

[2011-08-07 17:44:37 - GAME] Warning: org.simpleframework.xml.stream.StreamReader: can't find referenced class javax.xml.stream.events.XMLEvent
[2011-08-07 17:44:37 - GAME] Warning: there were 52 unresolved references to classes or interfaces.
[2011-08-07 17:44:37 - GAME]          You may need to specify additional library jars (using '-libraryjars'),
[2011-08-07 17:44:37 - GAME]          or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-08-07 17:44:37 - GAME] java.io.IOException: Please correct the above warnings first.
[ 

Les avertissements semblent liés à simpleframework, donc dans mon fichier de configuration proguard, j'ai ajouté ce qui suit:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

pathtoprojecttolibsest le chemin vers les fichiers JAR référencés par mon projet.

Cela ne fait AUCUNE différence.

Si simpleframework fait référence à javax, puis-je dire à proguard d'ignorer cela aussi?

Des idées?


1
Utilisez-vous proguard uniquement pour secouer des arbres? Si oui, avez-vous vérifié la taille de votre fichier sans l'utiliser? Vous pouvez obtenir des bogues superwierd lorsque proguard jette quelque chose qui est accessible en utilisant la réflexion, par exemple, que vous ne trouverez pas tant qu'il n'a pas interrompu l'exécution, alors soyez vraiment, vraiment sûr que vous en avez besoin.
alun

Je ne l'utilisais vraiment que pour essayer de protéger le code aussi facilement? Pensez-vous que cela en vaut la peine?
iasksillyquestions

3
@ListenToRick Proguard est parfaitement bien, s'il est exécuté avec les configurations appropriées et que votre application résultante a été testée correctement. Je suis presque sûr que Google recommande même son utilisation. Google fournit de nombreux guides / exemples d'utilisation de Proguard avec les applications Android.
CrackerJack9

Proguard est un bon outil, mais Google le recommande probablement au moins autant en raison d'une limitation de taille plutôt étrange dans le format dex qu'autre chose. (Voir code.google.com/p/android/issues/detail?id=7147 )
alun

5
@alun, ce n'est pas la raison. Ceux d'entre nous qui ne veulent pas de la rétro-ingénierie de nos applications ou qui utilisent des licences pour `` essayer '' d'empêcher le piratage devraient utiliser un outil d'obfuscation comme celui-ci pour rendre la tâche plus difficile pour les pirates informatiques. Faire prendre moins de place à votre application est également un avantage pour l'utilisateur final, et il existe également des optimisations apportées par ces outils ... encore un autre avantage.
Christopher Perry

Réponses:


128

org.simpleframework.xml.stream.StreamReaderdans votre code fait référence à javax.xml.stream.events.XMLEvent. Cette dernière classe fait partie du runtime Java ( rt.jar) mais ne fait pas partie du runtime Android ( android.jar), donc ProGuard avertit que quelque chose pourrait être cassé. Si vous êtes sûr que votre application fonctionne malgré tout, vous pouvez spécifier

-dontwarn javax.xml.stream.events.**

L'enfer ProGuard?


15
Cela ne l'a pas résolu pour moi, mais cela l'a fait-dontwarn javax.xml.**
Jeshurun

8
L'ajout a -libraryjars <java.home>/lib/rt.jarrésolu le problème pour moi.
Gautam

3
J'ai reçu des avertissements supplémentaires sur, par exemple, javax.xml.stream.XMLInputFactory, alors j'ai utilisé-dontwarn javax.xml.stream.**
spatialist

1
Comment puis-je faire -dontwarnchanter l'interface graphique?
Tomáš Zato - Réintégrer Monica

2
L'enfer Proguard continue, écorchez-moi et finissez avec cette douleur.
Josh le


5

Cette erreur se produit car les bibliothèques que vous utilisez dépendent d'autres bibliothèques qui ne sont pas réellement utilisées, mais Proguard les recherche.
Ajoutez vos lignes -dontwarn à votre fichier proguard-rules.pro dans votre projet Android pour désactiver ces avertissements.

entrez la description de l'image ici

Vous pouvez trouver les dépendances que vous devez ajouter à votre proguard-rules.pro dans le stacktrace de votre erreur.


2

Vous devez l'inclure dans votre configuration Proguard:

-dontskipnonpubliclibraryclasses

Eh bien, ça l'a fait pour moi à l'époque ... il y a environ 4 ans ... les choses ont peut-être changé depuis :) Semblait avoir fonctionné pour au moins 2 autres personnes de toute façon.
CrackerJack9

Le proguard-android.txt par défaut a déjà cette ligne.
Cristina De Rito

1
@Ultimecia qui commet est de 2013, ce message a été fait en 2011
CrackerJack9

2

Ma clé magique qui a résolu mes heures de recherche: ajoutez ceci à progruard-android.txt

-dontskipnonpubliclibraryclassmembers

0

Hmm. En lisant cet avertissement, il semblerait que la bibliothèque que vous essayez d'utiliser dépende de javax.xml.stream.events. Je ne pense pas du tout que l'espace de noms soit inclus dans Android. (Voir l' index des packages ).

Essayez de le déployer sur l'émulateur sans utiliser proguard et voyez s'il fonctionne. Je suppose que non si cet avertissement est exact.


Salut, si cela fonctionne dans l'émulateur sans le proguard, cela signifie que les avertissements sont inexacts? J'essaie de comprendre pourquoi j'ai eu ce genre d'avertissements similaires. Je ne veux pas simplement supprimer les avertissements.
Michelle Shieh

0

Je pense que c'est un cas limite, mais dans mon cas, j'ai dû effacer complètement le dossier de construction de mon proguard Jenkins pour essayer de travailler avec un ancien code qui n'était plus là - juste au cas où quelqu'un aurait le même problème.


0

Dans mon cas, je n'ai rien changé et l'avertissement a commencé à apparaître. Le problème était avec les caches de gradle cassés. Vérifiez mon autre réponse . Je partage avec ça car il m'a fallu 2 heures pour trouver le problème:]


0

Ajoutez cette ligne à votre proguard-rules.profichier dans le répertoire des scripts gradle:

-dontwarn package.class.name.**

package.class.name est le nom du package avec le nom de classe du fichier jar ajouté.

Par exemple:

-dontwarn com.myexternalclass.utils.**
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.