有没有任何工具可以从 Java .class 文件中删除调试信息,就像/usr/bin/strip
可以在 Linux 上从 C/C++ 目标文件中获取吗?
EDIT:我喜欢 Thilo 和 Peter 的回答:Peter 的回答很简短,而且暴露了我对 JDK 附带的内容的无知; Thilo 的 ProGuard 建议是我肯定会检查的,因为它似乎提供了所有这些额外的功能。谢谢蒂洛和彼得!
ProGuard http://proguard.sourceforge.net/index.html#/FAQ.html(例如 Android SDK 附带的用于减少代码大小),可以执行各种操作来缩小 JAR 文件:
- 计算常量表达式。
- 删除不必要的字段访问和方法调用。
- 删除不必要的分支。
- 删除不必要的比较和instanceof 测试。
- 删除未使用的代码块。
- 合并相同的代码块。
- 减少变量分配。
- 删除只写字段和未使用的方法参数。
- 内联常量字段、方法参数和返回值。
- 内联方法较短或仅调用一次。
- 简化尾递归调用。
- 合并类和接口。
- 尽可能将方法设为私有、静态和最终。
- 尽可能使类静态且最终。
- 替换具有单一实现的接口。
- 执行 200 多项窥孔优化,例如用 ...
- (可选)删除日志记录代码。
他们没有提到删除该列表中的调试信息,但我想他们也可以这样做。
Update:确实是的:
默认情况下,编译后的字节码仍然包含大量调试信息:源文件名、行号、字段名、方法名、参数名、变量名等。这些信息使得反编译字节码和对整个程序进行逆向工程变得简单。有时,这是不可取的。 ProGuard 等混淆器可以删除调试信息,并用无意义的字符序列替换所有名称,从而使对代码进行逆向工程变得更加困难。作为奖励,它进一步压缩了代码。除了异常堆栈跟踪中给出的类名称、方法名称和行号之外,该程序在功能上保持等效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)