Spec-Zone.ru › Kotlin 1.9

Обмен кодом на платформах

С помощью Kotlin Multiplatform вы можете обмениваться кодом, используя механизмы, предоставляемые Kotlin:

  • Обмен кодом между всеми платформами, используемыми в вашем проекте. Используйте его для обмена общей бизнес-логикой, применимой ко всем платформам.

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

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

Обмен кодом на всех платформах

Если у вас есть бизнес-логика, общая для всех платформ, вам не нужно писать один и тот же код для каждой платформы — просто поделитесь им в общем наборе исходных кодов.

Code shared for all platforms

Некоторые зависимости для наборов исходных кодов установлены по умолчанию. Вам не нужно указывать какие-либо 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.

Library hierarchical structure

Набор исходных кодов concurrent объявляет функцию runBlocking и компилируется для JVM и целевых платформ. После обновления и публикации библиотеки kotlinx.coroutines с иерархической структурой проекта, вы можете зависеть от нее и вызывать runBlocking из набора исходных кодов, который общих для JVM и целевых платформ, поскольку он соответствует "подписи целевых платформ" набора исходных кодов concurrent библиотеки.

Подключение библиотек, специфичных для платформы

Библиотеки, специфичные для платформы, поставляемые с Kotlin/Native (например, Foundation, UIKit и POSIX), доступны в общих наборах исходных кодов по умолчанию. Это помогает обмениваться более нативным кодом, не ограничиваясь зависимостями, специфичными для платформы.

Кроме того, вы можете включить поддержку сторонних библиотек, используемых с помощью cinterop механизма. Для этого добавьте следующее свойство в gradle.properties.

kotlin.mpp.enableCInteropCommonization=true

Что дальше?

  • Изучите примеры обмена кодом с помощью механизма Kotlin ожидаемых и фактических объявлений

  • Узнайте больше об иерархической структуре проекта

  • Посмотрите наши рекомендации по именованию исходных файлов в многоплатформенных проектах

Последнее изменение: 31 марта 2023 г.
Публикация многоплатформенных библиотек Подключение к платформам-специфичным API

© 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

Spec-Zone.ru

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