Spec-Zone.ru › Kotlin 2

Создайте приложение Kotlin Multiplatform

Здесь вы узнаете, как создать и запустить первое приложение Kotlin Multiplatform с помощью IntelliJ IDEA.

Технология Kotlin Multiplatform упрощает разработку кроссплатформенных проектов. Приложения Kotlin Multiplatform могут работать на различных платформах, таких как iOS, Android, macOS, Windows, Linux, веб-платформы и другие.

Один из основных вариантов использования Kotlin Multiplatform — совместное использование кода мобильными платформами. Вы можете использовать одну и ту же логику приложения в приложениях для iOS и Android и писать платформенный код только тогда, когда нужно реализовать нативный интерфейс или работать с API платформы.

Создайте проект

  1. В кратком руководстве выполните инструкции по настройке среды для разработки на Kotlin Multiplatform.

  2. В IntelliJ IDEA выберите Файл | Создать | Проект.

  3. На панели слева выберите Kotlin Multiplatform.

  4. В окне Новый проект укажите следующие значения:

    • Имя: GreetingKMP

    • Идентификатор проекта: com.jetbrains.greetingkmp

  5. Выберите целевые платформы Android и iOS.

  6. Для iOS выберите вариант Не использовать общий интерфейс, чтобы оставить интерфейс нативным.

  7. Указав все значения и целевые платформы, нажмите Создать.

Create Kotlin Multiplatform project

Среда разработки может автоматически предложить обновить плагин Android Gradle до последней версии. Мы не рекомендуем это делать, поскольку Kotlin Multiplatform несовместим с последней версией AGP (см. таблицу совместимости).

Изучите структуру проекта

В IntelliJ IDEA разверните папку GreetingKMP.

Этот проект Kotlin Multiplatform включает следующие модули:

  • androidApp — модуль Kotlin, который собирается в приложение Android. Для сборки используется Gradle. Модуль androidApp зависит от общего модуля и использует его как обычную библиотеку Android.

  • iosApp — проект Xcode, который собирается в приложение iOS. Он зависит от модуля sharedLogic, экспортируемого в виде фреймворка iOS. В проектах Kotlin Multiplatform, созданных с помощью мастера IDE, обычная зависимость от фреймворка добавляется с помощью прямой интеграции.

  • sharedLogic — мультиплатформенный модуль, содержащий общую логику для приложений Android и iOS.

  • sharedUI — модуль с кодом интерфейса Compose Multiplatform: в этом проекте он используется только приложением Android, но является мультиплатформенным модулем и при необходимости может использоваться другими целевыми платформами.

Во всех модулях, кроме iosApp, для сборки используется Gradle.

Basic Multiplatform project structure

Набор исходного кода — это концепция Gradle, обозначающая логически сгруппированный набор файлов с собственными зависимостями. В Kotlin Multiplatform разные наборы исходного кода общего модуля могут предназначаться для разных платформ.

Модуль sharedLogic содержит наборы исходного кода androidMain, commonMain и iosMain. Набор исходного кода commonMain содержит общий код Kotlin, а наборы исходного кода для конкретных платформ — код, предназначенный только для соответствующей платформы. Для androidMain используется Kotlin/JVM, а для iosMain — Kotlin/Native:

Source sets and modules structure

При сборке общего модуля в библиотеку Android общий код Kotlin обрабатывается как Kotlin/JVM. При сборке в фреймворк iOS общий код Kotlin обрабатывается как Kotlin/Native:

Common Kotlin, Kotlin/JVM, and Kotlin/Native

Напишите общие объявления

Общий набор исходного кода содержит код, который можно использовать на нескольких целевых платформах. Он предназначен для платформонезависимого кода. Если попытаться использовать в общем наборе исходного кода API, специфичные для платформы, IDE покажет предупреждение:

  1. Откройте файл sharedLogic/src/commonMain/.../Greeting.kt, в котором находится сгенерированный класс Greeting с функцией greet().

  2. Добавим немного разнообразия в приветствие. Перейдите к определению функции sayHello() в файле GreetingUtil.kt.

  3. Измените общий код, добавив рандомизацию и вызов reversed() из стандартной библиотеки Kotlin, чтобы перевернуть полученную строку:

    fun sayHello(to: String): String {
        val firstWord = if (Random.nextBoolean()) "Hi!" else "Hello!"
    
        return "$firstWord Guess what this is! > ${to.reversed()}!"
    }
    
  4. Импортируйте класс kotlin.random.Random, следуя предложению IDE.

