Spec-Zone.ru › Kotlin 1.7

Понимание структуры проекта для мобильных платформ

Технология Kotlin Multiplatform Mobile предназначена для объединения разработки приложений с общей логикой для платформ 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.7.20"
    // ..
}

kotlin {
    android()
    ios()
}
plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.7.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.

Используйте задачу embedAndSignAppleFrameworkForXcode Gradle только с построениями проекта 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 проект получает последнюю версию фреймворка. Для этого используется фаза сборки Скрипт выполнения, которая выполняет задачу 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.

Последнее изменение: 06 сентября 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