混淆器生成檔案的作用

銳湃發表於2015-11-26

http://blog.csdn.net/tiger119/article/details/7875794

參考自:

http://android.tgbus.com/Android/tutorial/201107/358743.shtml

http://hi.baidu.com/benbearlove/blog/item/aaa36de671f3153db93820e2.html

 

ProGuard是一個壓縮、優化和混淆Java位元組碼檔案的免費的工具,它可以刪除無用的類、欄位、方法和屬性。可以刪除沒用的註釋,最大限度地優化位元組碼檔案。它還可以使用簡短的無意義的名稱來重新命名已經存在的類、欄位、方法和屬性。這樣做的結果是更小的jar、apk……,並且更難被反編譯。

Android的編譯環境中已預設整合了Proguard,但只有在release模式下編譯才會執行。此狀態下,它會在用到ant release或是Eclipse的匯出嚮導時,自動檢查proguard.config屬性是否已設定,如果設定了,ProGuard就會在打成包之前,自動處理程式的位元組碼。Debug模式下,之所以不觸發,是因為混淆後的程式碼會使得除錯變得更加累贅。

 

準備工作:

1、切換到release模式

Eclipse預設的Java Compile環境是Debug模式,切換到release模式只需右擊工程,選擇屬性,在“Properties for ProjectName”視窗中將“Java Compile”——>”Classfile Generation”中的debug選項去除,點選【Apply】,點【OK】關閉視窗即可生效。

2、  準備keystore

Android規定所有程式必須簽名,否則就不會安裝。所以在混淆打包過程中會有簽名這一選項,此過程需要用到keystore。如果keystore已存在,或是在過程中ADT已經自動用keytool生成了,就不需要重新再生成了;如果沒有的話,可用jdk/bin目錄下的keytool自己生成一個,示例如下:

Cmd程式碼  收藏程式碼
  1. D:\Program Files\Java\jdk1.6.0_17\bin>keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore  

 

 

其中引數-validity為證照有效天數,這裡我們寫的大些10000天。還有在輸入密碼時沒有回顯(儘管輸就是啦) 並且 退格,tab等都屬於密碼內容,這個密碼在給.apk檔案簽名的時候需要.

 

 

設定proguard.config屬性:

         在建立Android工程時,proguard.cfg檔案會在根目錄自動被建立,該檔案定義了ProGuard如何優化和混淆程式碼。其預設的配置只覆蓋了一些通用的情況,但也滿足了基本的需求;如需深入定製,還需參考相關的配置文件。

         預設情況下,proguard.config屬性是未被設定的,如需啟用,則在工程根目錄下的default.properties檔案中設定,其路徑可以是相對路徑或是絕對路徑。

書寫形式如可以是這樣的:

Default.properties程式碼  收藏程式碼
  1. proguard.config=proguard.cfg  

 

 

 

也可以將proguard.cfg檔案放到別處,然後指定路徑:

Default.properties程式碼  收藏程式碼
  1. proguard.config=/path/to/proguard.cfg  

  

 

 

 

混淆打包:

在release模式下,有如下幾種匯出方式:

1、右擊工程->android tools->export signed android package生成簽名的包,

2、右擊工程——>Export選擇匯出型別

3、ant release

 

混淆成功後,除生成了指定型別的混淆包外,還會在工程的根目錄下或是根目錄下得bin資料夾中生成proguard資料夾,裡面包含dump.txt、mapping.txt、seeds.txt和usage.txt四個檔案。

dump.txt

描述.apk檔案中所有類檔案間的內部結構

 

mapping.txt

列出了原始的類,方法和欄位名與混淆後程式碼間的對映。這個檔案很重要,當你從release版本中收到一個bug報告時,可以用它來翻譯被混淆的程式碼。

 

seeds.txt

列出了未被混淆的類和成員

 

usage.txt

列出了從.apk中刪除的程式碼

 

 

配置 ProGuard:

一些情況下,proguard.cfg檔案中的預設配置就足夠了。然而,有些情況ProGuard也很難正確分析,它可能會刪除它認為不用的程式碼,但實際上正是你的程式所需要的。

例如:

只在AndroidManifest.xml檔案中引用的類

由JNI呼叫的方法

動態引用的欄位和方法

 

預設的proguard.cfg檔案努力去覆蓋通用的情況,但有可能你會遇到如ClassNotFoundException這樣的異常,而這正好是由於ProGuard移除了整個類造成的。

你可以修正由於ProGuard移除程式碼造成的錯誤,只需要在proguard.cfg檔案中新增一行“-keep”。例如:

Java程式碼  收藏程式碼
  1. -keep public class <MyClass>  

 

 

使用-keep選項時,有一些選項和建議,因此,強烈建議你閱讀ProGuard手冊來了解更多關於定製配置檔案的資訊。“Overview of Keep options”和“Examples section”將非常有用


轉自:http://blog.csdn.net/yueliangniao1/article/details/8462335

相關文章