【Android】混淆器(ProGuard)

混淆器(ProGuard)

混淆器經過刪除從未用過的代碼和使用晦澀名字重命名類、字段和方法,對代碼進行壓縮,優化和混淆。結果是一個比較小的.apk文件,該文件比較難進行逆向工程。所以,當你的應用程序對安全敏感(要求高),例如當你受權應用程序的時候,混淆器是一種重要的保護手段。html

混淆器被集成在android 構建系統中,因此你沒必要手動調用它。同時混淆器僅在發佈模式下進行構建應用程序的時候纔會運行起來,因此在調試模式下構建程序時,你沒必要處理混淆代碼。讓混淆器運行起來是可選擇的,可是推薦選上。android

這個文檔描述了怎樣啓用並配置混淆器,以及使用跟蹤(retrace)工具對混淆的堆棧跟蹤信息(stack traces)進行解碼。web

啓用混淆器Enabling ProGuard

    當你新建了一個Android工程以後,一個proguard.cfg文件會在工程的根目錄下自動建立。這個文件定義了混淆器是怎樣優化和混淆你的代碼的,因此懂得怎樣根據你的須要來定製是很是重要的。缺省的配置文件僅覆蓋到了一般狀況,因此根據你的需求,極可能須要編輯它。接下來的內容是關於經過定製混淆器配置文件來對混淆器配置安全

    爲了讓啓用混淆器做爲Ant或者Eclipse構建過程當中一部分,能夠在<project_root>/default.properties文件中,設置proguard.config屬性。路徑能夠是絕對路徑或者工程根目錄的相對路徑。app

    若是你讓proguard.cfg文件在缺省位置(工程的根目錄),你能夠像這樣指定位置:ide

  1. proguard.config=proguard.cfg
     一樣,你能夠把該文件放到任意的位置,並指定它的絕對路徑。
  1. proguard.config=/path/to/proguard.cfg

    當你在發佈模式下,或者經過運行ant release,或者經過使用Eclipse中的Export Wizard構建你的應用程序的時候,構建系統都會自動地去檢查proguard.config屬性是否被設置了。若是被設置了,混淆器在把全部東西打包成.apk文件以前,自動地對應用程序字節碼進行混淆處理。而在調試模式中構建則不會調用混淆器,由於那樣調試會更加繁重。工具

         運行混淆器以後輸出的文件有:優化

         dump.txtspa

                   描述.apk包中全部class文件的內部結構。.net

         mapping.txt

                   列出了源代碼與混淆後的類,方法和屬性名字之間的映射。這個文件對於在構建以後獲得的bug報告是有用的,由於它把混淆的堆棧跟蹤信息反翻譯爲源代碼中的類,方法和成員名字。更多信息,查看解碼混淆過的堆棧跟蹤信息

         seeds.txt

                   列出那些未混淆的類和成員。

         usage.txt

                   列出從.apk中剝離的代碼。

         這些文件放在如下目錄中:

<project_root>/bin/proguard 當你使用Ant

<project_root>/proguard 當你使用Eclipse

注意: 每次在發佈模式下構建時,這些文件都會被最新的文件覆蓋。因此每次發佈程序時候,爲了反混淆來自構建時產生的bug報告,請保存這些文件的一個拷貝。對於爲何要保存這些文件的重要性的更多信息,請查看程序發佈調試注意事項。

混淆器配置(Configuring ProGuard)

    某些狀況下,proguard.cfg文件的缺省配置能夠知足需求了。可是,對於混淆器來講,大多數狀況作出正確的分析是困難的,而且它或許會刪除在它看來是無用的,但對於程序來講卻確實須要的代碼。一些例子以下:

一個僅引用於AndroidManifest.xml文件的類。

一個經過JNI調用的方法。

動態引用的屬性和方法。

缺省的proguard.cfg文件試圖覆蓋普通的狀況,可是你可能碰到相似ClassNotFoundException的異常,這個異常出如今當你的程序去訪問一個被混淆器移除了的類的時候。

你能夠在proguard.cfg文件中添加-keep這一行來修復這些錯誤。例如:

  1. -keep publicclass<MyClass>
     -Keep 設置有不少可選項和注意地方,因此爲了得到更多關於配置信息,推薦你閱讀 混淆器用戶手冊 。特別有用的有 Keep 選項綜述 舉例部分 。在混淆器手冊 問題解決方案 部分,介紹了代碼在混淆過程當中你可能碰到的其餘常見問題。

 解碼混淆過的堆棧跟蹤信息(Decoding Obfuscated Stack Traces)

    當混淆代碼並輸出了一個堆棧調試信息時,這些方法名字是混淆過的,雖然能夠進行調試,可是調試變得困難。幸運的是,每當混淆器運行時候,它都會輸出到文件<project_root>/bin/proguard/mapping.txt中,該文件包含了從原始類,方法和屬性名字到混淆後名字的映射。

    Windows系統中retrace.bat腳本命令或者LinuxMac OS X系統中retrace.sh腳本命令能把混淆後的堆棧調試信息轉換爲能夠理解的文件。它被放在<sdk_root>/tools/proguard/目錄下。運行retrace工具的命令語法是:

  1. retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:
  1. retrace.bat -verbose mapping.txt obfuscated_trace.txt

若是你沒有爲<stracktrace_file>指定值,那麼retrace工具從標準輸入讀取。

 

已發佈應用程序的調試注意事項(Debugging considerations for published applications)

    保存好每個已發佈給用戶的程序的mapping.txt文件。經過保存發佈構建版本的mapping.txt文件拷貝,確保當用戶碰到bug,並把混淆後的堆棧調試跟蹤信息提交給你時,你能夠進行調試從而修復問題。程序的mapping.txt文件在每次發佈構建時都會被覆蓋,因此你必定要注意保存正確的版本。

    例如,假設你已經發布了一個應用程序並在繼續在新的版本中開發添加新的功能。接着你立刻啓動混淆器並建立一個新的發佈版本。該操做把mapping.txt文件覆蓋了。一個用戶提交了來自當前發佈版本的bug報告,該報告包含了堆棧調試信息。你不再能對用戶的堆棧信息進行調試了,由於這個對應用戶本機上版本的mapping.txt文件不存在了。其餘覆蓋mapping.txt文件的狀況還有不少,因此對於每個可能須要調試的版本,你都要確保有一份拷貝。

          如何保存 mapping.txt 文件由你決定。例如,你能夠根據版本和構建號來重命名它們,或者連同你的源代碼進行版本控制。
 

參考文章

    http://hunankeda110.iteye.com/blog/1672957
    http://proguard.sourceforge.net/index.html#manual/usage.html
    http://www.cnblogs.com/over140/archive/2011/04/22/2024528.html#ConfiguringProGuard
相關文章
相關標籤/搜索