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

标签 java strip .class-file debug-information

是否有任何工具可以从 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/

相关文章:

java - 在java中反转链表中交替节点的代码

"in jar"图像在css中的JavaFX用法

java - 验证 Jar 内的 Java 类

java - 在类文件中查找对其他类的引用的简单方法

java - 从字符串创建映射的通用 java 函数

Java MYSQL/JDBC 查询从缓存连接返回陈旧数据

video - 是否有用于从视频文件(avi/divx/xvid/mpeg)中剥离音频(mp3)的API?

java - JVM 字节码访问修饰符标志 0x1000(十六进制) "synthetic"何时设置?

php - 从网址中删除Youtube链接

jquery - 去掉 ASCII 表中 127 以上的任何字符?