Понимание структуры мобильного проекта
Цель технологии Kotlin Multiplatform — унификация разработки приложений с общей логикой для платформ Android и iOS. Для этого она использует специфическую для мобильных устройств структуру проектов Kotlin Multiplatform.
Эта страница описывает структуру и компоненты базового кроссплатформенного мобильного проекта: модуль общего кода, приложение Android и приложение iOS.
Чтобы увидеть полную структуру вашего мобильного проекта Multiplatform, переключите вид с 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.9.0"
// ..
}
kotlin {
android()
ios()
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.9.0'
//..
}
kotlin {
android()
ios()
}
Наборы исходного кода
Модуль общего кода содержит код, общий для приложений Android и iOS. Однако для реализации одной и той же логики на Android и iOS иногда необходимо написать две платформоспецифичные версии. Для таких случаев Kotlin предлагает механизм expect/actual. Исходный код модуля общего кода организован в соответствии со следующими наборами исходного кода:
commonMainхранит код, работающий на обеих платформах, включая декларацииexpectandroidMainхранит Android-специфичные части, включая реализацииactualiosMainхранит 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, и помещает артефакт в директорию Xcode DerivedData.
Если у вас есть пользовательское имя для фреймворка 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