原生Linux、Apple Watch、游戏构建器与崩溃保护
原生Linux桌面、Apple Watch、游戏构建器与崩溃保护
[LOADING...]
本周带来了原生Linux桌面端口、Apple Watch和Wear OS端口、一个带有高级游戏API的可视化游戏构建器,以及一套全新的崩溃保护系统,后续几天将分别推出相关教程。此外还有一项重大工作,你们大多数人可能并未察觉:我们重建了构建云,而这次重建过程中确实导致了一些构建失败。详情见下文。
原生Linux桌面端口
PR #5239 增加了原生Linux端口,与上周发布的Windows原生端口在结构上是对称的。同样的ParparVM管道将你们的Java/Kotlin字节码转换为C语言,此次通过GTK3、Cairo、Pango和GdkPixbuf进行渲染,OpenGL ES用于3D,GStreamer用于媒体与摄像头,WebKitGTK用于浏览器组件。目标机器上无需JVM:它是一个独立的ELF可执行文件,像任何其他程序一样启动。
我们原以为这会很痛苦,实际上部分过程确实如此,但Linux总体上对开发者相当友好。一个非平凡的应用体积仅为5MB,在我的Linux机器上启动速度甚至快于大多数已安装的GNOME原生应用;得益于默认的Material Design主题,它的外观通常也更出色:
[LOADING...]
大多数功能直接可用,包括摄像头和3D。Linux的难点不在于渲染,而在于打包和依赖管理。我们刻意避开了包管理器的兔子洞,直接提供一个原生二进制文件供用户直接启动,与Windows模式相同。另一个经典的Linux问题是glibc;如果这句话对你毫无意义,那算是你的幸运。我们的解决方案是:针对一个非常古老的glibc(约GLIBC_2.17,2013年版本)进行编译,并动态链接GTK3——这些库在几乎所有桌面环境中都存在。我们还支持 Alpine Linux的musl,以及 x64和arm64 架构。与其他端口一样,这并非仅限本地构建:Linux目标平台在构建云上构建,从Initializr创建的新项目已预先配置好。架构与构建过程在相应教程中有详细说明。
腕上的Codename One:Apple Watch与Wear OS
PR #5252 添加了真正的原生Apple Watch(watchOS)端口,并在Android端提供了Wear OS支持。苹果将手表编程视为与手机或桌面编程完全不同的学科:不同的API、不同的生命周期,以及我们认为理所当然但在手表上根本不存在的UI隐喻(例如没有你熟知的文本字段,也没有浏览器)。这种设计自有其道理,但也引出了一个合理的问题:既然如此,手表API的意义何在?
答案是:复用仍然存在。许多知名应用完全跳过了手表,因为那是一项繁重的工作,然而手表UI实际需要的开发量很小,在Codename One中更是小得可怜。watchOS没有UIKit视图、没有OpenGL ES、也没有Metal,因此该端口提供了一个专用的 Core Graphics渲染后端,并将Codename One运行时托管在SwiftUI外壳内。相同的Java代码,通过 CN.isWatch() 进行分支判断,即可在手表上渲染真实的Codename One UI:
[LOADING...]
这是来自我们测试框架的截图,该框架从未针对手表设计:它仍然包含一个文本字段。但由于这是一个Codename One文本字段,它能正确渲染并“开箱即用”,直到你试图在其中编辑——在手表面上这不会得到你想要的结果;真正的手表UI会直接省略它。
Wear OS则更简单:Wear OS应用本质上是一个普通的Android应用,因此现有的Android端口使用与手机相同的管道进行渲染。你只需通过一个构建提示启用各自平台,关闭提示后手机构建保持不变(字节级相同)。两款可穿戴设备的详细说明见相应教程。
可视化游戏构建器
PR #5253 在上周的 com.codename1.gaming API之上添加了一个可视化游戏关卡编辑器,并提供了高级数据模型和针对大型世界的流式引擎。你无需在代码中手动放置每个精灵,而是直接绘制关卡,为对象标记游戏所需的数字(lives、value、speed),编辑器保存一个小型数据文件,运行时即可播放。你的代码缩减为真正属于你的部分:游戏规则。
这是本周发布中的一个特例。周二的文章将全面介绍编辑器、数据模型和大型世界流式引擎,随后 从周四开始推出一个三部分的教程系列,而非单篇后续文章。第一个教程将构建一个可玩的2D平台游戏“Duke's Coffee Run”,从空白场景到运行中的游戏,包括大多数教程跳过的部分:导入真正的美术资源并为Duke切割动画精灵表。
[LOADING...]
接下来两个部分将在后续的星期四发布:一个是二十一点纸牌游戏,然后是一个第一人称3D地牢,可扩展到大型流式世界。关于构建器的完整介绍及其组件关系见 。一个重要提示:游戏构建器及其高级API目前为测试版。我们正在积极改进,并希望获得你们对编辑器、API形状以及资源工作流的反馈。请通过问题追踪器告诉我们哪些有效、哪些阻碍了你的工作。
无缝崩溃保护
PR #5001 用一个新的设备端客户端 com.codename1.crash 取代了旧的基于邮件的崩溃保护工具,我们认为它在这个领域超越了专门的工具。随着我们增加更多平台,跨所有平台进行测试的挑战越来越大;这正是应对这一挑战的工具,而且它设计为无缝使用。
它在三个层面上实现无缝:你无需配置任何复杂的东西——构建服务器完成繁重工作;它连接到GitHub Issues而非发送大量邮件;并且它在我们支持的每个操作系统上对原生崩溃进行符号化,因此iOS、Android、Windows或Linux上的故障地址都能返回可读的堆栈。在设备端,报告在发送前会写入存储,仅当服务器确认收到后才删除,因此不会因网络不稳定而丢失数据;发送失败会在下次启动时重试,服务器会进行去重处理。
[LOADING...]
个人数据在设备端离开前即被擦除:电子邮件部分脱敏,长数字序列被折叠,且规则可由你覆盖。该功能为可选项,默认关闭;启用只需两行代码,完整说明见 。
幕后:重建的构建云
Codename One成立于2012年,当时Docker还是一个全新的Alpha产品,鲜为人知,构建云底层的许多基础设施都源自那个时代。本周我们对其进行了一次重大的重建与架构重组。过渡过程中导致了一些构建失败,如果你的构建受到影响,我们对造成的中断表示歉意。
最终成果是全新的基础设施,未来更新起来容易得多,且拥有更好的隔离性和安全性。Mac端的工作已接近完成(本周剩余时间继续推进),除UWP和Windows桌面构建外,其他所有平台均已就绪。如果构建行为与之前有所差异,请立即告知我们,最好通过我们网站的聊天功能,以便我们快速响应。
Initializr现已运行在JavaScript端口上
我们悄然将Codename One Initializr切换到了新的JavaScript端口,希望你们没有注意到差异。这正是我们的目标:JavaScript端口应与其他端口体验一致。
这也是我们迄今为止处理过的最困难的端口之一。每一个百分点的兼容性和每一分性能都是一场真正的战斗。这项工作仍在进行中,目标是使JavaScript端口与其他端口对齐,并在不久后正式推出。
来自社区
Francesco Galgani 发表了另一篇深刻文章:Java本应让我们摆脱操作系统的束缚;今天Codename One正接近这一目标。这篇文章值得一读,我们感谢他的写作与见解。
关于节奏的说明:随着大家进入暑假,社区活动有所放缓,我们不确定未来几个月还能保持多快的进展。但我们依然活跃在此,并期待就上述所有内容获得反馈,所以这是发送反馈的好时机。
即将到来的亮点
教程文章紧随本贴之后;以下每个链接将在对应日期生效:
总结
问题追踪器在此,目前这是联系我们的最佳途径。讨论论坛在此,构建云控制台位于 /console/。Playground、Initializr和Skin Designer的位置一如既往。
本文最初发布于 foojay:Native Linux, Apple Watch, A Game Builder And Crash Protection。