
备受期待的 iOS 上的 Hotspot 项目报告了重大进展——OpenJDK 现在能够在 iOS 上构建和运行。这是一段很久以前就开始的旅程的下一个里程碑——InfoQ 最早在 2015 年就对此做了报道。
最近,OpenJDK 的移动仓库(这是主仓库的下游)已经能够构建 libjvm 的静态版本,允许 iOS 二进制文件执行 Java 代码。
Johan Vos(Gluon)是一位长期的 Java 移植者(一直追溯到 Blackdown 时代),他作为 OpenJDK 移动项目的项目负责人,一直在领导这项工作。
他告诉 InfoQ,“一个 Java,运行在任何平台上”的概念仍然是关键,鉴于 Java 仍然是后端和云系统的性能、可扩展性和可维护性应用程序的一个很好的选择,没有理由说 Java 开发者不能使用他们喜欢和擅长的语言和生态系统来创建移动应用程序。
该项目基于 Zero 解释器(之所以这样称呼,是因为它是用纯 C++编写的,并且完全没有与平台绑定的汇编代码)。这是 Hotspot 在构建时可以配置的两种不同的解释器之一。大多数 Java 构建使用“模板解释器”,它基于在 JVM 启动时动态构建字节码的分派表。
“如果开发者编写 Java 代码,他们期望该代码应该在支持相同 Java 版本的任何设备上运行。我们过去几个月专注于 Zero 的主要原因是,它允许我们与最新的上游 OpenJDK 代码保持一致。使用 Zero 允许我们测试所有的 JDK 类和特性,并且它允许我们明确区分功能工作和性能工作。”Vos 解释道。
预计 Java 应用程序在 iOS 上的性能将面临一些挑战,因为苹果不允许应用程序使用运行时生成的汇编代码,这不仅排除了模板解释器,也排除了 JIT 编译器。
尽管如此,Vos 对 Zero 的性能印象深刻,他说“Zero 作为一个解释器做得非常出色。然而,仅靠 Zero 还不足以创建高性能的 iOS 应用程序。”他还提到了之前的方法,该方法使用了 RoboVM 和 GraalVM 的 AOT 编译器,提前编译所需的 Java 方法,然后使用修改过的 VM 执行这些方法。这种技术可提供令人印象深刻的性能(与使用 Objective-C 或 Swift 时的性能相当),但问题是这种方法附带的 VM 与 OpenJDK 不是 100%对齐。
新策略是使用 Zero 增强 AOT 编译方法和其他来自 OpenJDK 的Project Leyden的改进,以规避苹果的“无 JIT”规则。Project Leyden 的主要目标不是修复移动设备的性能,但目前在 Leyden 进行的工作是适用的,并且保证与 OpenJDK 中开发的 JVM 和 JDK API 紧密对齐。
Vos 将 Leyden 与之前用于在 iOS 上运行 Java 应用程序的部分 AOT 方法进行了比较——其中“一些”Java 方法在应用程序开始运行之前已经编译。他认为,Leyden(用于提前创建本地代码)和 Zero(用于运行未提前编译的动态代码)的结合可能是 Java 在 iOS 上的获胜组合,因为它允许完全执行,而不会牺牲 Java 的(通常被低估的)动态特性。
另一项工作涉及为 Android 编译 OpenJDK 二进制文件以执行未修改的 Java 应用程序——与为 DEX 字节码格式编译以由 Android 运行时(ART)执行不同。预计这将比 iOS 工作的技术复杂性要低,因为 Android 环境中没有动态代码限制。
移动 OpenJDK 项目目前的状态是可以为 iOS 和 Android 编译 VM 和类库,并且可以在真实设备上部署和运行。Java 库作者应该能够用当前的状态部署他们的库,但下一步是启用转换为 iOS 和 Android 的本地库。
然而,许多 Java 开发者将希望创建的不仅仅是一个库,而是为移动设备创建一个完整的应用程序。这需要一个 GUI 工具包,移动 OpenJDK 采取的方法是使用 OpenJFX 来实现这一功能。基础的 JavaFX 库已经在 iOS 和 Android 上编译成功,但需要更多的工作来与低级别的平台本地图形 API 集成,以实现硬件加速渲染。
OpenJDK 移动所采取的方法侧重于可维护性,与 OpenJDK 100%对齐。因此,许多程序员熟悉的完整开发人员友好工具集仍在开发中。然而,Vos 相信,现在基础更加稳定,不同领域的开发者(编译器、工具、UI、库)将加入这项工作。目的是使团队能够创建或将当前工作集成到他们的项目中,并生产跨平台的工具和应用程序,而不必担心来自较低层级的破坏性变化。
一个新的社区项目也已经建立,允许感兴趣的开发者合作,以确定下一步需要采取的措施,使 Java 成为现代移动设备上的一等公民。
原文链接:Running Java on iOS: Gluon Introduces OpenJDK Mobile Resources and Automated Build Pipelines








评论