У написания кода только на общем Kotlin есть очевидные ограничения: он не может использовать функциональность, специфичную для платформы. Эту проблему решает использование общих интерфейсов с платформенными реализациями через механизм expect/actual.

Изучите платформенные реализации

В общем наборе исходного кода можно объявить ожидаемые объявления — интерфейсы, классы и так далее. В каждом наборе исходного кода для конкретной платформы, в данном случае androidMain и iosMain, необходимо предоставить фактические платформенные реализации ожидаемых объявлений.

При генерации кода для конкретной платформы компилятор Kotlin объединяет ожидаемые и фактические объявления и создает одно объявление с фактическими реализациями.

  1. При создании проекта Kotlin Multiplatform в IntelliJ IDEA в модуле sharedLogic/src/commonMain появляется файл Platform.kt:

    interface Platform {
        val name: String
    }
    

    Это общий интерфейс Platform, предназначенный для включения информации о платформе.

  2. Классы для конкретных платформ, реализующие этот интерфейс, находятся в наборах исходного кода androidMain и iosMain:

    // Platform.android.kt in the androidMain source set
    import android.os.Build
    
    class AndroidPlatform : Platform {
        override val name: String = "Android ${Build.VERSION.SDK_INT}"
    }
    
    // Platform.ios.kt in the iosMain source set
    import platform.UIKit.UIDevice
    
    class IOSPlatform: Platform {
        override val name: String =
            UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
    }
    
    • Свойство name класса AndroidPlatform использует код для Android, а именно класс android.os.Build. Этот код интерпретируется как Kotlin/JVM. Если здесь обратиться к классу, специфичному для JVM, например java.util.Random, код скомпилируется.

    • Свойство name класса IOSPlatform использует код для iOS, а именно класс platform.UIKit.UIDevice. Этот код интерпретируется как Kotlin/Native, поэтому из Kotlin можно обращаться к объявлениям iOS. Код становится частью фреймворка iOS, который импортируется в коде Swift модуля iosApp.

  3. Каждый набор исходного кода включает функцию getPlatform(). Ее объявление expect не содержит тела, а реализации actual предоставлены в платформенном коде:

    // Platform.kt in the commonMain source set
    expect fun getPlatform(): Platform
    
    // Platform.android.kt in the androidMain source set
    actual fun getPlatform(): Platform = AndroidPlatform()
    
    // Platform.ios.kt in the iosMain source set
    actual fun getPlatform(): Platform = IOSPlatform()
    

Здесь в общем наборе исходного кода объявлена ожидаемая функция getPlatform(), для которой в наборах исходного кода платформ определены фактические реализации: AndroidPlatform() для приложения Android и IOSPlatform() для приложения iOS.

При генерации кода для конкретной платформы компилятор Kotlin объединяет объявления expect и actual в одну функцию getPlatform() с нужной реализацией.

Поэтому объявления expect и actual должны находиться в одном пакете — в результирующем коде платформы они объединяются в одно объявление. Любой вызов ожидаемой функции getPlatform() в сгенерированном платформенном коде будет обращаться к соответствующей фактической реализации.

Теперь можно запустить приложения и увидеть всё это в действии.

Создайте переменную expect/actual (необязательно)

В шаблоне проекта механизм expect/actual используется для функций, но он подходит и для большинства других объявлений Kotlin, например свойств и классов. Реализуем ожидаемое свойство:

  1. Откройте Platform.kt в модуле commonMain и добавьте в конец файла следующий код:

    expect val num: Int
    

    Компилятор Kotlin сообщит, что для этого свойства нет соответствующих фактических объявлений в модулях платформ.

  2. Попробуйте сразу добавить реализацию:

    expect val num: Int = 42
    

    Вы получите ошибку «Ожидаемое свойство не может иметь инициализатор», поскольку объявления expect не должны иметь тела. Реализации необходимо предоставить в фактических модулях платформ.

  3. Удалите инициализатор.

  4. Добавьте реализацию для Android в androidMain/.../Platform.android.kt следующим образом:

    actual val num: Int = 1
    
  5. Теперь добавьте фактическую реализацию для num в модуле iosMain. Добавьте следующий код в файл iosMain/.../Platform.ios.kt:

    actual val num: Int = 2
    
  6. В файле commonMain/.../GreetingUtil.kt используйте свойство num в строке, формируемой функцией sayHello():

    fun sayHello(to: String): String {
        val firstWord = if (Random.nextBoolean()) "Hi!" else "Hello!"
    
        return "$firstWord [$num] Guess what this is! > ${to.reversed()}!"
    }
    

