壓縮
JAVA原始碼(.java檔案)通常被編譯為位元組碼(.class檔案)。而完整的程式或程式庫通常被壓縮和發布成Java文檔(.jar檔案)。位元組碼比 Java源檔案更簡潔,但是它仍然包含大量的無用代碼,尤其它是一個程式庫的時候。ProGuard的壓縮程式操作能分析位元組碼,並刪除無用的類、欄位和方法。程式只保留功能上的等價,包括異常堆疊描述所需要的信息。
位元組碼
通常情況下,編譯後的位元組碼仍然包含了大量的調試信息:源檔案名稱,行號,欄位名,方法名,參數名,變數名等等。這些信息使得它很容易被反編譯和通過逆向工程獲得完整的程式。有時,這是令人厭惡的。例如像ProGuard這樣的混淆器就能刪除這些調試信息,並用無意義的字元序列來替換所有名字,使得它很難進行逆向工程,它進一步地精簡代碼。除了異常堆疊信息所需要的類名,方法名和行號外,程式只會保留功能上的等價。通過以上的了解,你應該明白為什麼需要混淆了。
種類最佳化
ProGuard支持以下種類的最佳化:
除了在壓縮操作刪除的無用類,欄位和方法外,ProGuard也能在位元組碼級提供性能最佳化,內部方法有:
常量表達式求值
刪除不必要的欄位存取
刪除不必要的方法調用
刪除不必要的分支
刪除不必要的比較和instanceof驗證
刪除未使用的代碼
刪除只寫欄位
刪除未使用的方法參數
像push/pop簡化一樣的各種各樣的peephole最佳化
在可能的情況下為類添加static和final修飾符
在可能的情況下為方法添加private, static和final修飾符
在可能的情況下使get/set方法成為內聯的
當接口只有一個實現類的時候,就取代它
選擇性的刪除日誌代碼
實際的最佳化效果是依賴於你的代碼和執行代碼的虛擬機的。簡單的虛擬機比有複雜JIT編譯器的高級虛擬機更有效。無論如何,你的位元組碼會變得更小。
不支持類
仍有一些明顯需要最佳化的技術不被支持:
使非final的常量欄位成為內聯
像get/set方法一樣使其他方法成為內聯
將常量表達式移到循環之外
Optimizations that require escape analysis