代码混淆后,也会导致Crash堆栈信息被混淆,难以阅读,增加定位问题位置的难度,一个混淆后的Crash堆栈信息类似这样,核心的信息都没了。为了解决这个问题,可以使用\tools\proguard\bin
下的proguardgui.bat脚本将Crash堆栈信息还原到混淆前的状态。步骤如下:
1.双击打开脚本,选择左边的ReTrace选项
2.选择Mapping file文件,也就是混淆后打包后在app module/build/outputs/mapping/release下生成的mapping.txt
3.拷贝混淆后的堆栈信息
4.点击右下角的ReTrace!按钮,完成Crash堆栈信息的追溯
如下图中间部分就是追溯到的原Crash堆栈信息::
需要注意的是混淆的堆栈信息必须是原始的不带有时间等信息的堆栈,本例如下:
--------- beginning of crash
FATAL EXCEPTION: main
Process: com.icfun.game.cn, PID: 4731
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0, found: 1 Pager id: com.icfun.game.cn:id/most_earn_game_viewpager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.icfun.game.main.page.main.adapter.b.d$a
at android.support.v4.view.ViewPager.a(ViewPager.java:1137)
at android.support.v4.view.ViewPager.b(ViewPager.java:1086)
at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:2190)
at android.view.View.dispatchTouchEvent(View.java:11721)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2955)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2636)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
at com.scwang.smartrefresh.layout.SmartRefreshLayout.dispatchTouchEvent(SmartRefreshLayout.java:864)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2961)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2593)
获取的方法使用如下adb命令:
adb logcat -v raw > 1.txt
即为原始堆栈信息。
adb命令相关用法:https://developer.android.com/studio/command-line/logcat?hl=zh-cn#outputFormat
参考文章:
https://juejin.im/entry/5a4adacb51882538fe632107
https://juejin.im/post/5a5c08ca6fb9a01ca47a7834
https://medium.com/androiddevelopers/practical-proguard-rules-examples-5640a3907dc9