Proguard Hölle - kann keine referenzierte Klasse finden


125

Also versuche ich , Software zu veröffentlichen, aber Proguard bereitet mir Kopfschmerzen.

Wenn ich versuche, mit Proguard zu exportieren, erhalte ich viele Warnungen, z. B. "Referenzierte Klasse kann nicht gefunden werden"

Beispielsweise:

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

Die Warnungen scheinen sich auf simpleframework zu beziehen, daher habe ich in meiner Proguard-Konfigurationsdatei Folgendes hinzugefügt:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

Wo pathtoprojecttolibsist der Weg zu Gläsern, auf die mein Projekt verweist?

Dies macht keinen Unterschied.

Wenn simpleframework auf javax verweist, kann ich proguard anweisen, dies auch zu ignorieren?

Irgendwelche Ideen?


1
Verwenden Sie Proguard nur, um Baum zu schütteln? Wenn ja, haben Sie die Dateigröße überprüft, ohne sie zu verwenden? Sie können superwierd Bugs bekommen, wenn Proguard etwas herauswirft, auf das beispielsweise über Reflection zugegriffen wird, das Sie erst finden, wenn es die Laufzeit unterbricht. Seien Sie also wirklich, wirklich sicher, dass Sie es brauchen.
Alun

Ich habe es wirklich nur benutzt, um zu versuchen, den Code zu schützen, der so einfach geklaut wird? Glaubst du, es lohnt sich?
iasksillyquestions

3
@ListenToRick Proguard ist vollkommen in Ordnung, wenn es mit den richtigen Konfigurationen ausgeführt und Ihre resultierende App ordnungsgemäß getestet wird. Ich bin mir ziemlich sicher, dass Google die Verwendung sogar empfiehlt. Google bietet viele Anleitungen / Beispiele für die Verwendung von Proguard mit Android-Apps.
CrackerJack9

Proguard ist ein gutes Tool, aber Google empfiehlt es wahrscheinlich mindestens genauso, weil die Größe im Dex-Format ziemlich seltsam ist wie alles andere. (Siehe code.google.com/p/android/issues/detail?id=7147 )
Alun

5
@alun, das ist nicht der Grund. Diejenigen von uns, die nicht möchten, dass unsere Apps rückentwickelt werden, oder die mithilfe von Lizenzen versuchen, Piraterie zu verhindern, sollten ein solches Verschleierungstool verwenden, um es für Hacker schwieriger zu machen. Es ist auch ein Vorteil für den Endbenutzer, dass Ihre Anwendung weniger Platz beansprucht, und es gibt auch Optimierungen, die mit diesen Tools vorgenommen werden ... ein weiterer Vorteil.
Christopher Perry

Antworten:


128

org.simpleframework.xml.stream.StreamReaderin Ihrem Code bezieht sich auf javax.xml.stream.events.XMLEvent. Die letztere Klasse ist Teil der Java-Laufzeit ( rt.jar), aber nicht Teil der Android-Laufzeit ( android.jar). Daher warnt ProGuard, dass möglicherweise etwas kaputt geht. Wenn Sie sicher sind, dass Ihre Anwendung trotzdem funktioniert, können Sie angeben

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

ProGuard Hölle?


15
Das hat es für mich nicht behoben, aber das hat es getan-dontwarn javax.xml.**
Jeshurun

8
Das Hinzufügen hat -libraryjars <java.home>/lib/rt.jardas Problem für mich behoben.
Gautam

3
Ich habe zusätzliche Warnungen über zB javax.xml.stream.XMLInputFactory erhalten, also habe ich-dontwarn javax.xml.stream.**
Spatialist

1
Wie kann ich -dontwarndie GUI singen?
Tomáš Zato - Wiedereinsetzung Monica

2
Die Hölle der Proguards geht weiter, enthäute mich einfach und erledige diesen Schmerz.
Josh


5

Dieser Fehler tritt auf, weil die von Ihnen verwendeten Bibliotheken von anderen Bibliotheken abhängen, die nicht wirklich verwendet werden, aber Proguard nach ihnen sucht.
Fügen Sie Ihre -dontwarn- Zeilen zu Ihrer proguard-rules.pro- Datei in Ihrem Android-Projekt hinzu, um diese Warnungen zu deaktivieren.

Geben Sie hier die Bildbeschreibung ein

Welche Abhängigkeiten Sie zu proguard-rules.pro hinzufügen müssen, finden Sie im Stacktrace Ihres Fehlers.


2

Sie sollten dies in Ihre Proguard-Konfiguration aufnehmen:

-dontskipnonpubliclibraryclasses

Nun, das hat es damals für mich getan ... ~ vor 4 Jahren ... die Dinge haben sich seitdem möglicherweise geändert :) Schien sowieso für mindestens 2 andere Leute gearbeitet zu haben.
CrackerJack9

Die Standardproguard -android.txt hat diese Zeile bereits.
Cristina De Rito

1
@Ultimecia, die Commit ist von 2013, dieser Beitrag wurde im Jahr 2011 gemacht
CrackerJack9

2

Mein magischer Schlüssel, der meine stundenlangen Suchvorgänge gelöst hat: Fügen Sie diesen zuprogruard-android.txt hinzu

-dontskipnonpubliclibraryclassmembers

0

Hmm. Wenn Sie diese Warnung lesen, scheint die Bibliothek, die Sie verwenden möchten, von javax.xml.stream.events abhängig zu sein. Ich glaube nicht, dass der Namespace überhaupt in Android enthalten ist. (Siehe Paketindex ).

Versuchen Sie, es ohne Proguard auf dem Emulator bereitzustellen, und prüfen Sie, ob es funktioniert. Meine Vermutung wäre nein, wenn diese Warnung korrekt ist.


Hallo, wenn es im Emulator ohne Proguard funktioniert, bedeutet das, dass die Warnungen ungenau sind? Ich versuche herauszufinden, warum ich solche ähnlichen Warnungen hatte. Ich möchte nicht nur die Warnungen unterdrücken.
Michelle Shieh

0

Ich denke, dies ist ein Randfall, aber in meinem Fall musste ich den Build-Ordner auf meinem Jenkins-Proguard vollständig löschen und versuchte, mit altem Code zu arbeiten, der nicht mehr vorhanden war - nur für den Fall, dass jemand das gleiche Problem hat.


0

In meinem Fall habe ich nichts geändert und die Warnung wurde angezeigt. Das Problem war mit kaputten Gradle-Caches. Überprüfen Sie meine andere Antwort . Ich teile dies, weil ich 2 Stunden gebraucht habe, um das Problem zu finden:]


0

Fügen Sie diese Zeile Ihrer proguard-rules.proDatei im Verzeichnis gradle scripts hinzu:

-dontwarn package.class.name.**

wo package.class.name ist der Paketname mit dem Klassennamen der angehängten JAR-Datei?

Beispielsweise:

-dontwarn com.myexternalclass.utils.**
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.