Обмен кодом на платформах
С помощью Kotlin Multiplatform вы можете обмениваться кодом, используя механизмы, предоставляемые Kotlin:
Обмен кодом между всеми платформами, используемыми в вашем проекте. Используйте его для обмена общей бизнес-логикой, применимой ко всем платформам.
Обмен кодом между некоторыми платформами в вашем проекте, но не всеми. Вы можете повторно использовать код на схожих платформах с помощью иерархической структуры.
Если вам нужно получить доступ к платформам-специфичным API из общего кода, используйте механизм Kotlin ожидаемых и фактических объявлений.
Обмен кодом на всех платформах
Если у вас есть бизнес-логика, общая для всех платформ, вам не нужно писать один и тот же код для каждой платформы — просто поделитесь им в общем наборе исходных кодов.

Некоторые зависимости для наборов исходных кодов установлены по умолчанию. Вам не нужно указывать какие-либо dependsOn отношения вручную:
Для всех наборов исходных кодов, специфичных для платформы, которые зависят от общего набора исходных кодов, таких как
jvmMain,macosX64Main, и другие.Между наборами исходных кодов
mainиtestконкретной цели, например,androidMainиandroidTest.
Если вам нужно получить доступ к платформам-специфичным 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 библиотеки.
Подключение библиотек, специфичных для платформы
Библиотеки, специфичные для платформы, поставляемые с Kotlin/Native (например, Foundation, UIKit и POSIX), доступны в общих наборах исходных кодов по умолчанию. Это помогает обмениваться более нативным кодом, не ограничиваясь зависимостями, специфичными для платформы.
Кроме того, вы можете включить поддержку сторонних библиотек, используемых с помощью cinterop механизма. Для этого добавьте следующее свойство в gradle.properties.
kotlin.mpp.enableCInteropCommonization=true
Что дальше?
Изучите примеры обмена кодом с помощью механизма Kotlin ожидаемых и фактических объявлений
Узнайте больше об иерархической структуре проекта
Посмотрите наши рекомендации по именованию исходных файлов в многоплатформенных проектах
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform-share-on-platforms.html