Spec-Zone.ru › Kotlin 1.6

Понимание структуры мобильного проекта

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

Чтобы просмотреть полную структуру вашего мобильного многоплатформенного проекта, измените представление с Android на Проект.

Select the Project view

Базовый проект Kotlin Mobile Multiplatform состоит из трех компонентов:

  • Модуль Shared – модуль Kotlin, содержащий общую логику для приложений Android и iOS. Сборка в библиотеку Android и фреймворк iOS. Использует Gradle в качестве системы сборки.

  • Приложение Android – модуль Kotlin, который собирается в приложение Android. Использует Gradle в качестве системы сборки.

  • Приложение iOS – проект Xcode, который собирается в приложение iOS.

Basic Multiplatform Mobile project structure

Это структура проекта 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.

Вот базовая структура кроссплатформенного мобильного проекта:

Basic Multiplatform Mobile project directories

Корневой проект не содержит исходного кода. Вы можете использовать его для хранения глобальной конфигурации в своих 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 хранит код, работающий на обеих платформах, включая объявления 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 наборами исходных кодов существуют три соответствующих набора исходных кодов для тестирования:

  • commonTest

  • androidTest

  • iosTest

Используйте их для хранения модульных тестов для общих и платформенно-специфичных наборов исходных кодов соответственно. По умолчанию они зависят от библиотеки 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.

Используйте задачу Gradle embedAndSignAppleFrameworkForXcode только со сборками проекта Xcode; в противном случае получите ошибку.

Приложение 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, сгенерированного автоматически мастером создания новых проектов. Оно располагается в отдельной директории корневого проекта.

Basic Kotlin Multiplatform Xcode project

Для каждой сборки приложения iOS проект получает последнюю версию фреймворка. Для этого используется этап сборки Run Script, который выполняет задачу embedAndSignAppleFrameworkForXcode Gradle из модуля общего использования. Эта задача генерирует .framework с необходимой конфигурацией, в зависимости от настроек среды Xcode, и помещает артефакт в директорию DerivedData Xcode.

  • Если у вас есть пользовательское имя для Apple фреймворка, используйте embedAndSign<Custom-name>AppleFrameworkForXcode в качестве имени для этой задачи Gradle.

  • Если у вас есть пользовательская конфигурация сборки, отличная от стандартной Debug или Release, на вкладке Настройки сборки добавьте настройку KOTLIN_FRAMEWORK_BUILD_TYPE в разделе Определяемые пользователем и установите значение Debug или Release.

Используйте задачу embedAndSignAppleFrameworkForXcode Gradle только при сборке проекта Xcode; в противном случае вы получите ошибку.

Execution of embedAndSignAppleFrameworkForXcode in the Xcode project settings

Чтобы встроить фреймворк в приложение и сделать объявления из общего модуля доступными в исходном коде приложения iOS, необходимо правильно настроить следующие настройки сборки:

  1. Другие флаги компоновщика в разделе Компоновка:

    $(inherited) -framework shared
    
    Configuring Other linker flags in the Xcode project settings
  2. Пути поиска фреймворков в разделе Пути поиска:

    $(SRCROOT)/../shared/build/xcode-frameworks/$(CONFIGURATION)/$(SDK_NAME)
    
    Configuring Framework Search Paths in the Xcode project settings

В остальных аспектах, часть Xcode в кроссплатформенном мобильном проекте — это типичный проект приложения iOS. Чтобы узнать больше о создании приложений iOS, см. документацию Xcode.

Последнее изменение: 07 апреля 2022
Создание вашего первого кроссплатформенного мобильного приложения — учебник Запуск вашего Android приложения на iOS — учебник

© 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

Spec-Zone.ru

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