如何去除第三方库中的冗余代码?

4

可能不是最佳实践,但是否有办法从第三方的jar文件中删除未使用的类。查看我的类如何使用库并进行某种覆盖分析,然后输出另一个jar文件,其中包含所有未被触及的类。

显然,这存在问题。具体来说,我使用情景可能不会始终使用所有类。

但是,忽略这些问题,原则上可以做到吗?

7个回答

8

2

我使用ProGuard来完成这个任务。除了是一个优秀的混淆工具,它还有一个代码缩小阶段,可以将多个JAR文件合并,然后删除未使用的类或类成员。它在缩小方面做得非常出色


2

Ant中有一个叫做classfileset的工具。你需要指定你所需的根类列表,然后classfileset会递归地分析它们的代码以找到所有依赖项。

或者,你可以开发一个良好的测试套件来测试所有需要的功能,然后在测试覆盖率工具下运行你的测试。该工具将告诉你哪些类(及其中的语句)实际被使用。这可能比静态分析得到的代码集更小。


1
在之前的工作中,我使用了一个Java混淆器,除了混淆代码外,还删除了未使用的类和方法。如果你正在使用"Class.byName"或其他类型的反射操作,你需要告诉混淆器,因为它无法通过检查代码来确定由反射调用的类或方法。
当然,问题在于你不知道第三方库的其他部分是否会进行任何反射操作,因此删除一个“未使用”的类可能会导致在你没有测试过的复杂情况下发生故障。

0

jar只是一个zip文件,所以我猜你可以。如果你能够获取源代码,那会更清晰明了。也许尝试反汇编类?


0
补充一下这个问题,这样做能提高性能吗?因为未使用的类不会被JIT编译,从而提高启动时间,或者Java在编译成字节码时自动检测到未使用的代码并且不处理它们?

0

这将是一个有趣的项目(已经有人做过了吗?)

我想你会把你的jar文件作为起点,以及需要清理的库jar文件提供给工具。它可以使用反射来确定你的jar文件直接引用哪些类,以及在调用树下间接使用哪些类(这并不容易,但可行)。如果在任何两个地方都遇到了反射代码,它应该发出非常响亮的警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接