ProGuard

ProGuard是一個壓縮、最佳化和混淆Java位元組碼檔案的免費的工具,它可以刪除無用的類、欄位、方法和屬性。可以刪除沒用的注釋,最大限度地最佳化位元組碼檔案。它還可以使用簡短的無意義的名稱來重命名已經存在的類、欄位、方法和屬性。常常用於Android開發用於混淆最終的項目,增加項目被反編譯的難度。

基本信息

壓縮

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

相關詞條

相關搜尋

熱門詞條

聯絡我們