介紹
Java的字節碼一般是非常容易反編譯的, 而android采用java編寫, 生成的apk安裝文件實際上就是一個壓縮包, 可以將其解壓縮, 再借用其他工具就能被反編譯出來. 為了能對源代碼就行一些必要的保護, 我們可以對編譯好的class文件進行混淆處理. ProGuard的就是一個混淆器, 混淆器通過刪除從未用過的代碼和使用晦澀名字重命名類、字段和方法,對代碼進行壓縮,優化和混淆, 混淆后的結果是一個比較小的.apk文件, 該文件比較難進行逆向工程.
ProGuard是一個SourceForge上非常知名的開源項目. 官網網址是:
http://proguard.sourceforge.net/
方法
根據 SDK 的版本不同有 2 中不同的代碼混淆方式,以上的 proguard.cfg 參數詳解中所涉及到的信息是在較低版本 SDK 下的混淆腳本,事實上在高版本的 SDK 下混淆的原理和參數也與低版本的相差無幾,只是在不同 SDK 版本的環境下引入混淆腳本的方式有所不同。具體方法如下:
低版本 SDK 下,項目中同時包含 proguard.cfg 和 project.properties 文件,則只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再將項目 Export 即可。
高版本 SDK 下,項目中同時包含 proguard-project.txt 和 project.properties 文件,這時需要在 proguard-project.txt 文件中進行如下信息的配置,然后再將項目 Export 即可。下面以真實的文件進行演示說明。
特殊類的混淆
解碼混淆過的堆棧跟蹤信息
當混淆后的代碼輸出一個堆棧信息時,方法名是不可識別的,這使得調試變得很困難,甚至是不可能的。幸運的是,當ProGuard運行時,它都會輸出一個<project_root>/bin/proguard/mapping.txt文件,而這個文件中包含了原始的類,方法和字段名被映射成的混淆名字。
retrace.bat腳本(Window)或retrace.sh腳本(Linux,Mac OS X)可以將一個被混淆過的堆棧跟蹤信息還原成一個可讀的信息。它位於<sdk_root>/tools/proguard文件夾中。執行retrace工具的語法如下:
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
如果你沒有指定<stacktrace_file>,retrace工具會從標准輸入讀取。
當然 你也可以使用工具 在tools/proguard/bin/ 下面 運行proguardGUI.bat 會運行一個GUI頁面,操作方式很簡單的 就選擇這三個紅款里面的東西就可以了。