image

Всем привет! С вами Анна Жаркова, руководитель группы разработки в ГК Usetech.

И сегодня мы посмотрим на новинки Kotlin для Android, представленные Google в видео «What's new in Kotlin for Android» с Google I/O 2023 (с некоторыми моими комментариями и дополнениями).

В этом году основной фокус делают на следующие пункты:
  • Kotlin Compiler 2.0 (доступен с 2024 года)
  • Kotlin DSL скрипты build.gradle по умолчанию
  • KSP как приоритетный процессинг аннотаций
  • Kotlin Multiplatform (неожиданно)

Также внимание отводится Jetpack Compose и его улучшениям, но подробнее ознакомиться стоит в тематических видео.

Итак, начнем с компилятора Kotlin.

1. Kotlin 2.0 и новый компилятор


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

K2 использует не только IR промежуточного представления на бэкенде, но и FIR промежуточного представления на фронтенде. В него интегрируются сразу и PSI (Program Structure Interface, семантическое древо структуры программного модуля), и Binding Context (по сути таблица соотношения узлов PSIElement и дескрипторов с соответствующей информацией). Совмещение ускоряет процесс анализа, поиска и получения этой информации. Также некоторая информация расширена для ускорения статистического анализа.

image

В итоге компилятор работает быстрее в 2 — 2.2 раза.

Однако использование K2 требует определенных доработок плагинов компилятора, например, тех же Jetpack Compose или KSP. Beta версии решений будут доступны в Kotlin 1.9.x. Финальная версия ожидается в 2024 году.

image

Вы уже можете попробовать новый компилятор, подключив его в настройках build.gradle.kts.

image

2. Kotlin DSL по умолчанию для Gradle builds


Сейчас в проектах Android по умолчанию используется Groovy для скриптов build.gradle, и переводить их в Kotlin DSL приходится вручную.

Теперь создаваемые скрипты будут Kotlin DSL по умолчанию. Но также у пользователей Android Studio появляется возможность выбрать тип скрипта при создании проекта.

image

Данная опция доступна по умолчанию в Android Studio Giraffe.

В дополнении к скриптам появляются специальные Gradle version catalogs (экспериментальная фича) — списки версий зависимостей библиотеки, к которым можно перейти по клику на название библиотеки в скрипте. С помощью такого каталога вы можете централизованно управлять зависимостями модулей и библиотек.

Инструкцию по миграции на каталоги можно найти тут . Также вы можете ознакомиться с этим подходом в коде приложения Now in Android.

3. Мигрируем с KAPT на KSP


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

Основным инструментом процессинга аннотаций в приложениях Android до последнего времени был KAPT (Kotlin Annotation Processing Tool). Именно это решение использовалось в различных библиотеках, таких как Dagger, Room и т.д.

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

image

Как результат, процесс билда приложения затягивался, иногда значительно.

Также KAPT сильно зависит от Java, поэтому не может использоваться в мультиплатформенных приложениях или для других таргетов.

KSP (Kotlin Symbol Processing) был заявлен как альтернатива KAPT в 2020 году, с версии 1.5.31 вышел в stable.

image

Технология работает напрямую с Kotlin кодом, без стадии заглушек и их компиляции.

В целом, можно выделить следующие преимущества KSP по сравнению с KAPT:
  • скорость выше до 2х раз за счет отсутствия стадии генерации заглушек (примечание — на сайте Jetbrains выигрыш несколько меньше, до 25%)
  • лучше работает с типами Kotlin
  • независимость от Java и мультиплатформенность.

Сейчас KSP становится официально рекомендованной технологией, а это значит, что нам предстоит миграция с KAPT. Тем более, что многие решения уже переходят под капотом на KSP:
  • Room
  • Mochi
  • Glide
  • Koin

И даже в Dagger идут такие работы.

С инструкциями по миграции вы можете ознакомиться в статье Migrate from kapt to KSP.

4. Мультиплатформа


Выход Kotlin Multiplatform в стабильную бету не остался незамеченным для Google.

image

За последние полгода появились и различные codelabs по работе с мультиплатформой, и версии Jetpack библиотек.

В статье «What's new in multiplatform Jetpack libraries» можно ознакомиться с приложением DiceRoller, которое работает на специальных мультиплатформенных версиях Annotations (явно KSP), Collections, DataStore.

val commonMain by getting {
    dependencies {
        implementation("androidx.annotation:annotation:1.7.0-alpha02")       

        implementation("androidx.collection:collection:1.3.0-alpha04")

        // Lower-level APIs with support for custom serialization
        implementation("androidx.datastore:datastore-core-okio:1.1.0-alpha03")
        // Higher-level APIs for storing values of basic types
        implementation("androidx.datastore:datastore-preferences-core:1.1.0-alpha03")
   }
}

Также Google продолжает развивать Flutter, что говорит нам о том, что обе технологии учить и знать актуально, выбор лишь за вами. А внимание Kotlin Multiplatform, поддержке мультиплатформенности и миграции на такие решения говорит нам об актуальности данной технологии.

Комментарии (1)