Как один Kotlin-проект охватывает Android, iOS, Web, Wear OS и AI-агентов

26 июл 2026
3,421
311
35
2 недели

Когда нужно показать возможности Kotlin Multiplatform в реальном коде, легко увязнуть в сложной архитектуре и десятках слоев абстракций. Джон О'Райли пошел другим путем. Он взялся за понятную задачу: отображение списка людей на орбите и координат МКС. В итоге получился наглядный пример того, как один модуль с бизнес-логикой работает на десятке разных платформ.

Проект попал в официальную документацию Kotlin и Google Dev Library. Разберем, как тут все устроено, и почему эту кодовую базу удобно использовать в качестве песочницы.

В чем суть проекта

Приложение запрашивает данные из двух открытых источников. Список астронавтов с биографиями берется из The Space Devs API, а координаты МКС подтягиваются через Open Notify API. Чтобы клиенты не дергали сторонние сервисы напрямую, в репозитории лежит небольшой бэкенд на Ktor.

Главная идея здесь в дедупликации кода. Бизнес-логика, сетевые запросы, кэширование и модели данных пишутся один раз в общем модуле common. Дальше этот код подключается к клиентам под самые разные операционные системы и экраны.

В список поддерживаемых таргетов входят:

Реклама
  • Смартфоны на Android и виджеты для рабочего стола на Glance API
  • iOS-приложение на SwiftUI
  • Умные часы на Wear OS
  • Десктопная версия через Compose for Desktop
  • Веб-клиент на Kotlin/Wasm
  • Серверная часть на Ktor
  • Сервер MCP для подключения к ИИ-клиентам

Что под капотом у общего модуля

Модуль common забирает на себя всю рутину. Внутри используются привычные для Kotlin-разработчиков библиотеки:

  • Ktor Client отвечает за сетевые запросы
  • SQLDelight берет на себя локальное хранение данных в БД
  • Koin занимается внедрением зависимостей
  • Kotlinx Serialization разбирает JSON

Для связи с пользовательским интерфейсом используются Compose Multiplatform и библиотека SKIE. Последняя существенно упрощает работу со Swift, транслируя корутины и Flow в понятные для iOS-разработчика асинхронные концепции.

class PeopleInSpaceViewModel(
    private val peopleInSpaceRepository: PeopleInSpaceRepositoryInterface
) : KMMViewModel() {

    val peopleInSpace: StateFlow<List<Assignment>> = 
        peopleInSpaceRepository.fetchPeopleAsFlow()
            .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())
}

Благодаря такому разделению платформенные клиенты получаются тонкими. Они занимаются только отрисовкой UI и обработкой пользовательских касаний.

От умных часов до веб-браузера

Каждый клиент в репозитории оформлен в виде отдельного модуля. Это помогает быстро понять, как конкретная технология интегрируется с общим KMP-кодом.

Android-приложение построено на Jetpack Compose. Рядом с ним лежит модуль wearApp, где интерфейс адаптирован под круглые экраны часов с помощью Compose for Wear OS. Там же вы найдете рабочий виджет для домашнего экрана Android, написанный с использованием Glance API.

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

Подключение к Claude Desktop через MCP

Одно из самых свежих пополнений в репозитории — модуль mcp-server. Автор реализовал сервер по протоколу Model Context Protocol, используя официальный Kotlin MCP SDK.

Смысл в том, что тот же самый модуль common с бизнес-логикой и сетевым слоем подтягивается в консольное приложение. Это приложение отдает инструменты для искусственного интеллекта. Запустив локальный сервер, можно подключить его к Claude Desktop или другому ассистенту.

Конфигурация для Claude Desktop выглядит так:

{
  "mcpServers": {
    "kotlin-peopleinspace": {
      "command": "java",
      "args": [
        "-jar",
        "/path/to/repo/mcp-server/build/libs/serverAll.jar",
        "--stdio"
      ]
    }
  }
}

После этого нейросеть получает прямой доступ к функции получения данных и отвечает на вопросы о космонавтах, обращаясь к вашему KMP-коду за свежей информацией.

MCP integration

Зачем смотреть этот репозиторий

Репозиторий PeopleInSpace ценен не масштабностью кода, а актуальностью стек-трека. Автор постоянно обновляет версии Kotlin, Gradle, Compose и сопутствующих библиотек.

Проект станет хорошим справочником, если вы планируете:

  1. Оценить объём кода, который реально переиспользовать между Android и iOS.
  2. Посмотреть на практике запуск Kotlin/Wasm в браузере.
  3. Разобраться с работой SKIE при передаче потоков данных в Swift.
  4. Изучить устройство MCP-серверов на Kotlin.

Для первого знакомства достаточно склонировать репозиторий, открыть его в свежей версии Android Studio и запустить нужную Gradle-задачу.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.