Создайте приложение Kotlin Multiplatform
Здесь вы узнаете, как создать и запустить первое приложение Kotlin Multiplatform с помощью IntelliJ IDEA.
Технология Kotlin Multiplatform упрощает разработку кроссплатформенных проектов. Приложения Kotlin Multiplatform могут работать на различных платформах, таких как iOS, Android, macOS, Windows, Linux, веб-платформы и другие.
Один из основных вариантов использования Kotlin Multiplatform — совместное использование кода мобильными платформами. Вы можете использовать одну и ту же логику приложения в приложениях для iOS и Android и писать платформенный код только тогда, когда нужно реализовать нативный интерфейс или работать с API платформы.
Создайте проект
В кратком руководстве выполните инструкции по настройке среды для разработки на Kotlin Multiplatform.
В IntelliJ IDEA выберите Файл | Создать | Проект.
На панели слева выберите Kotlin Multiplatform.
-
В окне Новый проект укажите следующие значения:
Имя: GreetingKMP
Идентификатор проекта: com.jetbrains.greetingkmp
Выберите целевые платформы Android и iOS.
Для iOS выберите вариант Не использовать общий интерфейс, чтобы оставить интерфейс нативным.
Указав все значения и целевые платформы, нажмите Создать.

Изучите структуру проекта
В 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.
Набор исходного кода — это концепция Gradle, обозначающая логически сгруппированный набор файлов с собственными зависимостями. В Kotlin Multiplatform разные наборы исходного кода общего модуля могут предназначаться для разных платформ.
Модуль sharedLogic содержит наборы исходного кода androidMain, commonMain и iosMain. Набор исходного кода commonMain содержит общий код Kotlin, а наборы исходного кода для конкретных платформ — код, предназначенный только для соответствующей платформы. Для androidMain используется Kotlin/JVM, а для iosMain — Kotlin/Native:
При сборке общего модуля в библиотеку Android общий код Kotlin обрабатывается как Kotlin/JVM. При сборке в фреймворк iOS общий код Kotlin обрабатывается как Kotlin/Native:
Напишите общие объявления
Общий набор исходного кода содержит код, который можно использовать на нескольких целевых платформах. Он предназначен для платформонезависимого кода. Если попытаться использовать в общем наборе исходного кода API, специфичные для платформы, IDE покажет предупреждение:
Откройте файл
sharedLogic/src/commonMain/.../Greeting.kt, в котором находится сгенерированный классGreetingс функциейgreet().Добавим немного разнообразия в приветствие. Перейдите к определению функции
sayHello()в файлеGreetingUtil.kt.-
Измените общий код, добавив рандомизацию и вызов
reversed()из стандартной библиотеки Kotlin, чтобы перевернуть полученную строку:fun sayHello(to: String): String { val firstWord = if (Random.nextBoolean()) "Hi!" else "Hello!" return "$firstWord Guess what this is! > ${to.reversed()}!" } Импортируйте класс
kotlin.random.Random, следуя предложению IDE.
У написания кода только на общем Kotlin есть очевидные ограничения: он не может использовать функциональность, специфичную для платформы. Эту проблему решает использование общих интерфейсов с платформенными реализациями через механизм expect/actual.
Изучите платформенные реализации
В общем наборе исходного кода можно объявить ожидаемые объявления — интерфейсы, классы и так далее. В каждом наборе исходного кода для конкретной платформы, в данном случае androidMain и iosMain, необходимо предоставить фактические платформенные реализации ожидаемых объявлений.
При генерации кода для конкретной платформы компилятор Kotlin объединяет ожидаемые и фактические объявления и создает одно объявление с фактическими реализациями.
-
При создании проекта Kotlin Multiplatform в IntelliJ IDEA в модуле
sharedLogic/src/commonMainпоявляется файлPlatform.kt:interface Platform { val name: String }Это общий интерфейс
Platform, предназначенный для включения информации о платформе. -
Классы для конкретных платформ, реализующие этот интерфейс, находятся в наборах исходного кода
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.
-
Каждый набор исходного кода включает функцию
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, например свойств и классов. Реализуем ожидаемое свойство:
-
Откройте
Platform.ktв модулеcommonMainи добавьте в конец файла следующий код:expect val num: Int
Компилятор Kotlin сообщит, что для этого свойства нет соответствующих фактических объявлений в модулях платформ.
-
Попробуйте сразу добавить реализацию:
expect val num: Int = 42
Вы получите ошибку «Ожидаемое свойство не может иметь инициализатор», поскольку объявления
expectне должны иметь тела. Реализации необходимо предоставить в фактических модулях платформ. Удалите инициализатор.
-
Добавьте реализацию для Android в
androidMain/.../Platform.android.ktследующим образом:actual val num: Int = 1
-
Теперь добавьте фактическую реализацию для
numв модулеiosMain. Добавьте следующий код в файлiosMain/.../Platform.ios.kt:actual val num: Int = 2
-
В файле
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
В списке конфигураций запуска выберите androidApp.
-
Выберите виртуальное устройство Android рядом со списком конфигураций и нажмите Запустить.
Если в списке нет устройства, создайте новое виртуальное устройство Android.

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

