返回首页
最新
不久前,我决定尝试使用 Rust 构建一个 Android 应用。在几周后,我成功地让它运行起来。最近有一个新的 iced 版本发布,所以我刚刚将示例更新到了新的 iced 和 wgpu。我想分享我的经验,以吸引更多人关注 Rust 在 Android 上的应用。
首先,我要感谢所有在基础库和工具上辛勤工作的人员,例如:
- [android-activity](https://github.com/rust-mobile/android-activity)
- [jni-rs](https://github.com/jni-rs/jni-rs)
- [wgpu](https://github.com/gfx-rs/wgpu)
- [winit](https://github.com/rust-windowing/winit)
- 以及其他许多人
当我开始时,我需要了解现有的工具和示例。幸运的是,有一套很好的示例,使用了 NativeActivity 和 GameActivity:
[rust-android-examples](https://github.com/rust-mobile/rust-android-examples)
基本的方法是我们使用 android-activity、winit 和 wgpu,仅此而已。在此基础上,你可以在 rust-android-examples 仓库中找到一些 egui 示例。
好吧,在我让基本示例运行后,我想将它们与 iced 结合起来。Iced 是一个跨平台的 GUI 库,专注于桌面和网页。就我目前所知,移动支持显然不是它的目标。然而,有一个问题中,有人发布了他们的实验。这就是我知道它是可能的原因:
[iced issues #302](https://github.com/iced-rs/iced/issues/302)
有一种方法可以将 iced 集成到 wgpu 应用中,称为集成示例:
[iced integration example](https://github.com/iced-rs/iced/tree/0.14.0/examples/integration)
如上所述,使用 winit 和 wgpu 结合 android-activity 就足以构建应用。将 1 + 1 结合起来,我得到了 2:让我们使用 iced 集成示例与 android-activity。编译几乎没有错误,过程相当简单。我遇到的第一个问题是没有文本渲染。我通过加载字体解决了这个问题,具体方法可以参考这里:
[cosmic-text issue #243](https://github.com/pop-os/cosmic-text/issues/243#issue-2189977938)
然后,我对一些小部件进行了补丁,以添加触摸支持。就这样。我的角色是将所有之前的工作结合在一起,形成一个可运行的示例。
使用 Rust 构建 Android 应用的其他一些方式:
- xilem 明确目标是支持移动设备 [xilem](https://github.com/linebender/xilem)
- egui 支持移动设备 [egui](https://github.com/emilk/egui)
- 一些游戏引擎,如 Fyrox 和 Bevy 支持移动设备:
- [Fyrox](https://github.com/FyroxEngine/Fyrox)
- [Bevy](https://github.com/bevyengine/bevy)
- 基本上任何基于 winit 和 wgpu 的项目
以上所有内容都与使用 NativeActivity 或 GameActivity 构建本地应用有关。我在此不讨论 webview。
那 iOS 呢?据我所知,它应该与 Android 相似,甚至可能更简单。我还没有构建它,但下次我有一段较长的空闲时间时,我会尝试让它工作。计划是一样的:选择 winit、wgpu、iced 集成示例,将它们混合在一起,直到它工作。加载字体的技巧是必需的,也许还有其他一些东西,但目前没有明显的障碍。
再次感谢所有让这一切成为可能的人,祝你们在使用 Rust 构建移动应用时玩得愉快!
我开发了一个开源替代方案,用于替代Citizen App的付费911数据流,专为旧金山设计。<p>该系统从旧金山的官方开放数据门户实时获取调度数据,使用大型语言模型(LLM)将警察代码翻译成可读的摘要,并自动屏蔽敏感地点(如避难所、医院等)。<p>我是在一次黑客之夜上构建这个项目的,因为我对Citizen是唯一的实时选项并且需要付费感到不满。<p>代码库:<a href="https://github.com/midaz/sf-police-blotter" rel="nofollow">https://github.com/midaz/sf-police-blotter</a>
Discord:<a href="https://discord.gg/KCkKeKRm" rel="nofollow">https://discord.gg/KCkKeKRm</a><p>欢迎讨论技术方案或提供反馈。