什么是 Codename One 它是如何工作的
Codename One 是一组用于移动应用程序开发的工具,它从 Java 中获取了大量的体系结构。
Codename One 的使命声明是:
将移动设备编程的复杂和分散的任务统一到一组工具,API 和服务中。因此,在不牺牲开发人员的功能/控制的情况下,为移动应用程序开发创建了一种更易于管理的方法。
这实际上意味着将旧的 Write Once Run Anywhere
(WORA)Java 口号带入移动设备,而不会将其降低到最低的公分母。
代号是如何工作的?
Codename One 将多种技术和概念统一到一个外观中:
- API - 抽象各种设备之间的差异。
- 插件 - 客户端计算机上安装的唯一软件,它包括以下功能:
- IDE 集成 - 首选项,完成,发送本机构建的能力
- 模拟器 - 本地设备模拟器,可在本地运行并允许调试应用程序
- Designer / GUI Builder - 高级工具
- 构建服务器 - 构建服务器接受插件发送的本机设备构建,并将二进制文件(JAR,而不是源代码)转换为本机应用程序,如下所述。
- 云服务器 - 云服务器提供推送通知,云记录等功能。
为何构建服务器?
构建服务器允许构建没有 Mac 的本机 iOS 应用程序和没有 Windows 机器的本机 Windows 应用程序。它们消除了安装/更新复杂工具链的需要,并简化了右键单击构建本机应用程序的过程。
例如:由于构建本机 iOS 应用程序需要具有最新版 xcode 的 Mac OS X 计算机,因此 Codename One 会在云中维护此类计算机。当开发人员发送 iOS 版本时,这些 Mac 将用于使用 ParparVM 生成 C 源代码,然后它将使用 xcode 编译 C 源代码并使用 xcode 对生成的二进制文件进行签名。你可以将二进制文件安装到设备或为 appstore 构建分发二进制文件。由于生成了 C 代码,这也意味着在 Apple 发生更改的情况下,你的应用将是面向未来。你还可以将 Objective-C 本机代码注入到应用程序中,同时通过 Codename One 的本机接口功能使其保持 100%可移植性。
订阅者可以使用 Codename One 的 include sources 功能接收 C 源代码,并使用这些源进行基准测试,调试设备等。
大多数其他平台也是如此。对于 Android,J2ME 和 Blackberry,标准 Java 代码按原样执行。
通过在 Codename One 服务器上安装的 retrolambda 支持 Java 8 语法。这用于将字节码无缝转换为 Java 5 语法级别。Java 5 语法被转换为 J2ME / Blackberry 上的 JDK 1.3 cldc 子集,以在所有设备上提供这些语言功能和 API。这是使用基于逆向服务器的基于服务器的字节码处理器和大量自定义代码完成的。请注意,此体系结构对开发人员是透明的,因为构建服务器抽象了设备之间的大部分痛苦差异。
为什么选择 ParparVM
在 iOS 上,Codename One 使用 ParparVM 将 Java 字节码转换为 C 代码,并拥有非阻塞 GC 以及 64 位/ bitcode 支持。此 VM 在 Codename One git 存储库中是完全开源的。在过去,Codename One 使用 XMLVM以非常类似的方式生成本机代码,但 XMLVM 解决方案对于 Codename One 的需求来说过于通用。 ParparVM拥有一种将代码转换为 C(类似于 XMLVM)的独特架构,因为 Codename One 是唯一可以保证未来 iOS 兼容性的解决方案,因为官方支持的 iOS 工具链总是被用来代替无证件行为。
注意: XMLVM 可以在理论上保证它,但不再维护它。
ParparVM 相对于其他方法的主要优势是:
-
真正原生 - 因为代码被转换为 C 而不是直接转换为 ARM 或 LLVM 代码,因此应用程序更具原生性。它使用 Apple 的官方工具和方法,可以从他们的进步中受益,例如最新的 bitcode 或分析功能。
-
较小的类库 - ParparVM 包含完整 JavaAPI 的一小部分,导致最终二进制文件小于替代数量级。这直接映射到性能和内存开销。
-
简单且可扩展 - 要与 ParparVM 一起工作,你需要对 C 语言有一个基本的了解。这对于快速发展的移动开发世界至关重要,因为 Apple 改变了事情,我们需要一个更灵活的 VM。
Windows Phone / UWP
Codename One 在这些端口中有 2 个主要的 Windows VM 端口和 3 或 4 个渲染管道。
旧的 Windows Phone 端口使用 XMLVM 将 Java 字节码转换为 C#。请注意,转换为 C#的 XMLVM 后端与过去用于转换 iOS 代码的后端非常不同。
Codename One 现在通过利用 iKVM 的修改版本来构建本机 Windows 通用应用程序来瞄准 UWP。
JavaScript 端口
Codename One 的 JavaScript 端口基于 TeaVM 项目的惊人工作。TeaVM 背后的团队有效地构建了一个 JVM,它将 Java 字节码转换为 JavaScript 源代码,同时使用非常富有想象力的方法维护线程语义。
JavaScript 端口允许未修改的 Codename One 应用程序在桌面或移动浏览器中运行。端口本身基于 HTML5 Canvas API,提供了 Codename One API 的像素完美实现。
注意: JavaScript 端口仅适用于 Codename One 的企业级订户。
桌面,Android,RIM 和 J2ME
Codename One 的其他端口使用主机/环境上的 VM 来执行运行时。 https://github.com/orfjackal/retrolambda[Retrolambda] 用于以便携方式提供 Java 8 语言功能,对于旧设备,retroweaver 用于提供 Java 5 功能。
Android 端口使用原生 Android 工具,包括最新版本中的 gradle 构建环境。
桌面端口创建标准 JavaSE 应用程序,该应用程序与 JRE 和安装程序一起打包。
注意: 桌面端口仅适用于 Codename One 的专业级订户。
轻量级组件
使 Codename One 脱颖而出的是它采用轻量级架构的 UI 所采用的方法,从而允许 UI 在所有平台上无缝工作。因此,大多数 UI 都是用 Java 开发的,因此非常便携和可调试。轻量级架构仍然包括在轻量级中嵌入重量级小部件的能力。
轻量级架构起源
轻量级组件可以追溯到 Smalltalk 框架,这个概念在 Swing 的 Java 世界中得到了普及。Swing 是 Codename One 的前身 LWUIT 的主要灵感来源。多年来,许多框架采用了这种方法,包括 JavaFX 和 JavaScript 世界中最近的 Ionic。
在 Codename One
轻量级组件是完全用 Java 编写的组件,它绘制自己的接口并处理自己的事件/状态。这具有巨大的可移植性优势,因为相同的代码在所有平台上执行,但它具有许多额外的优点。
通过使用标准继承和覆盖绘制/事件处理,可以无限地自定义轻量级组件。由于轻量级组件完全用 Java 编写,因此开发人员可以在模拟器和 GUI 构建器中准确地预览应用程序。这避免了其他 WORA 解决方案的许多常见缺陷,其中平台特定行为挫败了任何节省的努力。因此,在调试深奥设备时,所有在编码中节省的努力都丢失了。
Codename One 通过使用大多数平台的原生游戏 API(例如 iOS 上的 OpenGL ES)来实现快速性能。
Codename One 中的版本
关于 Codename One 的一个令人困惑的事情是版本。由于 Codename One 是 SaaS 产品,因此版本控制并不像 2.x 或 3.x 一样简单。但是,为了符合这一惯例,Codename One 确实制作了版本化的版本,这些版本会导致一般的混淆。
当发布一个版本的 Codename One 时,版本号指的是发布时的库。然后冻结这些库,并使其可供使用 Versioned Builds 功能的开发人员使用。该插件包括设计器以及与版本化版本无关的所有开发,继续在发布后立即进行定期更新。对于直接转换到标准更新周期的构建服务器也是如此。