某些框架使用字节码中的调试信息读取方法参数名称。但调试信息包含更多内容。
为了最小化类大小(只是想知道),我们可能会删除所有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。
答案 0 :(得分:0)
只需使用-g:none
选项进行编译即可删除此数据。
要进一步减少classsize,可以使用-target 1.5
在没有StackMaps的情况下进行编译。不幸的是,如果你这样做,Java 7编译器要求你也用-source 1.5
编译,没有明显的原因。
当然,这将删除所有调试信息。如果您想保留某些信息以供框架使用,详细信息将取决于相关框架。