2008-09-01 80 views
4

它可能不是最好的做法,但有沒有方法從第三方的jar文件中刪除未使用的類。看看我的類使用庫的方式,並進行某種覆蓋率分析,然後吐出另一個jar並刪除所有未觸動的類。如何將絨毛從第三方庫中剝離出來?

顯然有這個問題。具體來說,我所使用的使用場景可能不會一直使用所有的類。

但是忽視這些問題,原則上可以做到嗎?

回答

0

jar只是一個zip文件,所以我想你可以。如果你能找到源頭,那就更清潔了。也許嘗試拆解課堂?

0

添加到這個問題,可以提高性能?由於未使用的類不會被JIT編譯,從而改善了啓動時間,還是java會在編譯爲字節碼時自動檢測到它,甚至不處理未使用的代碼?

1

在之前的工作中,我使用了Java混淆器,以及混淆代碼,還刪除了未使用的類和方法。如果你正在做「Class.byName」或任何其他類型的反射東西,你需要告訴混淆器,因爲它不能通過檢查代碼來檢查代碼通過反射調用哪些類或方法。

這個問題當然是因爲你不知道第三方庫的其他部分是否正在進行反射,因此刪除一個「未使用」的類可能會導致事情在你避難的模糊情況下破壞沒有經過測試。

0

這將是一個有趣的項目(有沒有人做過了嗎?)

我想你想給你的工具罐子(S)爲出發點,JAR庫進行清理。它可以使用反射來確定你的jar直接引用哪些類,以及哪些類在調用樹上間接使用(這根本不重要,但可行)。如果在兩個地方遇到任何反射碼,應該發出非常大的警告。

2

有一個工具螞蟻叫做classfileset。您指定您知道需要的根類列表,然後classfileset遞歸分析其代碼以查找所有依賴關係。

或者,您可以開發一個很好的測試套件,它可以執行所需的所有功能,然後在測試覆蓋率工具下運行測試。該工具會告訴你哪些類(和它們中的語句)被實際利用。與靜態分析相比,這可以爲您提供更小的一組代碼。

2

我爲此使用ProGuard。它不僅是一個優秀的混淆器,它還有一個代碼縮小階段,它可以合併多個JAR,然後去除任何未使用的類或類成員。它在收縮時做了一個出色的工作。