Запустите приложение на реальном устройстве iOS
Вы можете запустить мультиплатформенное приложение на реальном устройстве iOS. Перед началом необходимо указать идентификатор команды Team ID, связанный с вашим Apple ID.
Укажите Team ID
Чтобы впервые указать Team ID для проекта, откройте проект в Xcode (Файл | Открыть проект в Xcode):
В навигаторе проекта слева выберите iosApp.
В разделе Целевые объекты выберите iosApp и перейдите на вкладку Подпись и возможности.
-
Выберите свою команду в списке Команда.
Если вы ещё не настроили команду, воспользуйтесь пунктом Добавить учётную запись в списке Команда и следуйте инструкциям Xcode.
Убедитесь, что идентификатор пакета уникален, а сертификат подписи успешно назначен.
Настроив команду в Xcode, можно указать или изменить её в IntelliJ IDEA:
-
Измените конфигурацию запуска для iosApp:
Перейдите на вкладку Параметры, внесите необходимые изменения в раскрывающийся список Команда разработчика и нажмите ОК.
Запустите приложение
Подключите iPhone с помощью кабеля. Если устройство уже зарегистрировано в Xcode, IntelliJ IDEA должна отобразить его в списке конфигураций запуска. Запустите соответствующую конфигурацию iosApp.
Если вы ещё не зарегистрировали iPhone в Xcode, следуйте рекомендациям Apple. Вкратце, нужно сделать следующее:
Подключите iPhone с помощью кабеля.
Включите на iPhone режим разработчика в разделе Настройки | Конфиденциальность и безопасность.
В Xcode откройте главное меню и выберите Окно | Устройства и симуляторы.
Если iPhone не отображается как подключённое устройство, нажмите знак плюса в левом нижнем углу и выберите его.
Следуйте инструкциям на экране, чтобы завершить создание пары.
После регистрации iPhone в Xcode он появится в списке доступных устройств в IntelliJ IDEA при выборе конфигурации запуска iosApp.
Следующий шаг
В следующей части руководства вы узнаете, как обновлять элементы интерфейса с помощью платформенных библиотек.
См. также
Узнайте, как создавать и запускать мультиплатформенные тесты, чтобы проверить правильность работы кода.
Подробнее о структуре проекта.
Если вы хотите преобразовать существующий проект Android в кроссплатформенное приложение, выполните это руководство, чтобы сделать приложение Android кроссплатформенным.
Получить помощь
Kotlin Slack. Получите приглашение и присоединитесь к каналу #multiplatform.
Трекер задач Kotlin. Сообщите о новой проблеме.
© 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