Spec-Zone.ru › Kotlin 1.8

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

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

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

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

Чтобы увидеть полную структуру вашего мобильного проекта на нескольких платформах, переключите представление с 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.8.0"
    // ..
}

kotlin {
    android()
    ios()
}
plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.8.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 и помещает артефакт в 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.

Последнее изменение: 10 января 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