Совместное использование кода на платформах
Kotlin Multiplatform позволяет совместно использовать код с помощью механизмов, предоставляемых Kotlin:
Совместное использование кода на всех платформах проекта. Используйте этот подход, чтобы совместно использовать общую бизнес-логику, применимую ко всем платформам.
Совместное использование кода на некоторых платформах, включённых в проект, но не на всех. Вы можете повторно использовать код на схожих платформах с помощью иерархической структуры.
Если из общего кода необходимо обращаться к платформенным API, используйте механизм Kotlin для ожидаемых и фактических объявлений.
Совместное использование кода на всех платформах
Если у вас есть бизнес-логика, общая для всех платформ, не нужно писать один и тот же код для каждой платформы — просто используйте его совместно в общем наборе исходного кода.
Некоторые зависимости для наборов исходного кода задаются по умолчанию. Вам не нужно вручную указывать связи dependsOn:
Для всех платформенных наборов исходного кода, которые зависят от общего набора, например
jvmMain,macosArm64Mainи других.Между наборами исходного кода
mainиtestконкретной цели, напримерandroidMainиandroidUnitTest.
Если из общего кода необходимо обращаться к платформенным API, используйте механизм Kotlin для ожидаемых и фактических объявлений.
Совместное использование кода на схожих платформах
Часто необходимо создать несколько нативных целей, которые потенциально могут повторно использовать значительную часть общей логики и сторонних API.
Например, в типичном мультиплатформенном проекте с целевыми платформами iOS есть две цели, связанные с iOS: одна предназначена для устройств iOS с ARM64, другая — для симулятора x64. У них отдельные платформенные наборы исходного кода, но на практике код для устройства и симулятора редко должен различаться, а их зависимости во многом совпадают. Поэтому код для iOS можно использовать совместно в обеих целях.
Очевидно, в такой конфигурации было бы желательно иметь общий набор исходного кода для двух целей iOS, содержащий код Kotlin/Native, который при этом мог бы напрямую вызывать любые API, общие для устройства iOS и симулятора.
В этом случае можно совместно использовать код для нативных целей проекта с помощью иерархической структуры одним из следующих способов:
Подробнее о том, как совместно использовать код в библиотеках и подключать платформенные библиотеки.
Совместное использование кода в библиотеках
Благодаря иерархической структуре проекта библиотеки также могут предоставлять общие API для подмножества целей. При публикации библиотеки API её промежуточных наборов исходного кода включаются в артефакты библиотеки вместе с информацией о структуре проекта. При использовании этой библиотеки промежуточные наборы исходного кода вашего проекта получают доступ только к тем API библиотеки, которые доступны для целей каждого набора исходного кода.
Например, посмотрите на следующую иерархию наборов исходного кода из репозитория kotlinx.coroutines:
Набор исходного кода concurrent объявляет функцию runBlocking и компилируется для JVM и нативных целей. После обновления и публикации библиотеки kotlinx.coroutines с иерархической структурой проекта вы можете добавить зависимость от неё и вызывать runBlocking из набора исходного кода, общего для JVM и нативных целей, поскольку он соответствует «сигнатуре целей» набора исходного кода concurrent библиотеки.
Подключение платформенных библиотек
Чтобы совместно использовать больше нативного кода без ограничений, связанных с платформенными зависимостями, используйте платформенные библиотеки, такие как Foundation, UIKit и POSIX. Они поставляются вместе с Kotlin/Native и по умолчанию доступны в общих наборах исходного кода.
Кроме того, если в проектах используется плагин Kotlin CocoaPods Gradle, вы можете работать со сторонними нативными библиотеками, подключёнными с помощью механизма cinterop.
Что дальше?
© 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-share-on-platforms.html