上一篇介紹了apk反編譯的步驟,現在來研究下代碼混淆,因為第三方人員完全可以通過解壓APK文件並從中獲取項目源碼,所以對APK文件的保護顯得至關重要。
代碼混淆亦稱花指令,是將計算機程序的代碼,轉換成一種功能上等價,但是難於閱讀和理解的形式的行為,代碼混淆可以用於程序源代碼,也可以用於程序編譯而成的中間代碼。
一、工具:Proguard
\android-sdks\tools\proguard即可找到該工具,可以再docs里面找到相關手冊
二、 配置腳本
在2.3以上的項目里可以看到proguard-project.txt文件,對於2.3以下的版本,可以去2.3以上版本的項目中復制一份。(我看到有的項目里是proguard.cfg,還沒有驗證)
這個文件時proguard混淆代碼的腳本文件,打開project.properties(老版本為default.properties),在文件的末尾處添加這樣一行代碼:proguard.config=proguard-project.txt,保存該文件,接下來從新編譯你的項目,這時生成的APK文件就已經進行了代碼混淆。
三、主要用法
簡單說下keep參數,這個是設定要保留不參與混淆的類和成員。
keepclass_specification保留指定的類和成員名稱和內容
keepclassmembersclass_specification只保留指定的類成員名稱和內容
keepclasseswithmembersclass_specification
keepnamesclass_specification保留類和成員名稱,混淆內容
keepclassmembernamesclass_specification只保留成員名稱,混淆內容
keepclasseswithmembernames class_specification
在使用過程中,我比較 喜歡建立幾個抽象類,Keep,KeepClassMembers,
KeepClassesWithMembers,KeepNames,KeepClassMemberNames,
KeepClassesWithMemberNames,把需要混淆的核心代碼單獨打包,需要保留特定屬性的類分別繼承各個方法,這樣設定混淆配置時就比較容易。
例:
-dontwarn com.baidu.mapapi.**
-keep class com.baidu.mapapi.**{*;}
這段代碼的意思是com.baidu.mapapi.包下的都不參與混淆(com.baidu.mapapi.是引用的包)
四、簽名打包
五、混淆后代碼
使用反編譯方法反編譯打包后的apk,看到有的類名,方法名變成了沒有意義的字母,說明混淆成功
六、已發布應用程序的調試注意事項
打包后會發現在程序的根目錄下生成了proguard文件夾
里面包含四個文件
dump.txt 描述apk保重所有class的代碼結構
mapping.txt 列出了源代碼與混淆后的類,方法和屬性名字之間的映射。這個文件對於在構建之后得到的bug報告是有用的,因為它把混淆的堆棧跟蹤信息反翻譯為源代碼中的類,方法和成員名字。更多信息,查看解碼混淆過的堆棧跟蹤信息。
seeds.txt 表示沒有混淆的類和成員
usage.txt表示被剝離的類
保存好每一個已發布給用戶的程序的mapping.txt文件。通過保存發布構建版本的mapping.txt文件拷貝,確保當用戶碰到bug,並把混淆后的堆棧調試跟蹤信息提交給你時,你可以進行調試從而修復問題。程序的mapping.txt文件在每次發布構建時都會被覆蓋,所以你一定要注意保存正確的版本。
例如,假設你已經發布了一個應用程序並在繼續在新的版本中開發添加新的功能。接着你馬上啟動混淆器並創建一個新的發布版本。該操作把mapping.txt文件覆蓋了。一個用戶提交了來自當前發布版本的bug報告,該報告包含了堆棧調試信息。你再也不能對用戶的堆棧信息進行調試了,因為這個對應用戶本機上版本的mapping.txt文件不存在了。其他覆蓋mapping.txt文件的情況還有很多,所以對於每一個可能需要調試的版本,你都要確保有一份拷貝。
如何保存mapping.txt文件由你決定。例如,你可以根據版本和構建號來重命名它們,或者連同你的源代碼進行版本控制。
七、 解碼混淆過的堆棧跟蹤信息
當混淆代碼並輸出了一個堆棧調試信息時,這些方法名字是混淆過的,雖然可以進行調試,但是調試變得困難。幸運的是,每當混淆器運行時候,它都會輸出到文件<project_root>/bin/proguard/mapping.txt中,該文件包含了從原始類,方法和屬性名字到混淆后名字的映射。
Windows系統中retrace.bat腳本命令或者Linux和Mac OS X系統中retrace.sh腳本命令能把混淆后的堆棧調試信息轉換為可以理解的文件。它被放在<sdk_root>/tools/proguard/目錄下。運行retrace工具的命令語法是:
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
如果你沒有為<stracktrace_file>指定值,那么retrace工具從標准輸入讀取。
八、需要注意的地方
參考:http://blog.csdn.net/alex197963/article/details/2620619
使用指南 http://wenku.baidu.com/view/5ec1d320ccbff121dd36836e.html