Понимание структуры мобильного проекта
Цель технологии Kotlin Multiplatform Mobile – унификация разработки приложений с общей логикой для платформ Android и iOS. Для этого используется структура мобильных проектов Kotlin Multiplatform.
Эта страница описывает структуру и компоненты базового кроссплатформенного мобильного проекта: модуль общего кода, приложение для Android и приложение для iOS.
Чтобы увидеть полную структуру вашего мобильного проекта на нескольких платформах, переключите представление с Android на Проект.

Корневой проект
Корневой проект представляет собой проект Gradle, который содержит модуль общего кода и приложение для Android в качестве своих подпроектов. Они связаны с помощью механизма многопроектных сборок Gradle.

// settings.gradle.kts
include(":shared")
include(":androidApp")
// settings.gradle include ':shared' include ':androidApp'
Приложение для iOS создаётся из проекта Xcode. Оно хранится в отдельной папке в корневом проекте. Xcode использует свою собственную систему сборки; поэтому проект приложения для iOS не связан с другими частями проекта Multiplatform Mobile через Gradle. Вместо этого он использует модуль общего кода как внешний артефакт – фреймворк. Подробную информацию об интеграции между модулем общего кода и приложением для iOS см. в разделе Приложение для iOS.
Вот базовая структура кроссплатформенного мобильного проекта:

Корневой проект не содержит исходный код. Вы можете использовать его для хранения глобальной конфигурации в его build.gradle(.kts) или gradle.properties, например, для добавления репозиториев или определения глобальных конфигурационных переменных.
В более сложных проектах вы можете добавить дополнительные модули в корневой проект, создав их в IDE и связав их через include декларации в настройках Gradle.
Модуль общего кода
Модуль общего кода содержит основную логику приложения, используемую как в Android, так и в iOS: классы, функции и так далее. Это модуль Kotlin Multiplatform, который компилируется в библиотеку Android и фреймворк iOS. Он использует систему сборки Gradle с применением плагина Kotlin Multiplatform и имеет целевые платформы Android и iOS.
plugins {
kotlin("multiplatform") version "1.8.0"
// ..
}
kotlin {
android()
ios()
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.8.0'
//..
}
kotlin {
android()
ios()
}
Наборы исходного кода
Модуль общего кода содержит код, общий для приложений Android и iOS. Однако для реализации одной и той же логики на Android и iOS иногда необходимо написать две платформенные версии. Для таких случаев Kotlin предлагает механизм expect/actual. Исходный код модуля общего кода организован в соответствии с тремя наборами исходного кода:
commonMainхранит код, работающий на обеих платформах, включаяexpectобъявленияandroidMainхранит части, специфичные для Android, включаяactualреализацииiosMainхранит части, специфичные для iOS, включаяactualреализации
Каждый набор исходного кода имеет свои зависимости. Библиотека Kotlin стандартных функций автоматически добавляется ко всем наборам исходного кода, вам не нужно объявлять её в скрипте сборки.
kotlin {
sourceSets {
val commonMain by getting
val androidMain by getting {
dependencies {
implementation("androidx.core:core-ktx:1.2.0")
}
}
val iosMain by getting
// ...
}
}
kotlin {
sourceSets {
commonMain {
}
androidMain {
dependencies {
implementation 'androidx.core:core-ktx:1.2.0'
}
}
iosMain {
}
// ...
}
}
При написании кода добавьте необходимые зависимости в соответствующие наборы исходного кода. Подробнее об добавлении зависимостей см. в документации Multiplatform по добавлению зависимостей.
Вместе с наборами исходного кода *Main существуют три соответствующих набора исходного кода для тестов:
commonTestandroidTestiosTest
Используйте их для хранения юнит-тестов для общих и платформоспецифичных наборов исходного кода соответственно. По умолчанию они имеют зависимости от библиотеки Kotlin Test, предоставляющей инструменты для тестирования на Kotlin: аннотации, функции проверки и другое. Вы можете добавлять зависимости от других необходимых библиотек.
kotlin {
sourceSets {
// ...
val commonTest by getting {
dependencies {
implementation(kotlin("test"))
}
}
val androidTest by getting
val iosTest by getting
}
}
kotlin {
sourceSets {
//...
commonTest {
dependencies {
implementation kotlin('test')
}
}
androidTest {
}
iosTest {
}
}
}
Основной и тестовый наборы исходного кода, описанные выше, являются стандартными. Плагин Kotlin Multiplatform автоматически генерирует их при создании целевой платформы. В проекте можно добавлять дополнительные наборы исходного кода для специфических целей. Дополнительную информацию см. в справочнике Multiplatform DSL.
Библиотека Android
Настройка библиотеки Android, созданной из модуля общего кода, типична для проектов Android. О создании библиотек Android см. в документации разработчика Android Создание библиотеки Android.
Для создания библиотеки Android используется отдельный плагин Gradle, помимо Kotlin Multiplatform:
plugins {
// ...
id("com.android.library")
}
plugins {
// ...
id 'com.android.library'
}
Настройка библиотеки Android хранится в android {} верхнем уровне блоке скрипта сборки модуля общего кода:
android {
compileSdk = 29
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig {
minSdk = 24
targetSdk = 29
}
}
android {
compileSdk 29
sourceSets.main.manifest.srcFile 'src/androidMain/AndroidManifest.xml'
defaultConfig {
minSdk 24
targetSdk 29
}
}
Это типично для любого проекта Android. Вы можете изменить его в соответствии со своими потребностями. Дополнительную информацию см. в документации разработчика Android.
Фреймворк iOS
Для использования в приложениях iOS модуль общего кода компилируется в фреймворк – своего рода иерархическую директорию с общими ресурсами, используемыми на платформах Apple. Этот фреймворк подключается к проекту Xcode, который собирает приложение для iOS.
Фреймворк создается с помощью компилятора Kotlin/Native. Настройка фреймворка хранится в ios {} блоке скрипта сборки в kotlin {}. Он определяет тип выходного файла framework и строковый идентификатор baseName, который используется для формирования имени выходного артефакта. Его значение по умолчанию соответствует имени модуля Gradle. В реальном проекте, скорее всего, потребуется более сложная настройка генерации фреймворка. Подробности см. в документации Multiplatform.
kotlin {
// ...
ios {
binaries {
framework {
baseName = "shared"
}
}
}
}
kotlin {
// ...
ios {
binaries {
framework {
baseName = 'shared'
}
}
}
}
Кроме того, существует задача Gradle embedAndSignAppleFrameworkForXcode, которая предоставляет фреймворк проекту Xcode, из которого собирается приложение для iOS. Она использует конфигурацию проекта приложения для iOS, чтобы определить режим сборки (debug или release) и предоставить соответствующую версию фреймворка в указанном месте.
Задача встроена в плагин multiplatform. Она выполняется при каждой сборке проекта Xcode, чтобы предоставить последнюю версию фреймворка для приложения для iOS. Подробности см. в разделе Приложение для iOS.
Приложение для Android
Часть приложения для Android в проекте Multiplatform Mobile — это типичное приложение для Android, написанное на Kotlin. В базовом кроссплатформенном мобильном проекте оно использует два плагина Gradle:
Kotlin Android
Приложение для Android
plugins {
id("com.android.application")
kotlin("android")
}
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
Для доступа к коду общей модули приложение для Android использует его в качестве зависимости проекта.
dependencies {
implementation(project(":shared"))
//..
}
dependencies {
implementation project(':shared')
//..
}
Помимо этой зависимости, приложение для Android использует стандартную библиотеку Kotlin (которая добавляется автоматически) и некоторые общие зависимости Android:
dependencies {
//..
implementation("androidx.core:core-ktx:1.2.0")
implementation("androidx.appcompat:appcompat:1.1.0")
implementation("androidx.constraintlayout:constraintlayout:1.1.3")
}
dependencies {
//..
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}
Добавьте зависимости, специфичные для Android, вашего проекта в этот блок. Настройка сборки приложения для Android находится в android {} верхнем уровне блоке скрипта сборки:
android {
compileSdk = 29
defaultConfig {
applicationId = "org.example.androidApp"
minSdk = 24
targetSdk = 29
versionCode = 1
versionName = "1.0"
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
}
}
android {
compileSdk 29
defaultConfig {
applicationId 'org.example.androidApp'
minSdk 24
targetSdk 29
versionCode 1
versionName '1.0'
}
buildTypes {
'release' {
minifyEnabled false
}
}
}
Это типично для любого проекта Android. Вы можете изменить его в соответствии со своими потребностями. Чтобы узнать больше, см. документацию разработчика Android.
Приложение для iOS
Приложение для iOS создаётся из проекта Xcode, автоматически сгенерированного мастером создания нового проекта. Оно находится в отдельной папке в корневом проекте.

