前言
相信做過app的同學對代碼混淆應該不陌生吧,如果陌生就自行百度,這里不做普及。我們先思考一個問題,如果我們把代碼混淆了,如果出錯了怎么定位問題?答案非常簡單,只要稍微實踐下你就明白了,下面就是給你整理的對混淆代碼錯誤堆棧還原的方法。
如何混淆?
Android Studio實現混淆很簡單,只需要在build.gradle進行如下配置即可:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
這個是在發布模式下去混淆代碼的,如果想在調試模式下混淆代碼,就增加一個debug的配置即可:
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
mapping.txt文件
mapping文件是我們要實現混淆代碼還原必須要關注的一個文件,它里面存放著源碼到混淆之后的代碼的映射信息,這個文件是在我們執行proguard之后產生的,產生的位置如下圖所示:
制造一個混淆代碼的Crash
啟動MainActivity的時候就會直接Crash并拋出以下異常:
是不是發現出錯的堆棧完全看不懂呢,如果你不會還原的話,你可能根本就定位不到出錯的位置。
怎么還原?
一個字,簡單。利用SDK給我提供的工具就可以,大家要有一顆發現美的眼睛啊,SDK提供了很多有用的工具哦。我們來到sdk/tools/proguard/bin目錄下,會發現三個bat文件:
我們直接雙擊打開proguardgui.bat文件,通過gui來完成我們的還原工作:
哇,好神奇啊,竟然被還原了。但是你有沒有發現,那個Unknown Source還在,根本不知道出錯行在哪,怎么辦?先思考下為什么會出現Unknown Source?原因是我們在Proguard的時候沒有保留源文件名及行號,所以我們只需要在proguard-rules.pro文件增加以下配置:
-keepattributes SourceFile,LineNumberTable
然后我們再次編譯源碼,再還原一次:
完美!
總結
是不是發現總有些自己講不清楚說明白的東西?我們獲取知識都是先從問為什么開始,本篇文章講的只是開發中的一個解決問題的技巧,但你想想如果有很多這種混淆的異常,難道你要一個一個去看,拜托太低效啦。下篇告訴你如果通過Bugly配置Mapping文件,實現線上堆棧還原,讓你解決問題的速度變得杠杠的。最后,送個雞湯:程序員是為解決問題而存在的,而不是為了解決編程問題,你的價值取決于你能解決多少問題。