![image](https://habrastorage.org/webt/jz/x_/bn/jzx_bnlrngqkioy5kc3k5quzid4.jpeg)
Всем привет! С вами Анна Жаркова, руководитель группы разработки в ГК 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](https://habrastorage.org/webt/so/vi/op/soviopx3tgy2kuxhhvmhrcaudni.png)
В итоге компилятор работает быстрее в 2 — 2.2 раза.
Однако использование K2 требует определенных доработок плагинов компилятора, например, тех же Jetpack Compose или KSP. Beta версии решений будут доступны в Kotlin 1.9.x. Финальная версия ожидается в 2024 году.
![image](https://habrastorage.org/webt/rg/g7/y4/rgg7y4mizl-freq5doopuzxwody.png)
Вы уже можете попробовать новый компилятор, подключив его в настройках build.gradle.kts.
![image](https://habrastorage.org/webt/2x/jw/ib/2xjwibyhfyh-ybzmlnjd6d00obm.png)
2. Kotlin DSL по умолчанию для Gradle builds
Сейчас в проектах Android по умолчанию используется Groovy для скриптов build.gradle, и переводить их в Kotlin DSL приходится вручную.
Теперь создаваемые скрипты будут Kotlin DSL по умолчанию. Но также у пользователей Android Studio появляется возможность выбрать тип скрипта при создании проекта.
![image](https://habrastorage.org/webt/dh/xi/cv/dhxicvrgbcx90fpdyv0wterjwfy.png)
Данная опция доступна по умолчанию в Android Studio Giraffe.
В дополнении к скриптам появляются специальные Gradle version catalogs (экспериментальная фича) — списки версий зависимостей библиотеки, к которым можно перейти по клику на название библиотеки в скрипте. С помощью такого каталога вы можете централизованно управлять зависимостями модулей и библиотек.
Инструкцию по миграции на каталоги можно найти тут . Также вы можете ознакомиться с этим подходом в коде приложения Now in Android.
3. Мигрируем с KAPT на KSP
Процессинг аннотаций — довольно мощный инструмент метапрограммирования, используемый для анализа кода, упрощения абстракций и кодогенерации для решения различных практических задач.
Основным инструментом процессинга аннотаций в приложениях Android до последнего времени был KAPT (Kotlin Annotation Processing Tool). Именно это решение использовалось в различных библиотеках, таких как Dagger, Room и т.д.
Особенностью данной технологии была генерация предварительных Java заглушек из исходного кода, которые только потом подвергались обработке для исходной задачи.
![image](https://habrastorage.org/webt/xg/x6/oh/xgx6ohxgaudb_c6x0f8uwg1fsjg.png)
Как результат, процесс билда приложения затягивался, иногда значительно.
Также KAPT сильно зависит от Java, поэтому не может использоваться в мультиплатформенных приложениях или для других таргетов.
KSP (Kotlin Symbol Processing) был заявлен как альтернатива KAPT в 2020 году, с версии 1.5.31 вышел в stable.
![image](https://habrastorage.org/webt/5p/ar/rn/5parrn8ecpvg7k6hdm4foujkagi.png)
Технология работает напрямую с 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](https://habrastorage.org/webt/i0/vn/kx/i0vnkxe6vafrhr8d68mqscouwqo.png)
За последние полгода появились и различные 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, поддержке мультиплатформенности и миграции на такие решения говорит нам об актуальности данной технологии.