Android混淆程式碼錯誤堆疊還原
前言
相信做過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檔案,實現線上堆疊還原,讓你解決問題的速度變得槓槓的。最後,送個雞湯:程式設計師是為解決問題而存在的,而不是為了解決程式設計問題,你的價值取決於你能解決多少問題。