1

一部のフレームワークは、バイトコードからのデバッグ情報を使用してメソッド引数名を読み取ります。しかし、デバッグ情報にはさらに多くの情報が含まれています。

クラスのサイズを最小限に抑えるために (不思議に思うだけですが)、すべてのデータを削除し、メソッドの引数名以外をすべて削除してLineNumberTableフィルター処理を行うことができます。LocalVariableTableまたは、変数をフィルタリングして行番号を残すため、stracktrace が行番号とともに残ります。

これが機能するかどうかは誰にもわかりません(テストする前に:)? または、これを行うツールはありますか (自分で書く前に:)?

ありがとう。

EDIT私の質問を明確にするために:説明された方法で変更されたライブラリ(jar)(たとえば、いくつかのLocalVariableTableデータを削除)は、Javaエコシステム(Androidからアプリサーバーまで-jboss、websphere ...)で動作しますか?

EDIT #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 を削除することだけですが、スタック トレースで数値が失われます。

ここで、LineNumberTable を削除しただけで jar が機能するかどうかを確認します。

4

1 に答える 1

0

-g:noneこのデータを削除するオプションを付けてコンパイルするだけです。

クラスサイズをさらに小さくするために、を使用して StackMaps なしでコンパイルできます-target 1.5-source 1.5残念ながら、Java 7 コンパイラーでは、明確な理由もなく、これを行う場合もコンパイルする必要があります。

もちろん、これによりすべてのデバッグ情報が削除されます。フレームワークで使用するために特定の情報を保存したい場合、詳細は問題のフレームワークによって異なります。

于 2013-03-09T21:05:10.710 に答える