5

/usr/bin/stripLinuxのC/C ++オブジェクトファイルと同じように、Java .classファイルからデバッグ情報を削除できるツールはありますか?

編集:私はThiloとPeter Mmmの両方の答えが好きでした:Peterは短く、JDKに何が付属しているかについての私の無知を露呈するほどでした。ThiloのProGuardの提案は、それが提供するように見えるすべての追加機能について、とにかく私が間違いなくチェックしているものです。ティロとピーター、ありがとう!

4

1 に答える 1

4

ProGuard(たとえば、コードサイズを縮小するためにAndroid SDKに付属しています)は、JARファイルを縮小するためにあらゆる種類の操作を実行できます。

  • 定数式を評価します。
  • 不要なフィールドアクセスとメソッド呼び出しを削除します。
  • 不要なブランチを削除します。
  • 不要な比較とinstanceofテストを削除します。
  • 未使用のコードブロックを削除します。
  • 同一のコードブロックをマージします。
  • 変数の割り当てを減らします。
  • 書き込み専用フィールドと未使用のメソッドパラメータを削除します。
  • インライン定数フィールド、メソッドパラメータ、および戻り値。
  • 短い、または1回だけ呼び出されるインラインメソッド。
  • 末尾再帰呼び出しを単純化します。
  • クラスとインターフェースをマージします。
  • 可能な場合は、メソッドをプライベート、静的、およびファイナルにします。
  • 可能な場合は、クラスを静的で最終的なものにします。
  • 単一の実装を持つインターフェースを置き換えます。
  • ...*2を...<<1に置き換えるなど、200を超えるのぞき穴の最適化を実行します。
  • オプションで、ロギングコードを削除します。

彼らはそのリストからデバッグ情報を削除することについては言及していませんが、私は彼らもそれを行うことができると思います。

更新:はい、確かに:

デフォルトでは、コンパイルされたバイトコードには、ソースファイル名、行番号、フィールド名、メソッド名、引数名、変数名など、多くのデバッグ情報が含まれています。この情報により、バイトコードの逆コンパイルとプログラム全体のリバースエンジニアリングが簡単になります。場合によっては、これは望ましくありません。ProGuardなどの難読化ツールは、デバッグ情報を削除し、すべての名前を無意味な文字シーケンスに置き換えることができるため、コードのリバースエンジニアリングがはるかに困難になります。ボーナスとしてコードをさらに圧縮します。プログラムは、例外スタックトレースで指定されたクラス名、メソッド名、および行番号を除いて、機能的に同等のままです。

于 2011-03-10T09:59:27.083 に答える