删除LineNumberTable并过滤LocalVariableTable?

时间:2013-03-09 20:37:44

标签: java bytecode java-bytecode-asm

某些框架使用字节码中的调试信息读取方法参数名称。但调试信息包含更多内容。

为了最小化类大小(只是想知道),我们可能会删除所有LineNumberTable数据并通过删除除方法参数名称之外的所有内容来过滤LocalVariableTable。或者只是过滤变量,留下行号,因此行号保留在行号中。

有没有人知道这是否可行(在我测试之前:)?或者一个可以做到这一点的工具(在我写自己之前:)?

感谢名单。

编辑澄清我的问题:以解释方式修改的库(jar)是否会在java生态系统中运行(从android到app服务器 - jboss,websphere) ...)?

编辑#2 我已经为条带化创建了一个快速而又脏的工具,这里有一些结果。

original jar size: 1,288,625
stripped just non-method local variables: 1,272,095  (99%)
removed and LineNumberTable: 1,192,492 (93%)

从这些结果(如果我的代码是正确的;)我们可以得出结论,过滤LocalVariableTable无助于最小化;唯一有意义的是剥离LineNumberTable - 但是我们会在堆栈跟踪中放松数字。

现在只是想知道jar是否可以只删除LineNumberTable。

1 个答案:

答案 0 :(得分:0)

只需使用-g:none选项进行编译即可删除此数据。

要进一步减少classsize,可以使用-target 1.5在没有StackMaps的情况下进行编译。不幸的是,如果你这样做,Java 7编译器要求你也用-source 1.5编译,没有明显的原因。

当然,这将删除所有调试信息。如果您想保留某些信息以供框架使用,详细信息将取决于相关框架。

相关问题