Понимание структуры мобильного проекта
Цель технологии Kotlin Multiplatform Mobile – объединение разработки приложений с общей логикой для платформ Android и iOS. Для этого используется структура проектов Kotlin Multiplatform, специфичная для мобильных приложений. Эта страница описывает структуру базового кроссплатформенного мобильного проекта. Обратите внимание, что эта структура не единственный возможный способ организации проекта; однако мы рекомендуем её в качестве отправной точки.
Чтобы просмотреть полную структуру вашего мобильного многоплатформенного проекта, измените представление с Android на Проект.
Базовый проект Kotlin Mobile Multiplatform состоит из трех компонентов:
Модуль Shared – модуль Kotlin, содержащий общую логику для приложений Android и iOS. Сборка в библиотеку Android и фреймворк iOS. Использует Gradle в качестве системы сборки.
Приложение Android – модуль Kotlin, который собирается в приложение Android. Использует Gradle в качестве системы сборки.
Приложение iOS – проект Xcode, который собирается в приложение iOS.
Это структура проекта Multiplatform Mobile, созданного с помощью мастера проектов в IntelliJ IDEA или Android Studio. Реальные проекты могут иметь более сложную структуру; мы считаем эти три компонента необходимыми.
Давайте подробнее рассмотрим базовый проект и его компоненты.
Проект корневой директории
Проект корневой директории – это Gradle-проект, содержащий модуль shared и приложение Android в качестве своих подпроектов. Они связаны через механизм многопроектных сборок Gradle.
// settings.gradle.kts
include(":shared")
include(":androidApp")
// settings.gradle include ':shared' include ':androidApp'
Приложение iOS создается из проекта Xcode. Оно хранится в отдельной директории в корневом проекте. Xcode использует свою собственную систему сборки, поэтому проект приложения iOS не связан с другими частями проекта Multiplatform Mobile через Gradle. Вместо этого он использует модуль shared как внешний артефакт – фреймворк. Подробности об интеграции между модулем shared и приложением iOS см. в разделе Приложение iOS.
Вот базовая структура кроссплатформенного мобильного проекта:
Корневой проект не содержит исходного кода. Вы можете использовать его для хранения глобальной конфигурации в своих build.gradle(.kts) или gradle.properties, например, добавления репозиториев или определения глобальных конфигурационных переменных.
Для более сложных проектов вы можете добавить больше модулей в корневой проект, создав их в IDE и связав через include объявления в настройках Gradle.
Модуль общего использования
Модуль общего использования содержит основной логику приложения, используемую на обеих целевых платформах: классы, функции и так далее. Это модуль Kotlin Multiplatform, который компилируется в библиотеку Android и фреймворк iOS. Он использует Gradle с применённой плагином Kotlin Multiplatform и имеет целевые платформы Android и iOS.
plugins {
kotlin("multiplatform") version "1.6.20"
// ..
}
kotlin {
android()
ios()
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.6.20'
//..
}
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, и помещает артефакт в директорию 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–2022 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