根据mapping看stackTrace
对于混淆了的代码来说,stackTrace打印出来的一部分exception是加密的,例如在MainActivity.onShowDialog()
这个方法里面出错,stackTrace里面可能会写MainActivity.a
。然而mapping.txt里面通常会有不止一个a
,而且打印出来的行数也不是原来代码里面的行数。所以直接看mapping的话会很麻烦。android sdk自带了一个混淆的工具proguardgui.bat
可以解析stackTrace的内容。主要就是借助build完之后得到的mapping,然后将stackTrace里面诸如.a
、.b
、$a
、$b
这种方法重新解析出来,换成具体的方法名如上面所说的onShowDialog()
。不过也仅仅是解析方法名而已,不会替换行数。
具体操作如下
找到Android sdk安装的文件夹,进入路径sdk\tools\proguard\bin
,此时会有三个.bat
:proguard.bat
、proguardgui.bat
、retrace.bat
。
双击proguardgui.bat
。
此时如果出现闪退的话,极有可能是java
的环境变量没有配对。
按下Win+R,输入cmd并打开,直接输入命令java
。如果出现类似java不是内部命令
这段话,那就是java环境变量
有问题。最好去检查一下JAVA_HOME
、CLASSPATH
和Path
。如果真的发现有问题,修改完之后最好重启,否则修改有可能会不生效。重启之后打开cmd并输入java
,此时应该会出现一大版命令的注解。
打开proguardgui.bat
,找到左边菜单最后一个选项Retrace
。Browse
对应的mapping.txt
。mapping.txt
通常在包名\buid\outputs\mapping\
里面。将打印出来的stackTrace中与stack trace
无关的内容删去,例如,用adb logcat抓的日志就要把冒号及前面的标题删掉。
例如,有一段stack trace
:
E/AndroidRuntime( 7758): java.lang.IndexOutOfBoundsException: replace (-1 ... -1) starts before 0
E/AndroidRuntime( 7758): at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1023)
E/AndroidRuntime( 7758): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:460)
E/AndroidRuntime( 7758): at android.text.SpannableStringBuilder.insert(SpannableStringBuilder.java:211)
要把前面的E/AndroidRuntime( 7758):
删掉再粘贴,否则Retrace!
无效。
粘贴到Obfuscated stack trace
的输入框里面,点击右下角的Retrace!
就行了。