Запустите приложение

Вы можете запустить мультиплатформенное приложение для Android и iOS из IntelliJ IDEA.

Если ранее вы создали необязательное свойство expect/actual, в приветствии для Android появится «[1]», а для iOS — «[2]».

Запустите приложение на Android

  1. В списке конфигураций запуска выберите androidApp.

  2. Выберите виртуальное устройство Android рядом со списком конфигураций и нажмите Запустить.

    Если в списке нет устройства, создайте новое виртуальное устройство Android.

    Run multiplatform app on Android
    First mobile multiplatform app on Android

Запустите приложение на другом виртуальном устройстве Android

Узнайте, как настроить эмулятор Android и запустить приложение на другом виртуальном устройстве.

Запустите приложение на реальном устройстве Android

Узнайте, как настроить и подключить физическое устройство и запустить на нём приложение.

Запустите приложение на iOS

Если вы не запускали Xcode во время первоначальной настройки, запустите его перед запуском приложения для iOS.

В IntelliJ IDEA выберите iosApp в списке конфигураций запуска, выберите симулируемое устройство рядом с конфигурацией запуска и нажмите Запустить.

Если в списке нет доступной конфигурации iOS, запустите Xcode, чтобы заполнить список доступных симуляторов, а затем перезапустите IntelliJ IDEA.

Run multiplatform app on iOS

First mobile multiplatform app on iOS

Запустите приложение на реальном устройстве iOS

Вы можете запустить мультиплатформенное приложение на реальном устройстве iOS. Перед началом необходимо указать идентификатор команды Team ID, связанный с вашим Apple ID.

Укажите Team ID

Чтобы впервые указать Team ID для проекта, откройте проект в Xcode (Файл | Открыть проект в Xcode):

  1. В навигаторе проекта слева выберите iosApp.

  2. В разделе Целевые объекты выберите iosApp и перейдите на вкладку Подпись и возможности.

  3. Выберите свою команду в списке Команда.

    Если вы ещё не настроили команду, воспользуйтесь пунктом Добавить учётную запись в списке Команда и следуйте инструкциям Xcode.

  4. Убедитесь, что идентификатор пакета уникален, а сертификат подписи успешно назначен.

Настроив команду в Xcode, можно указать или изменить её в IntelliJ IDEA:

  1. Измените конфигурацию запуска для iosApp:

    Edit iOS run configuration
  2. Перейдите на вкладку Параметры, внесите необходимые изменения в раскрывающийся список Команда разработчика и нажмите ОК.

Запустите приложение

Подключите iPhone с помощью кабеля. Если устройство уже зарегистрировано в Xcode, IntelliJ IDEA должна отобразить его в списке конфигураций запуска. Запустите соответствующую конфигурацию iosApp.

Если вы ещё не зарегистрировали iPhone в Xcode, следуйте рекомендациям Apple. Вкратце, нужно сделать следующее:

  1. Подключите iPhone с помощью кабеля.

  2. Включите на iPhone режим разработчика в разделе Настройки | Конфиденциальность и безопасность.

  3. В Xcode откройте главное меню и выберите Окно | Устройства и симуляторы.

  4. Если iPhone не отображается как подключённое устройство, нажмите знак плюса в левом нижнем углу и выберите его.

  5. Следуйте инструкциям на экране, чтобы завершить создание пары.

После регистрации iPhone в Xcode он появится в списке доступных устройств в IntelliJ IDEA при выборе конфигурации запуска iosApp.

Следующий шаг

В следующей части руководства вы узнаете, как обновлять элементы интерфейса с помощью платформенных библиотек.

Перейти к следующей части

См. также

  • Узнайте, как создавать и запускать мультиплатформенные тесты, чтобы проверить правильность работы кода.

  • Подробнее о структуре проекта.

  • Если вы хотите преобразовать существующий проект Android в кроссплатформенное приложение, выполните это руководство, чтобы сделать приложение Android кроссплатформенным.

Получить помощь

  • Kotlin Slack. Получите приглашение и присоединитесь к каналу #multiplatform.

  • Трекер задач Kotlin. Сообщите о новой проблеме.

21 мая 2026 г.
Создайте собственное приложениеОбновите пользовательский интерфейс

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/multiplatform-create-first-app.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API