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

时间:2011-03-10 09:57:10

标签: java strip .class-file debug-information

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

编辑:我喜欢Thilo和Peter Mmm的答案:Peter很简短,并且忽略了我对JDK的附件; Thilo的ProGuard建议是我无论如何都要检查它所提供的所有额外功能。谢谢Thilo和Peter!

1 个答案:

答案 0 :(得分:3)

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

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

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

更新:是的,确实:

  

默认情况下,编译后的字节码仍然包含很多调试信息:源文件名,行号,字段名,方法名,参数名,变量名等。这些信息可以直接反编译字节码和反向工程整个计划。有时,这是不可取的。像ProGuard这样的混淆器可以删除调试信息并用无意义的字符序列替换所有名称,这使得对代码进行反向工程变得更加困难。它进一步压缩代码作为奖励。除了异常堆栈跟踪中给出的类名,方法名和行号外,该程序在功能上保持等效。