proguard 原理
Java代碼編譯成二進制class 檔案,這個class 檔案也可以反編譯成源代碼 ,除了注釋外,原來的code 基本都可以看到。為了防止重要code 被洩露,我們往往需要混淆(Obfuscation code , 也就是把方法,字段,包和類這些java 元素的名稱改成無意義的名稱,這樣代碼結構沒有變化,還可以運作,但是想弄懂代碼的架構卻很難。 proguard 就是這樣的混淆工具,它可以分析一組class 的結構,根據使用者的配置,然後把這些class 檔案的可以混淆java 元素名混淆掉。在分析class 的同時,他還有其他兩個功能,删除無效代碼(Shrinking 收縮),和代碼進行優化 (Optimization Options)。
預設情況下,proguard 會混淆所有代碼,但是下面幾種情況是不能改變java 元素的名稱,否則就會這樣就會導緻程式出錯。
一, 我們用到反射的地方。
二, 我們代碼依賴于系統的接口,比如被系統代碼調用的回調方法,這種情況最複雜。
三, 是我們的java 元素名稱是在配置檔案中配置好的。
是以使用proguard時,我們需要有個配置檔案告訴proguard 那些java 元素是不能混淆的。
proguard 配置最常用的配置選項
-dontwarn 預設proguard 會檢查每一個引用是否正确,但是第三方庫裡面往往有些不會用到的類,沒有正确引用。如果不配置的話,系統就會報錯。
-keep 指定的類和類成員被保留作為 入口 。
-keepclassmembers 指定的類成員被保留。
-keepclasseswithmembers 指定的類和類成員被保留,假如指定的類成員存在的話。
proguard 問題和風險代碼混淆後雖然有混淆優化的好處,但是它往往也會帶來如下的幾點問題
1,混淆錯誤,用到第三方庫的時候,必須告訴 proguard 不要檢查,否則proguard 會報錯。
2,運作錯誤,當code 不能混淆的時候,我們必須要正确配置,否則程式會運作出錯,這種情況問題最多。
3,調試苦難,出錯了,錯誤堆棧是混淆後的代碼 ,自己也看不懂。
為了防止混淆出問題,你需要熟悉你所有的code ,系統的架構 ,以及系統和你code的內建的接口,并細心分析。 同時你必須需要一輪全面的測試。 是以混淆也還是有一定風險的。 為了避免風險,你可以隻是混淆部分關鍵的代碼,但是這樣你的混淆的效果也會有所降低。
其他Anroid 官方建議 不混淆的,如
Java序列化方法,系統序列化需要固定的方法。
枚舉 ,系統需要處理枚舉的固定方法。
本地方法,不能修改本地方法名
annotations 注釋
資料庫驅動
有些resource 檔案
用到反射的地方
如何實施現在的系統已經配置為混淆時候會保留
自定義View
枚舉
各個開發人員必須檢查自己的code 是否用到反射 ,和其他不能混淆的地方。告訴我來修改配置檔案(已經保留的就不需要了)
目前系統部檢查的第三方庫為
-dontwarn com.tencent.**
-dontwarn org.dom4j.**
-dontwarn org.slf4j.**
-dontwarn org.http.mutipart.**
-dontwarn org.apache.**
-dontwarn org.apache.log4j.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.apache.commons.codec.binary.**
各個開發人員如果新增加第三方庫,需要考慮到其混淆的問題。
--------------------------------------------------------------------------------------------------------------
常量表達式求值
删除不必要的字段存取
删除不必要的方法調用
删除不必要的分支
删除不必要的比較和instanceof驗證
删除未使用的代碼
删除隻寫字段
删除未使用的方法參數
像push/pop簡化一樣的各種各樣的peephole優化
在可能的情況下為方法添加private, static和final修飾符
在可能的情況下使get/set方法成為内聯的
當接口隻有一個實作類的時候,就取代它
選擇性的删除日志代碼
使非final的常量字段成為内聯
像get/set方法一樣使其他方法成為内聯
将常量表達式移到循環之外
Optimizations that require escape analysis
<dl></dl>
<dt>擴充閱讀:</dt>
<dd></dd>
1
<a href="http://proguard.sourceforge.net/" target="_blank">http://proguard.sourceforge.net/</a>
2
<a href="http://www.hijava.org/" target="_blank">http://www.hijava.org/</a>
<dt>開放分類:</dt>