Основы Kotlin Multiplatform. Бесплатный учебник на русском языке (KA0700)
Основы Kotlin Multiplatform. Бесплатный учебник на русском языке (KA0700)

KA0701 — Введение в Kotlin Multiplatform (KMP)

  • Запись изменена:20.12.2022
  • Post category:Публикации
  • Reading time:17 минут чтения

Поздравляю! Читая этот учебник, вы делаете первый шаг к тому, чтобы научиться писать меньше кода. В трех разделах вы узнаете, как использовать Kotlin Multiplatform (KMP) для настройки и написания приложений для iOS, Android и настольных компьютеров с использованием новейших технологий пользовательского интерфейса (UI).

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

Вы узнаете, как использовать KMP путем совместного использования бизнес-логики на разных платформах и создания настраиваемых собственных пользовательских интерфейсов на каждой платформе. Кроме того, вы узнаете, как писать тесты для всей вашей бизнес-логики, использовать популярную библиотеку JetBrains Ktor для обработки сетевых вызовов и, конечно же, использовать сопрограммы Kotlin для обработки параллелизма.

Этот курс требует некоторых знаний в области мобильной разработки, но поможет вам в настройке как для iOS, так и для Android, а также для настольных приложений. Хотя большая часть книги использует Kotlin, разработчики iOS, знакомые с Swift, смогут легко освоить Kotlin.

В этой главе вы узнаете о мультиплатформенности Kotlin и истории создания кроссплатформенных фреймворков. В конце главы вы настроите свою среду, создадите новый проект и запустите его на Android и iOS.

Что такое мультиплатформенность Kotlin?

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

Как следует из названия, мультиплатформенная платформа Kotlin использует язык программирования Kotlin и работает на нескольких платформах. Kotlin уже работает на платформах, поддерживающих виртуальную машину Java (JVM), и использует Kotlin Native для платформ, которые не поддерживают JVM. Kotlin Native компилирует Kotlin в собственный байт-код, который изначально выполняется в операционных системах Apple, Windows и Linux. В Интернете KMP компилирует Kotlin в JavaScript и HTML.

KMP поддерживает следующие платформы:

  • Android
  • iOS
  • macOS
  • watchOS
  • tvOS
  • Windows
  • Linux
  • Web

Это очень много платформ. Некоторые, например, веб, на данный момент нестабильны.

KMP против KMM

Вы используете KMP для написания кода с использованием Kotlin для нескольких платформ. Kotlin Multiplatform Mobile (KMM) — это способ использования Kotlin специально для кросс-платформенной мобильной разработки. Когда вы говорите о разработке только для мобильных устройств, вы говорите о KMM, но если вы говорите обо всех платформах, включая настольные или веб-, вы говорите о KMP.

История кроссплатформенности

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

  • Телефонный звонок: Один из самых ранних, PhoneGap позволил вам писать мобильные приложения с использованием HTML5, CSS3 и JavaScript. Она была прекращена в 2020 году.
  • Апачи Кордова: Форк PhoneGap с открытым исходным кодом.
  • Ionic: Использует фреймворки пользовательского интерфейса Angular, React и Vue.
  • Appcelerator Titanium: SDK на основе JavaScript, который поддерживает iOS, Android, Windows и Blackberry. Снят с производства и будет доступен с открытым исходным кодом к марту 2022 года.

Вышеприведенные фреймворки работали с использованием веб-технологий для отображения либо собственных элементов управления, либо элементов управления, разработанных так, чтобы они выглядели как собственные. Однако они страдали от медленной связи JavaScript-to-native и должны были обновляться каждый раз, когда менялась собственная платформа.

  • Xamarin: платформа разработки на C #, принадлежащая Microsoft, которая включает в себя .СЕТЕВОЕ время выполнения. Фреймворк скомпилирован для iOS, поэтому на iOS он работает быстрее, чем на Android, который использует компиляцию точно в срок.
  • React Native: платформа Facebook для мобильных устройств, основанная на популярной веб-платформе React. Он основан на веб- и JavaScript. У него тоже есть медленный мост между native и web.
  • Flutter: Это новичок в блоке, и он работает на всех платформах. Одним из основных преимуществ этого фреймворка является то, что вы можете написать почти весь свой пользовательский интерфейс сразу. Некоторые пользовательские интерфейсы должны отличаться в зависимости от платформы. Например, для desktop и web не нужна панель инструментов. Одним из недостатков является то, что он написан с использованием языка Dart, который многие разработчики не знают. Dart только недавно получил нулевую безопасность, и многие пакеты используют генерацию кода, которую приходится выполнять вручную.

