不要なコードの除去

はじめに

Java アプリケーションのソース jar には、まったく使用されていないか、少数のメソッドだけに含まれている膨大な数のソースファイルが含まれている可能性があります。この終了したコードを Objective-C に変換すると、iOS アプリケーションが不必要に肥大化し、変換エラーが発生する可能性が高まります。これは、Java ライブラリのいずれかが J2ObjC トランスレータでサポートされていない機能を使用している場合に特に当てはまります。

ProGuard は、Java バイトコードの圧縮や難読化などのマングリングに役立つオープンソース ツールです。オプションで、バイトコード JAR を指定して、アプリケーションで使用されていないすべてのクラスとメソッドをリストした「使用状況」レポートを出力できます。J2ObjC はこのようなレポートを使用して、変換中にこれらのクラスとメソッドをスキップできます。

ProGuard はこちらからダウンロードできます。

ProGuard の設定

ProGuard は、実行する最適化と生成するレポートを指定するコマンドライン引数として構成ファイルを受け入れます。J2ObjC が認識する必要があるのはデッドコードだけであるため、すべての最適化と余分なロギングを無効にする必要があります。J2ObjC に渡すファイルは、ProGuard ヘッダー テキストと使用状況レポートのみで構成する必要があります。

まず、ソースの JAR に対応するアプリケーションのバイトコード JAR があることを確認します。 ProGuard マニュアルからコピーした次の構成ファイルをテンプレートとして使用することで、J2ObjC が要求する出力を生成できます。

-injars app-bin.jar
-libraryjars /lib/rt.jar

-dontoptimize
-dontobfuscate
-dontpreverify
-printusage
-dontnote

-keep public class com.foo.app.Main {
    public static void main(java.lang.String[]);
}

-keepclassmembers class * {
    static final % *;
    static final java.lang.String *;
}

この構成ファイルを変更して、ProGuard によって不要な要素が削除されないようにします。 jar が単なるライブラリではなくアプリの場合、この例のように main() メソッドを指定すると、必要なものがすべて保持されます。ProGuard からの結果の出力をサニティ チェックとして調べることができます。

ProGuard の実行

アプリのバイトコード JAR とカスタマイズされた ProGuard 構成ファイル(例: usage.pg)を入手したら、次のコマンドを使用して使用状況レポート ファイルを作成できます。

java -jar proguard.jar @usage.pg > usage.log

これにより、アプリで使用されていないクラスとメソッドをリストする usage.log というファイルが作成されます。

デッドコードを除去した J2ObjC の実行

ProGuard の使用状況レポートが作成されたので、コマンドライン フラグ --dead-code-report <file> を使用して J2ObjC でデッドコード排除フェーズを有効にできます。DeadCodeEliminator 変換フェーズでは、使用状況レポートを使用して、Objective-C に変換する前に各ソースファイルからデッドコードを削除します。