Forwarded from Android Broadcast
Однажды пятничным вечером Александр и его коллега задумались над вопросом: где живут корутины, когда запустивший их coroutineScope героически погибает в жерновах GC? Субботнее утро было проведено за чтением статей и исходников.
Вот так и родилась идея доклада. В нем — ответы на вопросы об устройстве и работе корутин для самых любознательных.
📹 Версия на VK Video
#kotlin #coroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
Kotlin Multiplatform Scalability Challenges on a Large Project (EN, 10 мин)
Статья об опыте разработки функциональности на KMP для проекта с уже существующей обширной кодовой базой под Android и iOS. Основные сложности:
👉 Усложнение архитектуры
👉 Проблемы со сборкой
👉 Перенос кода в общие и платформенные модули, а также обеспечение поддержки для нативных разработчиков
👉 Работа с многопоточностью
👉 Ограничения существующего инструментария
👉 Выстраивание процессов в команде разработки
🔗 Ссылка без VPN
#kmp #kotlin
Статья об опыте разработки функциональности на KMP для проекта с уже существующей обширной кодовой базой под Android и iOS. Основные сложности:
👉 Усложнение архитектуры
👉 Проблемы со сборкой
👉 Перенос кода в общие и платформенные модули, а также обеспечение поддержки для нативных разработчиков
👉 Работа с многопоточностью
👉 Ограничения существующего инструментария
👉 Выстраивание процессов в команде разработки
🔗 Ссылка без VPN
#kmp #kotlin
Для работы Viewer надо добавить зависимость в проект и провести простую интеграцию с вашей БД
Автор решения также написал статью (4м) на русском с демонстрацией возможностей
#kotlin #kmp #sqlite #android #ios #desktop
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Как устроены Kotlin Compiler Plugins и что они могут сделать с Kotlin кодом в процессе компиляции
#kotlin
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
Koin Annotations — надстройка над Koin для описания зависимостей с помощью аннотаций и последующей генерации части графа для них.
Что нового в движке:
👉 Совместимость с KSP2
👉 Улучшена работа компилятора DI кода
👉 Улучшена генерация кода
👉 Полноценная поддержка KMP проектов
👉 Шаринг описаний зависимостей между модулями проектов
👉 Работает с Koin 4.0, Kotlin 2.0.21 и KSP 2.0.21-1.0.28
Новые фичи для разработчиков:
👉 Создание собственных аннотаций квалификаторов
👉 Автоматические биндинги
👉 ComponentScan работает сквозь Gradle модули
👉 Аннотации над ViewModel (работает с Jetpack и KMP)
@KoinViewModel
class MyViewModel(deps: Deps): ViewModel()
Ссылка без VPN
#kotlin #kmp #di #koin
Please open Telegram to view this post
VIEW IN TELEGRAM
Поддержите Koin IDE плагин на Product Hunt. Команда проделывают большую работу и точно заслуживает поддержки от сообщества!
#kotlin #koin #ide #androidstudio
#kotlin #koin #ide #androidstudio
Для Kotlin есть классный инструмент - Konsist, который позволяет писать тесты по структуре кода в проекте. Например, можно проверить, что все UseCase находятся в нужном пакете:
class UseCaseKonsistTest {
@Test
fun `every use case resides in use case package`() {
Konsist
// Задаем скоуп всего проекта
.scopeFromProject()
// Получаем все классы
.classes()
// Фильтруем классы
.withNameEndingWith("UseCase")
// Проверяем, что они находятся в нужном пакете
.assertTrue { it.resideInPackage("..domain.usecase..") }
}
}
Можно писать более сложные проверки для классов, интерфейсов, функций, свойств, Generic типов и многого другого. Надо будет использовать его для моего FrameIO.
Использовали его? Делитесь впечатлениями!
Еще не применяли? Пишите, чем может быть полезным для вашего проекта или, наоборот - нет смысла в утилите
#kotlin #архитектура
Please open Telegram to view this post
VIEW IN TELEGRAM
При разработке библиотек на Kotlin одним из элегантных решений является подход, знакомый многим по Flow из Coroutines. Его суть в том, что интерфейс содержит только базовый, фундаментальный метод, а все остальные операторы реализованы как функции-расширения.
Например, интерфейс Flow из Kotlin выглядит так:
interface Flow<out T> {
suspend fun collect(collector: FlowCollector<T>)
}
fun interface FlowCollector<in T> {
suspend fun emit(value: T)
}
Почему это хороший подход?
👉 Минимализм и ясность интерфейса. Один метод в интерфейсе ясно показывает суть контракта, облегчает понимание и поддержку.
👉 Гибкость расширения API. Можно добавлять бесконечное количество новых операторов без изменения интерфейса и нарушения обратной совместимости.
👉 Удобство и читаемость. Цепочки вызовов выглядят компактно, легко читаемы и следуют единому стилю, принятому в Kotlin.
Плюсы подхода
✅ Простое масштабирование библиотеки, благодаря гибкости Kotlin Extension-функций.
✅ Лёгкость в написании и поддержке тестов, так как расширения можно тестировать отдельно.
✅ Улучшение читаемости клиентского кода благодаря последовательной и понятной структуре вызовов.
✅ Простые и понятные API интерфейсов в типах
Минусы подхода
⚠️ Сложность в управлении видимостью и областью применения расширений. Пользователь может запутаться в большом количестве операторов.
⚠️ Ограничение на возможность переопределения методов. Расширения не переопределяются, что может осложнить кастомизацию.
Когда лучше использовать методы интерфейса вместо расширений?
Обычно в интерфейс стоит помещать:
👉 Фундаментальные методы, которые описывают самую суть интерфейса.
👉 Методы, для которых критично переопределение и которые могут требовать разных реализаций в разных имплементациях.
👉 Функции, критичные к производительности, так как их реализация через расширения иногда менее эффективна.
Когда методы стоит делать как расширения
Явными кандидатами для функций через расширения к интерфейсу - те что имеют реализацию по умолчанию и просто вызывают другие функции этого же интерфейса
interface Container {
val childCount: Int
// ❌ Не имеет смысла как функция интерфейса
fun isEmpty(): Boolean = childCount == 0
}
// ✅ Дополнительное расширение, которое не нужно как часть API интерфейса
fun Container.isEmpty(): Boolean = childCount == 0
💬 Делитесь в комментариях используете ли вы такой подход при проектирование API
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
Ключевые приоритеты разработки:
👉 Развитие возможностей языка: более высокие абстракции, лучшая производительность, более чистый код, повышение эффективности обработки данных.
👉 Kotlin Multiplatform: релиз "Kotlin to Swift Export", упрощение настройки проектов и создание KMP библиотек.
👉 Улучшение опыта сторонних контрибьюторов в экосистеме Kotlin.
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
Что нового в Kotlin за последние полгода?
👉 Поддержка отладки inline-функций в Android на уровне компилятора Kotlin
👉 Поддержка XCode 16 для KMP
👉 Публичная документация по API Kotlin Gradle Plugin
👉 Рабочая из коробки отладка для Kotlin/WASM
👉 Новое KMP API для Atomic
👉 Новые руководства для авторов библиотек
#kotlin
👉 Поддержка отладки inline-функций в Android на уровне компилятора Kotlin
👉 Поддержка XCode 16 для KMP
👉 Публичная документация по API Kotlin Gradle Plugin
👉 Рабочая из коробки отладка для Kotlin/WASM
👉 Новое KMP API для Atomic
👉 Новые руководства для авторов библиотек
#kotlin
🆕 Финализация поддержки JSpecify (подробности здесь)
🆕 Завершение поддержки компилятора K1. Переносится в категорию "Deprecated"
🆕 Перевод Kotlin/Wasm (wasm-js) в Beta
Kotlin/Wasm:
⛏️ Переключение таргета wasm-wasi в библиотеках на WASI Preview 2
⛏️ Поддержка компонентной модели
#kotlin #wasm #k1
Please open Telegram to view this post
VIEW IN TELEGRAM
В ближайшие полгода в Kotlin Multiplatform будет много интересного:
👉 Первый публичный релиз прямого экспорта Kotlin в Swift (возможно, сторонние плагины для этого больше не понадобятся).
👉 Включение по умолчанию Concurrent Mark and Sweep (CMS) GC (быстрее и эффективнее).
👉 Реализация нового поколения формата распространения KMP библиотек (упрощение формата в фокусе).
🔥 Возможность объявлять зависимости KMP проектов в блоке dependency на уровне проекта, а не в DSL Kotlin плагина.
👉 Унификация работы inline функций между всеми стабильными таргетами (сейчас есть отличия в JVM).
👉 Включение инкрементальной компиляции klib артефактов по умолчанию.
👉 Стабилизация кросс-компиляции klib на разных платформах, что улучшит опыт разработчиков, работающих не на Mac.
У KMP даже есть свой дорожная карта разработки.
#kotlin #kmp
👉 Первый публичный релиз прямого экспорта Kotlin в Swift (возможно, сторонние плагины для этого больше не понадобятся).
👉 Включение по умолчанию Concurrent Mark and Sweep (CMS) GC (быстрее и эффективнее).
👉 Реализация нового поколения формата распространения KMP библиотек (упрощение формата в фокусе).
🔥 Возможность объявлять зависимости KMP проектов в блоке dependency на уровне проекта, а не в DSL Kotlin плагина.
👉 Унификация работы inline функций между всеми стабильными таргетами (сейчас есть отличия в JVM).
👉 Включение инкрементальной компиляции klib артефактов по умолчанию.
👉 Стабилизация кросс-компиляции klib на разных платформах, что улучшит опыт разработчиков, работающих не на Mac.
У KMP даже есть свой дорожная карта разработки.
#kotlin #kmp
👉 Поддержка Gradle Project Isolation (подробнее об этой функции здесь)
👉 Улучшение отчетов по компиляции Kotlin
👉 Поддержка Declarative Gradle
👉 Улучшение интеграции инструментов Kotlin/Native в Gradle
👉 Выпуск стабильных аргументов компилятора в Gradle DSL для упрощения конфигурации проектов на Kotlin и KMP
#kotlin #gradle
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Для каких задач вы используете Kotlin?
Anonymous Poll
79%
Разработка только под Android
22%
Разработка Backend системы
4%
Разработка только под Desktop
31%
Разработка под несколько платформ на KMP
10%
Написание скриптов (не Gradle KTS)
2%
Другое применение (делитесь в комментариях)
2%
Не пишу на Kotlin
4%
Не участвую в опросе