>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Kotlin

一个 Kotlin 项目如何覆盖 Android、iOS、Web、Wear OS 和 AI 代理

当你想用真实代码展示 Kotlin Multiplatform 的能力时,很容易陷入复杂的架构和层层抽象。John O'Reilly 采取了不同的方式。他选择了一个简单的任务:显示在轨人员列表和国际空间站坐标。其结果是一个清晰的示例,展示了单一业务逻辑模块如何跨十几个不同平台工作。

这个项目已被收录进 Kotlin 官方文档和 Google Dev Library。让我们深入分析其结构以及为什么这个代码库是一个便捷的沙盒环境。

项目概述

该应用从两个开放数据源获取数据。宇航员及其传记列表来自 The Space Devs API,而国际空间站坐标则通过 Open Notify API 获取。为了防止客户端直接访问第三方服务,代码库包含一个小型 Ktor 后端。

这里的核心思想是代码去重。业务逻辑、网络请求、缓存和数据模型都写在共享模块 common 中一次。这段代码随后连接到面向各种不同操作系统和屏幕的客户端。

支持的平台包括:

  • Android 手机及使用 Glance API 的主屏幕小部件
  • 使用 SwiftUI 构建的 iOS 应用
  • 运行 Wear OS 的智能手表
  • 通过 Compose for Desktop 的桌面版本
  • 使用 Kotlin/Wasm 的 Web 客户端
  • 使用 Ktor 的服务端组件
  • 用于连接 AI 客户端的 MCP 服务器

共享模块的内部结构

该模块 common 处理所有样板代码。它使用 Kotlin 开发者熟悉的库:

  • Ktor Client 处理网络请求
  • SQLDelight 处理本地数据库存储
  • Koin 处理依赖注入
  • Kotlinx Serialization 解析 JSON

Compose Multiplatform 和 SKIE 库负责与 UI 的通信。后者通过将协程和 Flow 转换为 iOS 开发者理解的异步概念,显著简化了 Swift 的工作。

得益于此分离,平台客户端保持轻量。它们只处理 UI 渲染和用户触摸事件。

从智能手表到 Web 浏览器

代码库中的每个客户端都作为独立模块构建。这使得快速理解特定技术如何与共享 KMP 代码集成变得容易。

Android 应用使用 Jetpack Compose 构建。旁边是 wearApp 模块,其中界面使用 Compose for Wear OS 适配圆形表盘屏幕。你还可以找到一个使用 Glance API 编写的 Android 主屏幕小部件。

Wear OS person list Wear OS edge button Wear OS ISS map

对于 iOS,作者提供了两条路径:经典 SwiftUI 界面或共享 Compose 代码。选择权在开发者手中。

iOS UI

浏览器版本使用 Kotlin/Wasm 构建。构建通过标准 Gradle 任务运行,生成可用的前端而无需编写任何 JavaScript。

Compose for Web Wasm

通过 MCP 连接到 Claude Desktop

代码库的最新添加之一是 mcp-server 模块。作者使用官方 Kotlin MCP SDK 实现了一个使用 Model Context Protocol 的服务器。

其理念是相同的 common 模块(包含业务逻辑和网络层)被引入一个控制台应用程序。该应用程序向人工智能暴露工具。通过运行本地服务器,你可以将其连接到 Claude Desktop 或其他助手。

Claude Desktop 的配置如下:

之后,神经网络可以直接访问数据检索功能,并通过从你的 KMP 代码中获取最新信息来回答有关宇航员的问题。

MCP integration

为什么查看这个代码库

PeopleInSpace 代码库的价值不在于其代码规模,而在于其最新的技术栈。作者不断更新 Kotlin、Gradle、Compose 及相关库的版本。

如果你正在计划以下事情,这个项目是一个很好的参考:

  1. 评估 Android 和 iOS 之间实际可以重用的代码量。
  2. 在实践中查看 Kotlin/Wasm 在浏览器中的运行情况。
  3. 了解 SKIE 在向 Swift 传递数据流时如何工作。
  4. 学习如何使用 Kotlin 构建 MCP 服务器。

要开始使用,只需克隆代码库,在新版本的 Android Studio 中打开它,然后运行所需的 Gradle 任务即可。

相关项目