如何在Android上使用混淆的(使用ProGuard)应用程序进行调试?


70

当我得到这样的东西

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

我如何知道问题出在哪里并调试该问题?我仅从ProGuard获得了映射输出,并且不知道行号。谢谢。

Answers:


115

将以下行添加到您的proguard配置中。

-renamesourcefileattribute SourceFile    
-keepattributes SourceFile,LineNumberTable

现在,您的堆栈跟踪将包括行号,并且通过使用proguard随附的retrace工具(包含在Android SDK中),您可以像平常一样进行调试。

请注意,即使您没有使用这两个配置选项,只要您具有映射文件,即使没有完全明确的含义,retrace仍然可以输出有用的信息。

注意:带有映射的文件是由proguard配置选项生成的:

 -printmapping outputfile.txt

在Android SDK随附的ant文件中,将其设置为mapping.txt。

祝好运。


15

要利用您的Android电子市场帐户中的所有堆栈跟踪,您可以-printmapping将ProGuard配置中由选项生成的地图文件与ReTrace(ProGuard随行工具)一起使用,以解码堆栈跟踪。您也可以使用地图文件的内容进行手动解码,但这很繁琐。

在ProGuard手册下的示例中,有一节介绍如何生成有用的混淆堆栈跟踪信息,包括如何保留行号。

不幸的是,如果您没有设置ProGuard保留行号,那么您将只能识别引发异常的方法。



ADT 17(当前为预览版)中即将发布的内容是对PorGuard为Android配置的方式的进一步更改。tools.android.com/recent/proguardimprovements 不会更改使用打印映射的调试方式,但会更改您最初配置ProGuard的方式。
cistearns 2012年

@cistearns我尝试过相同,但与编码值相同:(有帮助吗?
Dinesh TA

我不知道该如何使用。您能否提供更多信息?甚至可以调试混淆的应用程序吗?
Android开发人员

这仅适用于我在活动中的情况,但片段中的断点未命中。你知道为什么会发生吗?问候
Smoothumut 2015年

4

将堆栈跟踪信息粘贴到stack_trace.txt中

运行以下命令:java -jar retrace.jar classes-processed.map stack_trace.txt

retrace.jar位于sdk \ tools \ proguard \ lib \ retrace.jar classes-processed.map是混淆时proguard生成的输出文件


4

要回溯混淆的ProGuard文件,请执行以下步骤:

  1. 您需要安装Proguard。

  2. Proguard为您提供了UI模式,这是一种很好的追溯工具。

  3. 打开在MAC机中找到的proguardgui.sh

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

    您可以通过终端运行它。

Proguardgui

  1. 然后,您可以输入映射文件和要追溯的片段,应将其追溯

proguardgui输出


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.