Многие веб-фреймворки выходят из моды. Флаттер набирает обороты, но многие сомневаются в использовании Dart.

История Котлина

Kotlin официально существует с июля 2011 года. 15 февраля 2016 года JetBrains выпустила версию 1.0, и она была анонсирована на выставке Google I / O 2017 как первоклассный язык для разработки Android. JetBrains разработали Kotlin, потому что в большинстве языков не было функций, которые они искали. JetBrains теперь использует Kotlin в качестве предпочтительного языка разработки для всей текущей работы, постепенно заменяя Java.

Почему Kotlin?

Почему вы должны использовать Kotlin? Потому что это один из немногих языков, который вы можете скомпилировать как для JVM, так и для native и использовать на iOS, а также на рабочем столе и в Интернете.

Kotlin также идеально подходит для серверной работы. С библиотекой Ktor создание сетей — простая задача. Написание общей бизнес-логики гарантирует, что все платформы ведут себя одинаково, и вам нужно протестировать только один раз. Он использует один и тот же код для всех платформ, уменьшая вероятность ошибок и ускоряя разработку. Каждая команда может использовать столько общего кода, сколько захочет. Начните медленно с существующих проектов или начните писать всю свою бизнес-логику с новых проектов.

Разработчики iOS знакомы с Swift, и Kotlin очень похож — поэтому кривая обучения должна быть минимальной. Разработчики по-прежнему используют Swift на стороне пользовательского интерфейса, но они также могут работать и помогать с бизнес-логикой в Kotlin. Поскольку по-прежнему потребуется много работы по разработке iOS, разработчики iOS будут включены во все этапы разработки.

Каким объемом кода делиться, зависит от команды. Если у вас есть существующее приложение, вы можете постепенно изменять свою бизнес-логику, чтобы у вас был общий набор кода, который вы можете протестировать один раз.

KMP добавляет минимальный дополнительный размер приложению. Стандартная библиотека невелика, и вам нужно включить только те части, которые вы используете.

KMM: KMM, хотя и новее, стала очень популярной. Многие приложения в магазинах приложений уже используют его. Многие компании считают, что написание бизнес—логики один раз, а не на iOS и Android, экономит команде много времени. Пользовательские интерфейсы являются нативными, что радует мобильных разработчиков, а пользователи довольны тем, что у них быстрый интерфейс.

Чем KMP не является

Хотя KMP предоставляет Kotlin в качестве языка программирования, он не предоставляет пользовательский интерфейс. Если вы хотите создать пользовательский интерфейс для Android, вы можете написать его в собственном коде или использовать более новую платформу Jetpack Compose UI framework. Для iOS вы можете использовать UIKit или более новую платформу SwiftUI с использованием Swift. Для рабочего стола вы можете использовать Desktop Compose или Java Swing . Другими словами, у вас есть выбор в отношении того, как вы пишете свой пользовательский интерфейс. Многие видят в этом преимущество — пользовательский интерфейс всегда будет нативным, поэтому он не будет страдать от медленной мостовой связи, присущей веб-фреймворкам.

Когда использовать KMP

Одной из приятных особенностей KMP и KMM является то, что вы можете использовать столько или столько, сколько захотите. Если у вас есть существующее приложение, вы можете использовать его для новых функций или начать замену функции с помощью KMP. Если вы начнете с использования KMP для некоторых нижних уровней вашего приложения, вы сможете повторно использовать его для всех своих платформ. Например, вы можете использовать SQLDelight для замены всего кода вашей базы данных только одним набором кода. Или же вы можете написать свою бизнес-логику только один раз и повторно использовать ее на всех своих платформах. Если вам нужно создать код для доступа к сетевым API, вы можете написать его один раз, чтобы он работал на всех платформах.

