Spec-Zone.ru › Kotlin 1.9

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

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

Эта страница описывает структуру и компоненты базового кроссплатформенного мобильного проекта: модуль общего кода, приложение Android и приложение iOS.

Данная структура не единственно возможный способ организации проекта; однако мы рекомендуем её в качестве отправной точки.

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

Select the Project view

Проект корня

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

Basic Multiplatform Mobile project structure
// settings.gradle.kts
include(":shared")
include(":androidApp")
// settings.gradle
include ':shared'
include ':androidApp'

Приложение iOS создается из проекта Xcode. Оно хранится в отдельной директории внутри проекта корня. Xcode использует свою собственную систему сборки; поэтому проект приложения iOS не связан с другими частями проекта Multiplatform Mobile через Gradle. Вместо этого он использует модуль общего кода как внешний артефакт — фреймворк. Подробности о взаимодействии между модулем общего кода и приложением iOS см. в разделе Приложение iOS.

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

Basic Multiplatform Mobile project directories

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

  • Если у вас есть пользовательское имя для фреймворка 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.

Последнее изменение: 11 апреля 2023
Подведение итогов проекта Обучение: запуск вашего приложения Android на iOS

© 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

Spec-Zone.ru

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