2016-05-29 32 views
0

我想知道是否有任何工具來優化/縮小我的Java代碼。我已經發現了一些混淆器(http://java-source.net/open-source/obfuscators),但我不確定這是否是我想要的,因爲我實際上仍然需要仍然是「可讀的」Java文件,但要讓它縮小爲例如。爲重複的代碼創建方法,只是讓代碼更好。Minify Code - Java

是否有任何工具可以做到這一點?

+0

混淆器不用於優化代碼。有一些反編譯器可以從類文件中創建源代碼。如果某人擁有.class文件,則可以使用反編譯器創建源代碼。混淆器用你自己的類名/變量/方法名替換名字,沒有任何意義,比如'class A'或'public int b()'。所以在反編譯之後,會使用「壞」名稱而不是你的意志不清的名字。這背後的唯一原因是:混淆人類以至於很難與代碼一起工作 - 如果不是不可能的話。但它與優化無關。 –

回答

2

有一些工具可以重新格式化代碼,指出不太明顯的錯誤或使用編譯時代碼生成來使代碼更具可讀性。你應該檢查出Lombok

不過,可能是重新格式化代碼的最好方法是自己做。創建相當數量的單元測試,以便跟蹤方法的結果,然後您可以不時重新編寫運行測試的代碼。這樣,更改代碼中的任何內容都會花費更少的精力 - 如果您的測試具有良好的質量和覆蓋範圍,那麼在重新格式化代碼後,您的代碼看起來可能完全不同(您希望的方式),並且方法的結果將保持令人滿意。

0

你不是在尋找縮小,而是在尋找自動重構。那有。此外,IDE可以幫助您進行半自動重構和自動重新格式化,還可以減少代碼行。

工具可以幫助您找到需要手動修復的潛在代碼問題。但是,由於他們有一些誤報,只是自動應用他們提出的修正是很危險的。

假設測試足夠全面,測試覆蓋工具也可能有助於發現未使用的代碼。

0

我實際上剛剛發佈了一些東西,幾天前就完成了這個(對於編譯的java。在源代碼級別,你真的可以做的是格式化技巧)It's part of a multi-project repository I'm working on。 截圖:enter image description here

它是如何工作: 使用ASM (字節碼修改庫)讀取類和剝奪調試信息的。然後訪問MANIFEST中給出的主要類。每個類中引用的類型都被添加到列表中,並且也被訪問。該過程以遞歸方式發生,直到引用的所有內容都在列表中。大多數情況下,如果您使用庫,將會有從未引用的類。那些不在列表中,並且當ASM重新編譯它們不包括的類時。

當運行它本身時,它從大約700kb下降到大約150kb。大部分被丟棄的是apache commons和一些我自己的文件,這些文件並沒有被shrinker使用。

+0

如何判斷一個類在編譯時是否未被使用? – shmosel

+0

我的程序工作的方式是它讀取你的jar的主類。然後它遍歷字段類型。這些類型被添加到列表中。然後這些方法被迭代。參數,返回值和局部變量類型被添加到列表中。訪問列表中的每個班級並重復該過程,直到所有引用的內容都在列表中。然後該jar將被重新編譯而不包含調試信息,而不在列表中的類將被排除在編譯之外。 –

+0

因此,任何動態類加載都可能失敗。 – shmosel