Слои

Большинство приложений состоят из разных слоев. Обычно существует сетевой уровень, уровень базы данных (при необходимости), уровень хранилища, который взаимодействует с базой данных, уровень бизнес-логики (не всегда) и уровень пользовательского интерфейса. KMP не предоставляет слой пользовательского интерфейса; вместо этого вы будете использовать собственный пользовательский интерфейс.

Бизнес-логика

В настоящее время в большинстве компаний работают команды разработчиков iOS и Android. Каждая команда берет набор спецификаций и пишет различный код для реализации этих спецификаций. При тестировании каждая команда должна убедиться, что реализованная ими логика работает так же, как и на другой платформе. Но с двумя разными наборами кода, как они узнают, что все угловые случаи работают одинаково? С помощью одной базы кода для бизнес-логики обе команды могут просматривать код, чтобы убедиться, что логика соответствует спецификациям, и знать, что она будет работать одинаково для обеих платформ. Имея одну базу кода бизнес-логики, вы можете заставить либо обе команды работать над ней вместе, либо одну команду специализироваться на написании бизнес-логики.

База данных

Вы можете написать уровень базы данных с помощью SQLite на мобильных устройствах и настольных компьютерах, используя библиотеку SQLDelight. Эта библиотека представляет собой мультиплатформенный пакет, предназначенный для работы на всех этих платформах. Представьте, что вам нужно написать этот набор кода только один раз. Вы не только напишете только один набор вставок, удалений и обновлений базы данных SQL более низкого уровня, но и ваш уровень хранилища нужно будет записать только один раз. SQLDelight использует инструкции SQL для генерации кода для вас. Вам нужно протестировать только один раз.

Пользовательский интерфейс

Поскольку KMM не предоставляет уровень пользовательского интерфейса, вы можете использовать любую систему пользовательского интерфейса, которую захотите. Для iOS разработчики обращаются к SwiftUI: хорошему, декларативному инструментарию пользовательского интерфейса, который упрощает создание красивых пользовательских интерфейсов. Теперь, когда Jetpack Compose выпущен как стабильный, разработчики Android могут его использовать. Кроссплатформенные пользовательские интерфейсы для настольных КОМПЬЮТЕРОВ долгое время игнорировались. Swing был стандартом в течение некоторого времени, но он устарел и не поддерживается. JetBrains надеется заменить его на Compose для рабочего стола. Он использует много Jetpack Compose от Android под ним, со слоем кода рабочего стола. В настоящее время существует проблема с именами пакетов в Android с использованием androidx и desktop с использованием org.jetbrains. JetBrains надеется решить эту проблему в будущем.

Является ли он родным?

Один из наиболее часто задаваемых вопросов: использует ли он собственные элементы управления? Ответ — да. Поскольку KMP не предоставляет никакого слоя пользовательского интерфейса, весь пользовательский интерфейс отрисовывается изначально. На Android это может быть встроенная система просмотра или новая библиотека Jetpack Compose. На iOS вы можете использовать встроенный собственный пользовательский интерфейс или более новый SwiftUI. На рабочем столе вы можете использовать более старую Java Swing или более новую Desktop Compose. Для рабочего стола Mac вы также можете использовать SwiftUI или AppKit. Для Android код генерируется в виде файлов классов Java, в то время как iOS использует LLVM для создания собственного кода и создания библиотеки Xcode framework.

Текущее состояние КМП

На момент написания статьи KMP в настоящее время находится в стадии альфа-тестирования, но производственные приложения в магазинах Google и Apple уже используют его. Поскольку существует несколько уровней, вот текущее состояние платформы на момент написания этой книги:

Рис. 1.1 — Состояние компонента KMP
Рис. 1.1 — Состояние компонента KMP

Поскольку приложения для Android создаются на Kotlin уже много лет, проблем с совместимостью нет. Приложения для iOS и macOS взаимодействуют с фреймворками, созданными с помощью системы KMM. Это будет продолжать развиваться и улучшаться, но функция все еще находится в стадии бета-тестирования. Настольные приложения могут использовать тот же общий код, что и другие платформы, но использовать свой собственный пользовательский интерфейс.

