1

一些框架使用来自字节码的调试信息来读取方法参数名称。但调试信息包含更多。

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

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

谢谢。

编辑为了澄清我的问题:以解释方式修改的库(jar)(例如剥离一些 LocalVariableTable 数据)是否可以在 java 生态系统中工作(从 android 到应用服务器 - 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 的情况下工作。

4

1 回答 1

0

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

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

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

于 2013-03-09T21:05:10.710 回答