如何将绒毛从第三方库中剥离出来?

时间:2020-03-05 18:46:05  来源:igfitidea点击:

这可能不是最佳做法,但是有办法从第三方的jar文件中删除未使用的类。可以查看类使用库的方式并进行某种覆盖率分析的内容,然后吐出另一个jar,并删除所有未触及的类。

显然这是有问题的。具体来说,虽然我使用的使用场景可能不会一直使用所有类。

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

解决方案

回答

jar只是一个zip文件,所以我想可以。如果我们可以找到源头,它会更干净。也许尝试拆解课程?

回答

再加上这个问题,可以提高性能吗?由于未使用的类不会被JIT编译,从而缩短了启动时间,或者Java在编译为字节码时是否会自动检测到它,甚至不处理未使用的代码?

回答

在上一份工作中,我使用了Java混淆器,除了混淆了代码之外,还删除了未使用的类和方法。如果我们正在执行" Class.byName"或者任何其他类型的反射工作,则需要告诉混淆器,因为它无法通过检查代码来分辨反射所调用的类或者方法。

当然,问题在于我们不知道第三方库的其他部分是否在进行任何反射,因此删除"未使用"的类可能会导致我们在未经测试的模糊情况下发生问题。

回答

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

我想我们以工具为起点,然后将要清理的库jar命名为工具。它可以使用反射来确定jar直接引用哪些类,以及在调用树中间接使用哪些类(这一点都不琐碎,但是可行)。如果它在两个位置中的任何一个位置遇到任何反射代码,则应发出很大声的警告。

回答

有一种方法。

JarJar项目执行此操作。 JarJar项目的第一个目标是允许第三方将第三方库嵌入我们自己的jar中,并在必要时更改包结构。这样做可以去除不需要的类。

在http://code.google.com/p/jarjar/上进行检查。

这是有关收缩罐子的链接:http://sixlegs.com/blog/java/jarjar-keep.html

回答

Ant中有一个称为classfileset的工具。我们指定所需的根类列表,然后classfileset递归分析其代码以查找所有依赖项。

或者,我们可以开发一个好的测试套件,以行使所需的所有功能,然后在测试覆盖率工具下运行测试。该工具将告诉我们实际使用了哪些类(以及其中的语句)。与静态分析相比,这可以为我们提供更少的代码集。

回答

我为此使用ProGuard。除了是出色的混淆器之外,它还具有代码收缩阶段,该阶段可以合并多个JAR,然后剥离所有未使用的类或者类成员。它在缩小方面做得很好。