Настройка вашей среды

Вы можете использовать либо IntelliJ, либо Android Studio для выполнения KMP-работы. В этой книге вы будете использовать Android Studio, потому что на момент написания книги она лучше работала с мобильными платформами.

Скачать Android Studio

Перейти к https://developer.android.com/studio и загрузите Android Studio Bumblebee edition или более позднюю версию. После установки перейдите в настройки Android Studio, а затем в раздел плагины. Найдите мультиплатформенность и установите мультиплатформенный мобильный плагин Kotlin:

Рис. 1.2 - Плагины для Android Studio
Рис. 1.2 — Плагины для Android Studio

Перезапустите Android Studio, чтобы включить его.

Скачать Xcode

Если вы хотите разрабатывать для iOS или macOS, вам необходимо установить Xcode из App Store на свой Mac. Убедитесь, что вы открыли Xcode, чтобы также установить его инструменты.

Рис. 1.3 - Xcode в App Store
Рис. 1.3 — Xcode в App Store

Установите CocoaPods

CocoaPods — это менеджер зависимостей для iOS. Поскольку CocoaPods существует уже давно, его легко использовать в Xcode и легко добавлять зависимости.

Если вы используете компьютер Mac на базе Intel, выполните следующую команду в Terminal на вашем компьютере Mac:

sudo gem install cocoapods

Приведенная выше команда устанавливает cocoapods, используя установку Ruby по умолчанию, доступную в macOS.

Если вы используете Mac на базе M1, выполните следующую команду в терминале на вашем Mac:

brew install cocoapods

Создание вашего первого проекта

Пришло время создать свой первый проект! В Android Studio откройте меню Файл и выберите Создать ▸ Новый проект.

Рис. 1.4 - Новое меню проекта
Рис. 1.4 — Новое меню проекта

В окне Нового проекта прокрутите вниз до последней записи и выберите Мультиплатформенное приложение Kotlin. Если вы этого не видите, убедитесь, что вы установили плагин KMM. Кроме того, не забудьте перезапустить Android Studio после установки плагина. Нажмите кнопку Далее.

Рис. 1.5 - Новые шаблоны проектов
Рис. 1.5 — Новые шаблоны проектов

В следующем диалоговом окне введите имя Find Time и имя пакета com.raywenderlich.findtime или ваше собственное имя пакета. Выберите каталог, в котором вы хотите сохранить проект, и нажмите Далее.

Рис. 1.6 - Диалоговое окно проекта приложения KMM
Рис. 1.6 — Диалоговое окно проекта приложения KMM

В следующем диалоговом окне оставьте все по умолчанию. Здесь вы называете папку Android AndroidApp, папку iOS iosApp и общую папку shared. Вы можете использовать любые имена, какие захотите, но в остальной части книги будут использоваться эти условные обозначения.

Как упоминалось ранее, вы будете использовать менеджер зависимостей CocoaPods для iOS. Когда файлы Gradle будут созданы, Android Studio добавит раздел для CocoaPods.

Рис. 1.7 - Диалоговое окно именования приложений KMM
Рис. 1.7 — Диалоговое окно именования приложений KMM

Нажмите кнопку Готово, и через некоторое время откроется новый проект.

Сначала вы увидите файловую структуру Android на левой панели, но вы хотите увидеть все папки. Выберите Проект в меню, отображающем Android. Здесь вы можете увидеть все папки и файлы, созданные для вас. У вас есть скрытая папка для Gradle и Android Studio (.idea), а также папки AndroidAppGradleiosApp и общие папки.

Рис. 1.8 - Вид проекта
Рис. 1.8 — Вид проекта

Мультиплатформенные ключевые слова Kotlin

Теперь, когда вы создали проект, вам нужно знать о двух новых ключевых словах, которые были добавлены в язык Kotlin для поддержки KMP: expect и actual. Они позволяют создавать функции или переменные в общем модуле, используя ключевое слово expect . Эти функции или переменные не определены в папке commonMain, но ожидаются в каждом мультиплатформенном модуле, таком как androidMain или iosMain. Если вы откроете общую папку, вы увидите:

Рис. 1.9 - Общий модуль
Рис. 1.9 — Общий модуль

