Wie debugge ich mit verschleierten (mit ProGuard) Anwendungen auf Android?

70

Als ich so etwas bekam

ERROR/AndroidRuntime(18677): Caused by: java.lang.NullPointerException
ERROR/AndroidRuntime(18677):     at com.companyname.a.a.a(Unknown Source)

Wie kann ich wissen, wo das Problem liegt, und dieses Problem beheben? Ich habe nur die Mapping-Ausgabe von ProGuard erhalten und kenne die Zeilennummer nicht. Vielen Dank.

Shiami
quelle

Antworten:

115

Fügen Sie Ihrer Proguard-Konfiguration die folgenden Zeilen hinzu.

-renamesourcefileattribute SourceFile    
-keepattributes SourceFile,LineNumberTable

Jetzt enthalten Ihre Stack-Traces Zeilennummern. Mit dem mit Proguard gelieferten Retrace-Tool (im Android SDK enthalten) können Sie wie gewohnt debuggen.

Beachten Sie, dass retrace auch dann nützliche Informationen ausgeben kann, wenn Sie über die Zuordnungsdatei verfügen, auch wenn Sie diese beiden Konfigurationsoptionen nicht verwendet haben, wenn auch nicht völlig eindeutig.

Hinweis: Die Datei mit den Zuordnungen wird mit der Konfigurationsoption proguard erstellt:

 -printmapping outputfile.txt

In der Ant-Datei, die mit dem Android SDK geliefert wird, ist sie auf Mapping.txt festgelegt.

Viel Glück.

Daniel Szmulewicz
quelle
15

Um Stapelspuren aus Ihrem Android Market-Konto zu verwenden, können Sie Ihre Kartendatei, die mit der -printmappingOption in der ProGuard-Konfiguration erstellt wurde, mit ReTrace (ProGuard-Begleittool) verwenden, um die Stapelspur zu dekodieren. Sie können den Inhalt der Kartendatei auch manuell dekodieren. Dies ist jedoch mühsam.

Im ProGuard-Handbuch unter Beispielen finden Sie einen Abschnitt zum Erstellen nützlicher verschleierter Stapelspuren, einschließlich der Beibehaltung von Zeilennummern.

Wenn Sie den ProGuard nicht so eingestellt haben, dass die Zeilennummern beibehalten werden, können Sie leider nur die Methode identifizieren, die die Ausnahme auslöst.

cistearns
quelle
4
Dieser Prozess wird auch unter developer.android.com/guide/developing/tools/…
David Snabel-Caunt am
In ADT 17 (derzeit eine Vorschau-Version) werden weitere Änderungen an der Konfiguration von PorGuard für Android vorgenommen. tools.android.com/recent/proguardimprovements Das Debuggen mithilfe der Druckzuordnung wird nicht geändert, aber die anfängliche Konfiguration von ProGuard wird geändert.
Cistearns
@cistearns Ich habe das gleiche versucht, aber out ist das gleiche wie verschlüsselter Wert :( irgendeine Hilfe?
Dinesh TA
Ich verstehe nicht, wie man das benutzt. Können Sie bitte weitere Informationen geben? Ist es überhaupt möglich, verschleierte Apps zu debuggen?
Android-Entwickler
Dies funktioniert nur in meinem Fall bei Aktivitäten, aber Haltepunkte in Fragmenten werden nicht getroffen. Hast du eine Idee, warum es passiert? Grüße
Smoothumut
4

Fügen Sie Ihren Stack-Trace in stack_trace.txt ein

Führen Sie den folgenden Befehl aus: java -jar retrace.jar classes-processed.map stack_trace.txt

retrace.jar befindet sich unter sdk \ tools \ proguard \ lib \ retrace.jar classes-processed.map ist die Ausgabedatei, die von proguard generiert wurde, als Sie die Verschleierung vorgenommen haben

Karma
quelle
4

Führen Sie die folgenden Schritte aus, um die verschleierte ProGuard-Datei zurückzuverfolgen:

  1. Sie müssen Proguard installieren.

  2. Proguard bietet Ihnen einen UI-Modus, der sich hervorragend zum Zurückverfolgen eignet.

  3. Öffnen Sie die Datei proguardgui.sh, die Sie auf dem MAC-Computer finden

    /Users/{name}/Library/Android/sdk/tools/proguard/bin/proguardgui.sh
    

    Sie können es über das Terminal ausführen.

proguardgui

  1. Sie können dann Ihre Zuordnungsdatei und den Ausschnitt eingeben, den Sie zurückverfolgen möchten, und er sollte zurückverfolgt werden

proguardgui Ausgänge

user7466791
quelle