gpt4 book ai didi

java - `/usr/bin/strip` 的任何 Java 对应物?

转载 作者:搜寻专家 更新时间:2023-11-01 03:13:05 24 4
gpt4 key购买 nike

是否有任何工具可以从 Java .class 文件中删除调试信息,就像 /usr/bin/strip 可以从 Linux 上的 C/C++ 对象文件中删除一样?

编辑:我喜欢 Thilo 和 Peter Mmm 的回答:Peter 的回答很简短,而且暴露了我对 JDK 附带的内容的无知; Thilo 的 ProGuard 建议无论如何我肯定会检查它似乎提供的所有这些额外功能。谢谢 Thilo 和 Peter!

最佳答案

ProGuard (例如,Android SDK 附带以减少代码大小),可以执行各种操作来缩小 JAR 文件:

  • 评估常量表达式。
  • 删除不必要的字段访问和方法调用。
  • 删除不必要的分支。
  • 删除不必要的比较和 instanceof 测试。
  • 删除未使用的代码块。
  • 合并相同的代码块。
  • 减少变量分配。
  • 删除只写字段和未使用的方法参数。
  • 内联常量字段、方法参数和返回值。
  • 简短或只调用一次的内联方法。
  • 简化尾递归调用。
  • 合并类和接口(interface)。
  • 尽可能将方法设为私有(private)、静态和最终。
  • 尽可能将类设为静态和最终类。
  • 替换具有单一实现的接口(interface)。
  • 执行 200 多个窥视孔优化,例如将 ...*2 替换为 ...<<1。
  • 可选择删除日志记录代码。

他们没有提到删除该列表中的调试信息,但我想他们也可以这样做。

更新:是的,确实是:

By default, compiled bytecode still contains a lot of debugging information: source file names, line numbers, field names, method names, argument names, variable names, etc. This information makes it straightforward to decompile the bytecode and reverse-engineer entire programs. Sometimes, this is not desirable. Obfuscators such as ProGuard can remove the debugging information and replace all names by meaningless character sequences, making it much harder to reverse-engineer the code. It further compacts the code as a bonus. The program remains functionally equivalent, except for the class names, method names, and line numbers given in exception stack traces.

关于java - `/usr/bin/strip` 的任何 Java 对应物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5257987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com