Android--定位混淆后Crash代码行数
- 一、需求背景
- 二、前期准备
- 三、对混淆日志进行还原
- 四、示例
 
一、需求背景
打包时需要对代码进行混淆,目的是增加安全性,防⽌反编译。但这会导致App崩溃时,抓到的日志堆栈中显示的代码行数对应不上,不便于进行问题定位。因此需要对日志堆栈中的代码反混淆。
二、前期准备
-  proguardgui.sh:SDK提供给我们的工具,通过它来还原正确的crash行数。 
 路径:${ANDROID_HOME}/tools/proguard/bin
-  打包时生成的mapping.txt:此⽂件存放着源码到混淆后代码的映射关系。 
 路径:app/build/outputs/mapping/release/
-  抓到的错误日志 
-  (可选)配置环境变量:打开.bash_profile,加入该行,便于启动可视化操作界面。 
export PATH=${PATH}:${ANDROID_HOME}/tools/proguard/bin
配置完成后执行一次source ~/.bash_profile,使其生效。终端输入proguardgui.sh便可启动。
 若不进行配置,将proguardgui.sh文件直接拖入终端执行即可。
遇到的问题:proguardgui.sh无法打开
解决方法:下载最新版Proguard(https://github.com/Guardsquare/proguard/releases)
 解压后将其放入proguard同级目录,修改环境变量,终端输入proguardgui.sh启动。
 (笔者下载时最新版本为proguard-7.2.2.tar.gz)
三、对混淆日志进行还原

 按照箭头的操作顺序
 第一步:点击左侧的ReTrace
 第二步:选择mapping.txt文件
 第三步:将Countly错误日志贴在Obfuscated stack trace中
 第四步:点击右下角ReTrace!进行还原
 第五步:De-obfuscated stack trace中会出现还原后的日志信息
注:1、app目录下proguard-rules.pro⽂件中需有如下配置
-keepattributes SourceFile,LineNumberTable
2、Obfuscated stack trace填写错误⽇志时,⽇志前⾯需要加at,如果有则不⽤加,否则⽆法解析。
四、示例
抓到的错误日志如下(可见方法名及行数显示均不正确):
com.ume.android.lib.common.log.UmeException: ThrowableUtils ui exception:Attempt to invoke virtual method 'void com.umetrip.android.msky.checkin.checkin.c2s.C2sTravelHealthInfo.setType(int)' on a null object reference
at com.ume.android.lib.common.log.SystemLog.upload(SystemLog.java:13)
at com.ume.android.lib.common.util.ThrowableUtils$2.run(ThrowableUtils.java:3)
at android.os.Handler.handleCallback(Handler.java:955)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:228)
at android.app.ActivityThread.main(ActivityThread.java:8679)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:613)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1085)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.umetrip.android.msky.checkin.checkin.c2s.C2sTravelHealthInfo.setType(int)' on a null object reference
at com.umetrip.android.msky.checkin.virtualcabin.CkiNonSupportActivity.Z1(CkiNonSupportActivity.java:2)
at com.umetrip.android.msky.checkin.virtualcabin.CkiNonSupportActivity.t1(CkiNonSupportActivity.java:1)
at com.umetrip.android.msky.checkin.virtualcabin.CkiNonSupportActivity$i.a(CkiNonSupportActivity.java:1)
at com.umetrip.android.msky.checkin.virtualcabin.dialog.CheckInOperationManger$a.onClick(CheckInOperationManger.java:4)
at android.view.View.performClick(View.java:7592)
at android.view.View.performClickInternal(View.java:7566)
at android.view.View.access$3700(View.java:840)
at android.view.View$PerformClick.run(View.java:28910)
at android.os.Handler.handleCallback(Handler.java:955)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:228)
at com.ume.android.lib.common.util.ThrowableUtils$2.run(ThrowableUtils.java:1)
... 7 more
按照步骤三进行还原,可见已成功定位到crash代码行数
 



















