消除死代码

简介

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。