← Назад к вопросам

Какие знаешь фреймворки KMP?

2.8 Senior🔥 92 комментариев
#Многомодульность

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отличный и очень актуальный вопрос, учитывая растущую популярность Kotlin Multiplatform (KMP). Как опытный Android-разработчик, я рассматриваю KMP не как один монолитный фреймворк, а как экосистему, состоящую из нескольких ключевых технологий и библиотек, которые решают разные задачи в рамках парадигмы мультиплатформенной разработки. Вот подробный обзор основных "фреймворков" и инструментов, с которыми приходится работать.

Основные компоненты экосистемы KMP

Само ядро KMP предоставляется JetBrains и включает компилятор Kotlin, возможность объявлять expect/actual модификаторы и базовую стандартную библиотеку (kotlin-stdlib). Однако для реальной разработки критически важны дополнительные библиотеки.

1. Kotlinx Libraries (Official JetBrains)

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

  • kotlinx.coroutines: Фундаментальная библиотека для асинхронного программирования. В KMP она предоставляет общий API для корутин, но с разными actual-реализациями под капотом (например, на JVM, Native или даже с использованием Dispatcher.Main на Android и DispatchQueue.main на iOS). Без неё практически не обойтись.

    // Общий код. Эта корутина будет работать и на Android, и на iOS.
    suspend fun fetchDataFromNetwork(): Data {
        return withContext(Dispatchers.IO) {
            // Симуляция сетевого запроса
            delay(1000)
            Data("Hello from KMP")
        }
    }
    
  • kotlinx.serialization: Стандартный способ сериализации/десериализации JSON, Protobuf, CBOR и других форматов в общем коде. Альтернатива GSON или Moshi, которые работают только на JVM.

    @Serializable
    data class Project(val name: String, val stars: Int)
    
    fun parseProject(json: String): Project {
        return Json.decodeFromString<Project>(json)
    }
    
  • kotlinx.datetime: Библиотека для работы с датами и временем, решающая проблему отсутствия универсального java.time на всех платформах.

  • kotlinx.atomicfu: Библиотека для работы с примитивами атомарных операций, что особенно важно в нативном (Native) таргете.

2. Фреймворки для UI (Наиболее динамичная область)

Здесь нет единого стандарта от JetBrains, и выбор зависит от стратегии.

  • JetBrains Compose Multiplatform: На данный момент это флагманский фреймворк для построения декларативного UI. Позволяет писать UI на Compose один раз и запускать его на Android, Desktop (JVM) и, что ключево, в вебе (Wasm) и на iOS (через механизм скрещивания с нативными вью). Для iOS он компилирует UI-часть в нативные (SwiftUI/UIKit) компоненты.

    // Общий UI-код для Android и iOS (через Compose Multiplatform)
    @Composable
    fun GreetingScreen(name: String) {
        Column(modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally) {
            Text(text = "Hello, $name!", style = MaterialTheme.typography.h4)
            Button(onClick = { /* Общее действие */ }) {
                Text("Click me")
            }
        }
    }
    
  • androidx.compose.ui:ui (в multplatform-варианте): Когда вы создаете KMP-проект с UI в Android Studio, именно зависимости Compose Multiplatform (которые являются мультиплатформенными версиями знакомого Android Compose) добавляются в общий модуль.

  • Подход с shared ViewModel + нативные UI: Это не отдельный фреймворк, а архитектурный паттерн. Здесь KMP используется только для бизнес-логики, состояния (ViewModels, UseCases, Repositories), а UI строится нативно на Swift/SwiftUI для iOS и Kotlin/Compose для Android. Для этого часто используют:

    *   **`kotlinx.coroutines.flow`** (StateFlow, SharedFlow) для передачи состояния и событий из общей `ViewModel` на нативные UI-слои.
    *   **`Koin`** или **`Kodein-DI`** (которые имеют KMP-поддержку) или новый **`Kotlin Inject`** для dependency injection в общем коде.

3. Фреймворки для сетевых операций и данных

  • Ktor Client: Это, вероятно, основной сетевой фреймворк в экосистеме KMP. Он является мультиплатформенным из коробки, предоставляет единый API для HTTP-запросов и поддерживает плагины (логирование, сериализация, аутентификация).

    val httpClient = HttpClient {
        install(ContentNegotiation) {
            json(Json { ignoreUnknownKeys = true })
        }
        install(Logging) {
            logger = Logger.DEFAULT
            level = LogLevel.HEADERS
        }
    }
    // Этот клиент можно использовать в commonMain
    
  • SQLDelight: Фреймворк от Square для типобезопасной работы с SQLite базами данных. Генерирует Kotlin-код из SQL-запросов и предоставляет runtime для разных платформ (Android, iOS, Desktop). Это мультиплатформенная альтернатива Room.

  • Realm и ObjectBox: Базы данных также начали предлагать KMP-поддержку, предоставляя общий API для работы с persistence-хранилищем.

4. Фреймворки для внедрения зависимостей (DI)

  • Koin: Один из первых DI-фреймворков с полноценной поддержкой KMP. Легковесный, использует функциональный подход (DSL) для объявления модулей. Работает на всех таргетах KMP.
  • Kodein-DI: Другой популярный фреймворк, также с давней поддержкой KMP.
  • kotlin-inject: Новый экспериментальный компиляторный фреймворк для DI, который генерирует код во время компиляции. Перспективное направление для KMP.

5. Фреймворки для тестирования

  • kotlin.test: Предоставляет общие аннотации и утверждения (assertEquals, assertTrue), которые работают на всех платформах. Интегрируется с платформенно-специфичными раннерами (JUnit на JVM/Android, XCTest на iOS).
  • MockK: Популярная библиотека для мокинга, которая также имеет поддержку KMP (хотя с некоторыми ограничениями для нативных таргетов).

Итог: Разработка на Kotlin Multiplatform — это работа с целой экосистемой взаимодополняющих фреймворков. Вы начинаете с ядра KMP и kotlinx.coroutines, затем выбираете сетевой фреймворк (чаще Ktor Client), сериализатор (kotlinx.serialization), способ работы с данными (SQLDelight) и, что самое важное, стратегию для UI — либо через Compose Multiplatform для максимального переиспользования, либо через общие ViewModel с нативными UI. Понимание роли каждого из этих компонентов позволяет создавать эффективные, поддерживаемые и по-настоящему кроссплатформенные приложения.

Какие знаешь фреймворки KMP? | PrepBro