消除死代码

简介

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。