繁体   English   中英

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

[英]How do I strip the fluff out of a third party library?

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

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

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

有一种方法。

JarJar项目完成了这个AFAIR。 JarJar项目的第一个目标是允许一个人在你自己的jar中嵌入第三方库,必要时更改包结构。 这样做可以删除不需要的类。

请访问http://code.google.com/p/jarjar/查看。

这是一个关于缩小罐子的链接: http//sixlegs.com/blog/java/jarjar-keep.html

我使用ProGuard 它是一个优秀的混淆器,它有一个代码缩小阶段,可以组合多个JAR,然后去掉任何未使用的类或类成员。 它在缩小方面表现出色

Ant中有一个名为classfileset的工具。 您指定了所需的根类列表,然后类文件集递归分析其代码以查找所有依赖项。

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

在以前的工作中,我使用了一个Java混淆器,它也混淆了代码,还删除了未使用的类和方法。 如果您正在使用“Class.byName”或任何其他类型的反射内容,您需要告诉混淆器,因为它无法通过检查代码通过反射调用哪些类或方法来判断。

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

jar只是一个zip文件,所以我想你可以。 如果你能到达源头,那就更清洁了。 也许尝试拆解课程?

添加到这个问题,可以提高性能吗? 由于未使用的类不会被JIT编译改善启动时间,或者java是否在编译为字节码时自动检测到并且甚至不处理未使用的代码?

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

我认为你给你的工具作为起点,并清理库罐。 它可以使用反射来确定你的jar直接引用哪些类,以及在调用树中间接使用哪些类(这根本不是微不足道的,但可行)。 如果它遇到任何两个地方的任何反射代码,它应该发出非常大声的警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM