1. 程式人生 > >Android混淆程式碼錯誤堆疊還原

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

這裡寫圖片描述