消除死亡代碼

簡介

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 前,從每個來源檔案移除無效程式碼。