Для каждой сборки приложения для iOS проект получает последнюю версию фреймворка. Для этого используется фаза сборки Run Script, которая выполняет задачу embedAndSignAppleFrameworkForXcode Gradle из общей модули. Эта задача генерирует .framework с необходимой конфигурацией в зависимости от настроек среды Xcode и помещает артефакт в DerivedData директорию Xcode.
Если у вас есть пользовательское имя для фреймворка Apple, используйте
embedAndSign<Custom-name>AppleFrameworkForXcodeв качестве имени этой задачи Gradle.Если у вас есть настройка сборки, отличная от стандартной
DebugилиRelease, в вкладке Настройки сборки добавьте настройкуKOTLIN_FRAMEWORK_BUILD_TYPEв разделе Определённые пользователем и задайте ей значениеDebugилиRelease.

Для встраивания фреймворка в приложение и обеспечения доступности объявлений из общей модули в исходном коде приложения для iOS необходимо правильно настроить следующие настройки сборки:
-
Другие флаги компоновщика в разделе Компоновка:
$(inherited) -framework shared

-
Пути поиска фреймворков в разделе Пути поиска:
$(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)

В других аспектах часть Xcode кроссплатформенного мобильного проекта — это типичный проект приложения для iOS. Чтобы узнать больше о создании приложения для iOS, ознакомьтесь с документацией Xcode.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform-mobile-understand-project-structure.html