代码之家  ›  专栏  ›  技术社区  ›  Allain Lalonde

如何从第三方库中去除绒毛?

  •  4
  • Allain Lalonde  · 技术社区  · 16 年前

    这可能不是最佳实践,但是否有方法从第三方的JAR文件中删除未确认的类。它观察我的类使用库的方式,并进行某种覆盖率分析,然后吐出另一个jar,除去所有未接触的类。

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

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

    7 回复  |  直到 14 年前
        1
  •  8
  •   SaM    16 年前

    有一条路。

    Jarjar项目可以在远处完成这项工作。jar jar项目的第一个目标是允许在自己的jar中嵌入第三方库,如有必要,可以更改包结构。这样做可以去掉不需要的类。

    检查一下 http://code.google.com/p/jarjar/ .

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

        2
  •  2
  •   erickson    16 年前

    在Ant中有一个称为classfileset的工具。指定您知道需要的根类列表,然后类文件集递归地分析它们的代码以查找所有依赖项。

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

        3
  •  2
  •   L. Cornelius Dol    14 年前

    我用 ProGuard 为此。作为一个优秀的模糊器,它还具有代码收缩阶段,可以组合多个jar,然后去掉任何未使用的类或类成员。它做了一个 杰出的 收缩的工作。

        4
  •  1
  •   Paul Tomblin    16 年前

    在以前的工作中,我使用了一个Java混淆器,不仅混淆了代码,还删除了未使用的类和方法。如果您正在执行“class.byname”或任何其他类型的反射操作,则需要告诉模糊器,因为它无法通过检查代码来分辨反射调用的类或方法。

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

        5
  •  0
  •   Eugene Yokota    16 年前

    JAR只是一个压缩文件,所以我想你可以。如果你能找到源头,它就更干净了。也许可以试着分解课堂?

        6
  •  0
  •   Hoffmann    16 年前

    除了这个问题,这能提高性能吗?因为未使用的类不会被JIT编译,提高启动时间,还是Java在编译到字节码时自动检测到,甚至不处理未使用的代码?

        7
  •  0
  •   dbkk    16 年前

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

    我想你应该把你的jar作为一个起点,把库jar作为清理的起点。它可以使用反射来确定哪些类是您的JAR直接引用的,哪些类是在调用树中间接使用的(这一点都不简单,但是可行的)。如果它在这两个地方遇到任何反射代码,它应该发出非常大的警告。