Здесь вы можете увидеть папки для Android, common и iOS. Вы добавите общие классы и код в commonMain / kotlin. Если вам нужно написать код, зависящий от платформы, вы напишете ожидаемую функцию или переменную в общую папку, а фактический код — в папки Android и iOS. Откройте папку commonMain и откройте Platform.kt.

package com.raywenderlich.findtime

expect class Platform() {
    val platform: String
}

Здесь вы видите, как использовать ключевое слово expect . Это говорит о том, что вы ожидаете, что каждая платформа будет иметь фактический класс с именем Platform, который реализует этот класс и имеет переменную с именем platform, которая является строкой. Теперь откройте файлы платформы Android и iOS.kt.

Android

package com.raywenderlich.findtime

actual class Platform actual constructor() {
    actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
}

В классе Android новое ключевое слово actual указывает, что это фактическая реализация для ожидаемого класса платформы. Переменная платформы также имеет ключевое слово actual и предоставляет реализацию для переменной, возвращающей строку “Android” и номер Android SDK.

Запустите приложение для Android из Android Studio, убедившись, что на панели инструментов выбрано приложение AndroidApp и выбран эмулятор или телефон. Затем нажмите зеленую кнопку воспроизведения.

Рис. 1.10 - Конфигурация запуска
Рис. 1.10 — Конфигурация запуска

Ты увидишь:

Рис. 1.11 - Запущенное приложение для Android
Рис. 1.11 — Запущенное приложение для Android

На вашем экране теперь отображаются слова Hello, Android и версия Android.

Для iOS откройте Platform.kt в shared/src/iosMain/kotlin/com/raywenderlich/findtime:

package com.raywenderlich.findtime

import platform.UIKit.UIDevice

actual class Platform actual constructor() {
    actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}

Обратите внимание, что этот класс написан на Kotlin, но использует код платформы iOS. Вау, ты можешь писать код iOS на Kotlin! Когда вы создадите свой проект, плагин KMP скомпилирует этот класс в фреймворк. Откройте Xcode. В меню Файл выберите Открыть и перейдите к своему проекту и в папку iosApp. Выберите файл рабочей области (iosApp.xcworkspace). Чтобы проект запускался без ошибок, вам необходимо выполнить сборку в Xcode. Выберите продукт ▸ Сборка или нажмите Command-B. Как только проект будет собран, откройте contentView.swift.

import SwiftUI
import shared

struct ContentView: View {
    let greet = Greeting().greeting()
    
    var body: some View {
        Text(greet)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Этот файл был сгенерирован для вас и написан на SwiftUI. Ускоренный курс SwiftUI вы получите в следующей главе. Наведите указатель мыши на приветствие() и нажмите Command-Click.

Рис. 1.12 - Определение метода Xcode
Рис. 1.12 — Определение метода Xcode

Это откроет общий файл.h. Он написан на Objective-C, но позволяет вам использовать весь код из общего проекта. Прокрутите страницу до нижней части файла, и вы увидите:

public class Greeting : KotlinBase {
    public init()    
    open func greeting() -> String
}

public class Platform : KotlinBase {
    public init()
    open var platform: String { get }
}

Запустите приложение в симуляторе в Xcode, нажав кнопку Воспроизведения или нажав Command-R. Ты увидишь:

Рис. 1.13 - Запущенное приложение для iOS
Рис. 1.13 — Запущенное приложение для iOS

Теперь на экране отображается код, написанный на Kotlin, с использованием имени устройства и версии устройства.

Ключевые моменты

  • KMP относится к мультиплатформенной платформе Kotlin, а KMM относится к мультиплатформенной мобильной платформе Kotlin.
  • KMP помогает писать общий код для сетей, баз данных и бизнес-логики.
  • Вы не можете использовать KMP для работы с пользовательским интерфейсом. Вместо этого вам нужно будет использовать собственные фреймворки.
  • Легко создать проект KMP с помощью плагина KMM.

Куда идти дальше?

В этой главе вы немного узнали о KMP и KMM.

Чтобы узнать больше о Kotlin:

В следующей главе вы на основе этого проекта создадите проект Find Time.