Skip to main content

Основы Kotlin Multiplatform Mobile

Для начала, чтобы разобраться, что из себя представляет технология Kotlin Multiplatform Mobile, советуем изучить официальный сайт. Также, для лучшего понимания, как Kotlin Multiplatform помогает сократить время разработки, советуем прочитать две статьи: от JetBrains и от IceRock

Далее, можете переходить к изучению технологии в документации

  1. Знакомство с KMM начните с официальных видео для начинающих
  2. Создайте свое первое мультиплатформенное приложение по инструкции
    • используйте утилиту kdoctor, чтобы проверить, что локальное окружение настроено для работы с KMM
    • для iOS автоматически будет создано приложение на SwiftUI, памятка по переходу на UIKit
  3. Разберитесь со структурой KMM приложения по ссылке
  4. Кодлаба про изменение готового Android-приложения для работы с iOS
  5. Инструкция по добавлению зависимостей к KMM модулю

Мультиплатформенные библиотеки

Мультиплатформенная библиотека - это библиотека, адаптированная для использования на разных платформах. Функционал такой библиотеки можно использовать в общем коде, он будет работать для всех таргетов, которые поддерживает библиотека. Таргеты мультиплатформенной библиотеки - целевая платформа, на которой будет выполняться скомпилированная библиотека. Со списком всех таргетов, поддерживаемых Kotlin Multiplatform можете ознакомиться по ссылке
В работе нас будут интересовать библиотеки поддерживающие следующие таргеты:

  • jvm - для работы приложений на Java Virtual Machine (jvm библиотеки поддерживаются на android)
  • androidJvm - для работы приложения на Android устройствах
  • ios_arm64 - для работы приложения на симуляторах iOS устройств
  • ios_x64 - для работы приложения на реальных iOS устройствах
  • ios_simulator_arm64 - для симуляторов iOS на M1

Чтобы понять, какие таргеты поддерживает библиотека, следует проанализировать её репозиторий на наличие следующих признаков

  1. Наличие информации в README о поддержке различных платформ, например, описание moko-mvvm
  2. Наличие shared-модуля, включенный плагин мультиплатформы и установка таргетов
plugins {
kotlin("multiplatform") version "*.*.*"
// ..
}

kotlin {
android()
ios()
}

Также, определить таргеты мулитиплатформенной библиотеки можно изучив ее артефакты на Maven Central

Например, рассмотрим библиотеку moko-fields

maven-library

Выводы, которые можно сделать увидев артефакты библиотеки:

  • fields - это common-модуль
  • библиотека поддерживает Android устройства
  • библиотека поддерживает симуляторы и устройства iOS, но не на M1

При выборе библиотеки обязательно обращайте внимание на наличие таргетов jvm, androidJvm ios_arm64 ios_x64, ios_simulator_arm64. Не забывайте проверить дату последнего релиза, чтобы удостовериться, поддерживает ли разработчик свою библиотеку.
Для поиска мультиплатформенной библиотеки, подходящей для решения вашей задачи, советуем сначала поискать на следующих ресурсах:

В заключение, можете посмотреть видео про создание мультиплатформенных библиотек на примере mutliplatform-settings

Настройка gradle

Официальная документация по настройке gradle для работы с KMM. Из видео вы узнаете, как создать и настроить gradle-проект до состояния, с которого стартует разработка нового проекта в IceRock
Документация про иерархическую структуру мультиплатофрменных проектов

Совместимость со Swift/Objective-C

Прочитайте статью про совместимость Kotlin со Swift и Objective-C

Рекомендуем ознакомиться со следующими разделами

Работа с памятью

Прочитайте статью из базы знаний, посвященную работе с памятью в Android, Kotlin/Native и iOS.

Вопросы для самопроверки

  • Объясните в двух словах, что такое KMM, какие проблемы решает?
  • Что такое Shared-модуль?
  • Что такое таргеты и сурсеты? какие они бывают? чем отличаются?
  • Можно ли подключить библиотеку только для одного сурсета? Будет ли она доступна для других сурсетов?
  • Расскажите, что такое мультиплатформенная библиотека, чем она отличается от других?
  • Можно ли в KMM использовать не мультиплатформенную библиотеку? Если да, то как?
  • Как определить, что библиотека мультиплатформенная?
  • Что будет, если не пометить suspend функцию из общего кода аннотацией @Throws?