Kotlin Multiplatform Broadcast
9.68K subscribers
889 photos
55 videos
1.22K links
Новости и фичи Kotlin, а также Kotlin Multiplatform

YouTubе канал: https://youtube.com/androidBroadcast
Compose Multiplatform @compose_broadcast
iOS разработка @ios_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
🏝 Что сделали в Kotlin за последние 6 месяцев (с августа 2025 по февраль 2026):

Компилятор:
JSpecify support (null-safety в интеропе с Java)
K1 компилятор deprecated (K2 теперь основной)
Kotlin/Wasm Beta

Мультиплатформа:
CMS GC by default (производительность)
KMP IDE plugin на Windows и Linux
Compose for Web в Beta
Compose Hot Reload в Stable

Инструменты:
K2 mode вIDEA теперь основной режим
Улучшение импортов (IDE работает быстрее)
NPM publishing для JS/Wasm артефактов
Улучшили опыт разработки под Kotlin/Wasm в IDEA

Экосистема:
OpenAPI для Ktor
WebRTC client в Ktor
Exposed 1.0.0 (работа с БД)
Поддержка R2DBC в Exposed

#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥10👎1🤔1
🏝 kotlinx.collections.immutable будут стабилизировать в ближайшие полгода

После долгих лет в experimental статусе, JetBrains планируют стабилизировать kotlinx.collections.immutable. Добавят новые типы (PersistentOrderedSet, PersistentHashSet), улучшат API, документацию. Может вовсе стоит их сделать частью stdlib ?

Это долгожданная новость. Но вот интересный вопрос: нужна ли она вообще сейчас?

Immutable collections были критичны для Compose, потому что помогали избежать рекомпозиций. Но потом пришел Strong Skipping Mode в Compose. И теперь Compose намного умнее в том, что перерисовывать и что нет. Нужна ли immutable collection для этого теперь? Я честно не знаю ответ. 🤷

Потому что вопрос к вам:
👉 Кто сейчас юзает immutable collections в Compose проектах? Зачем?
👉 Помогает ли это производительности, или это уже не нужно?
👉 Где вы их юзаете еще, кроме Compose?
👉 А может быть, наоборот, нужны еще больше?

💬 Пишите в комментариях — помогите разобраться

#Kotlin #KotlinX #Compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍233🙏2👎1
🏝 Kotlin stdlib будут поддерживаться 18 месяцев

JetBrains будет поддерживать новые версии Kotlin Stdlib на протяжении 18 месяцев. Это значит: если ты обновился на какую-то версию Kotlin — JetBrains гарантирует исправления уязвимостей и критические баги для этой версии. Потом можешь обновляться, когда будешь готов.

Кому это вообще нужно? Командам кто не гонится за новыми фичами и обновлениями. Новая версия выходит, а с ней баги или непредсказуемое поведение:
👉 Tooling не подтянулся
👉 Просто нет времени на большое обновление
👉 У вас внешние требования и надо всё перепроверять перед обновлением

‼️ Это важный сигнал - Kotlin взрослеет и становится более production-ready в другом смысле. Kotlin 1.X был про "новые фишки каждую версию". Версии 2.X это про стабильность. JetBrains готовы поддерживать долгую версию — исправления уязвимостей, критические баги, без принуждения обновляться на новые версии языка.

Это как Java с LTS-версиями. Есть гарантии и предсказуемость, что важнее новых фичей.

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👎9👍5🤔2
This media is not supported in your browser
VIEW IN TELEGRAM
🐱 TwoFac - KMP приложения двухэтапной верификации, которое написано активно при использовании AI

По дизайну - копия Google Authenticator на основе Material 3.

#OpenSource #KMP #Android #IOS #Desktop
Please open Telegram to view this post
VIEW IN TELEGRAM
👎86👍6🔥2
🤯 «Если работает — какая разница, что там внутри» — так думает любой менеджер. Посмотрите на свой стек: сколько там софта, на который вы постоянно жалуетесь? Я видел десятки приложений с сомнительными решениями, тяжёлой поддержкой и горами легаси, но ведь работает и деньги приносит. Смартфоны становятся мощнее и вытягивают это всё, а до бюджетников большинству разработчиков просто нет дела.

Я не оправдываю утверждение «писать говнокод — это нормально». Конечно нет! Но бизнесу, который за всё это платит, важно одно: чтобы работало и приносило деньги.

Руками писали плохой код — ИИ тоже пишет плохой код. Проблема не в инструменте, а в том, кто его использует. Инструментом нужно учиться пользоваться, правильно его настраивать. Но у ИИ есть особая опасность: низкий порог входа. Взял, запустил, что-то получилось — и понеслось. Это открывает дверь для людей без достаточной квалификации, которые даже не понимают, что именно они сгенерировали.
💯6711🔥4👎2
🗓28 марта в 12:00 по МСК пройдет Я.Субботник по JVM-языкам — митап Яндекса для разработчиков и инженеров, работающих с языками Java Virtual Machine

Встречаемся в московском офисе Яндекса, чтобы вместе с JVM-сообществом обсудить практический опыт, новые подходы и реальные задачи индустрии в неформальной атмосфере.

В программе:

Андрей Кулешов, руководитель отдела разработки в Yandex Infrastructure, расскажет, как Java-фреймворки ускоряются на примере Quarkus. Узнайте, почему Quarkus стартует быстро даже без GraalVM, что именно делает ArC (как имплементация CDI), и при чём здесь Gizmo/ASM и индексирование классов через Jandex.

Дмитрий Некрылов, бэкенд-разработчик в Yandex Robotics, разберет, как устроен трассирующий профайлер на примере Qubership Profiler — инструмента для детального анализа производительности отдельных вызовов.

Всеволод Жолобо, разработчик в Финансовом департаменте Яндекса, выступит с разбором реальных продакшен-багов, которые произошли из-за неправильной работы со временем в Java, и объяснит,почему они вообще возможны.

Все доклады и активности можно найти на сайте. Если не сможете приехать, подключайтесь онлайн.

➡️Регистрируемся тут.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42👎1🔥1
🏝 Вышел стабильный Decompose 3.5.0 — KMP-библиотека для навигации и декомпозиции UI с управлением жизненным циклом.

‼️ Главное в этом релизе — перевод в стабильный статус фичи Duplicate Configurations. Теперь Child Stack и Child Pages официально поддерживают дублирующиеся конфигурации. По умолчанию отключено, включается через DecomposeSettings.

👉 Тип Child#key изменён с Any на String — это breaking change, но нужный. Раньше иногда падало с Key XYZ was used multiple times в Compose. Теперь ключ можно использовать напрямую как Compose key без лишних приседаний.

👉 Новый DecomposeSettings API собирает глобальную конфигурацию в одном месте. Настроить можно через update {}:

// Инициализация в точке входа (Application / main)
DecomposeSettings.update { settings ->
settings.copy(
duplicateConfigurationsEnabled = true,
mainThreadCheckEnabled = false,
onDecomposeError = { error -> Timber.e(error) }
)
}


👉 Из остального: поддержка per-child аниматоров в Child Panels, новые ChildPages composable с доступом к PagerState, улучшенный handleDeepLink с дополнительными параметрами, Compose обновлён до 1.9.3.

#KMP #Kotlin #Decompose
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32👍5👎4🎉1
🏝 Вышел Kotlin 2.3.20

👉 Name-based destructuring — пожалуй, самое интересное. Раньше деструктуризация работала по позиции через componentN(), и если порядок полей в data class не совпадал с переменными — получали молчаливый баг. Теперь можно явно привязать переменную к имени свойства. Пока это Experimental, включается через -Xname-based-destructuring. Жду когда дойдёт до Stable.

👉 Поддержка Gradle 9.3.0. Плюс Kotlin/JVM теперь по умолчанию использует Build Tools API при компиляции. Тихое, но важное изменение для тех, кто следит за тулингом.

👉 Kotlin/Native получил новый экспериментальный режим интероперабельности с C/ObjC — призван решить проблему совместимости KMP-библиотек между версиями компилятора. Если используете cinterop — стоит попробовать и оставить фидбек.

🔗 Больше подробностей в "What's new"

#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍9👎2
🏝 Name-based destructuring в Kotlin 2.3.20

Destructuring Declarations - несамая популярная фича в Kotlin. На мой взгляд, её привязка к порядку декларации свойств делает его очень ненадёжной. Теперь же можно будет делать привязку "имя - имя" помимо "имя - позиция":

data class User(val username: String, val email: String)
val user = User("alice", "alice@example.com")
// Было
val (email, username) = user
// Стало
(val mail = email, val name = username) = user


Фича экспериментальная и требует включения через опции компилятора
// build.gradle.kts
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xname-based-destructuring=only-syntax")
}
}


🔗 Подробности в документации

#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31🤔18👍6
🏝 То чего так долго ждали в Kotlin 2.3.20 - копирование элемента Map, да еще и в экспериментальном режиме (уффф, не дай бог что сломает)

@OptIn(ExperimentalStdlibApi::class)
fun main() {
val map = mutableMapOf(
1 to 1,
2 to 2,
3 to 3,
4 to 4
)

val toRemove = map.entries
.filter { it.key % 2 == 0 }
.map { it.copy() }

map.entries.removeAll(toRemove)

println("map = $map")
// map = {1=1, 3=3}
}


#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯34🔥9🤔8🏆3
🏝 Вышел Koin 4.2.0

Вышел стабильный Koin 4.2.0 — изменений ощутимо больше, чем обычно в минорных релизах. Kotlin 2.3.20 внутри и несколько новых модулей.

Что появилось:

🏝 Ktor 3.4 DI Bridge — двунаправленная интеграция между Ktor DI и Koin. Если используете Ktor на бэке или в KMP-проекте — теперь зависимости резолвятся в обе стороны без лишних танцев

💉 koin-dagger-bridge — новый модуль для тех, у кого смешанный проект и часть уже сидит на Dagger. Можно инжектить Koin-компоненты со стороны Dagger. Редкий сценарий, но кому надо — поймут ценность

⚙️ AndroidX Navigation3 — полноценная поддержка Navigation3 1.0.1: EntryProvider с передачей метаданных (анимации и прочее), generic EntryProvider, навигационные скоупы. Плюс скоупированная навигация теперь есть и для классического Compose Nav 2

🚀 Производительность — параллельная загрузка lazy-модулей при старте, оптимизация ThreadLocal на уровне скоупов.

👉 strictOverride — новая опция для явного переопределения дефиниций. Раньше override был неявным, теперь можно сделать это контролируемым

🤖 koinActivityInject() — хелпер для получения зависимостей из скоупа Activity напрямую

‼️ Breaking: минимальный API level поднят до 23 (Android 6.0). Также изменился конструктор BeanDef.

На мой взгляд, Dagger Bridge и поддержка Navigation3 — самые интересные новинки. Первый открывает путь к постепенной миграции с Dagger, второй закрывает ожидаемый пробел для тех, кто уже на новом стеке навигации.

🐱 Release Notes

#Kotlin #KMP #DI #Koin #AndroidDev #Compose #AndroidJetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥10👎5
🐱 Небольшая KMP-библиотека kotlinx-datetime-fun, которая закрывает многословность стандартного kotlinx.datetime extension функциями.

// Парсинг с кастомным форматом
val date = "11/15/2024".toLocaldate("MM/dd/yyyy")

// Вместо plus(n * -1, DateTimeUnit.DAY)
val yesterday = date.minusDays(1)

// Готовые утилиты
val isWeekend = LocalDate.today().isWeekend()
val nextMonday = LocalDate.nextMonday()


До 1.0 ещё далеко, но для KMP-проекта подключить и не писать одни и те же хелперы в каждом модуле — звучит разумно.

#Kotlin #KMP #Android #AndroidDev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍39👎11🥰2
🏝 Kotlin Agent Skills: официальный репозиторий навыков для ИИ-агентов

JetBrains открыли официальный репозиторий kotlin-agent-skills с готовыми скиллами для ИИ-агентов. Появился он не просто так: стандарт Agent Skills набирает обороты, и у команды Kotlin явно есть что сказать своему агенту насчёт Kotlin-специфики.

Если коротко, скилл это папка с SKILL.md внутри. В файле YAML-шапка с именем и описанием, а дальше инструкции для агента. Claude, Copilot, Junie и другие поддерживающие инструменты загружают их по необходимости, не загромождая контекст лишними токенами.

AGP 9 Migration (kotlin-tooling-agp9-migration). Это первый и пока основной скилл. Помогает агенту правильно провести проект через изменения Android Gradle Plugin 9.0 в Kotlin/KMP проектах.

Сейчас определены две категории: backend для серверной разработки на Spring и JPA, и tooling для инструментов сборки. Судя по открытым PR, скоро появятся новые.

Я сам активно использую скиллы в работе с Claude Code, в том числе пишу под свои проекты. Это действительно удобно: один раз описал соглашения или специфику библиотеки и агент их подхватывает сам, без ручного объяснения каждый раз. Посмотрим, насколько активно JetBrains будут наполнять этот репозиторий.

#Kotlin #KMP #Android #AI
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41👎5
🏝 SwiftPM-зависимости теперь можно подключать прямо в KMP модуль

JetBrains опубликовали документацию по экспериментальной фиче: импорт Swift Package Manager пакетов прямо из build.gradle.kts KMP модуля.

// build.gradle.kts
kotlin {
iosArm64()
iosSimulatorArm64()

// Настраиваем зависимости
swiftPMDependencies {
swiftPackage(
url = url("https://github.com/firebase/firebase-ios-sdk.git"),
version = from("12.5.0"),
products = listOf(product("FirebaseAnalytics")),
)
}
}


После синка импортируешь API в iosMain через неймспейс swiftPMImport.<group>.<module>:

import swiftPMImport.groupName.subproject.FIRAnalytics
import swiftPMImport.groupName.subproject.FIRApp


Что ещё поддерживается:

👉 Версии в стиле Package.swiftfrom(), exact(), branch(), revision()
👉 Локальные пакеты с диска через localSwiftPackage()
👉 Платформенные ограничения — например, Google Maps только для iOS, даже если проект таргетит macOS

Фича работает на dev-версии Kotlin `2.3.20-titan-222`, в продакшен не годится. Экспорт KMP модуля обратно как Swift-пакета пока не поддерживается.

🔗 Источник: kotlinlang.org

#KMP #Kotlin #iOS #SPM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍47👎1
🏝 Вышла первая бета Kotlin 2.4.0. Коротко по фичам:

👉 Context parameters стабильны
👉 Stable: новые возможности для annotation use-site targets
👉 Experimental: явные context arguments — теперь можно явно указать контекст при вызове перегруженной функции
👉 Поддержка Java 26
👉 Аннотации в Kotlin metadata включены по умолчанию — annotation processors могут работать с ними без рефлексии
👉 Swift packages как зависимости в KMP через Gradle
👉 Intra-module inlining при компиляции в .klib включён по умолчанию для Native/JS/Wasm

🔗 Источник kotlinlang.org

#Kotlin #KMP
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍29👎1
🏝 Context Parameters стали Stable

В сегодняшнем бета-релизе Kotlin 2.4 context parameters получили статус Stable. Флаг -Xcontext-parameters больше не нужен.

Фича позволяет объявить зависимость функции от контекста, не передавая её явным параметром через всю цепочку вызовов. Компилятор смотрит, какой тип доступен в текущем скоупе, и подставляет его сам:

context(logger: Logger)
fun fetchUser(id: String): User {
logger.log("Fetching $id")
return api.getUser(id)
}


Никакой магии нет — context parameters компилируются в обычные параметры функции, которые идут первыми в сигнатуре. Весь резолвинг происходит на этапе компиляции, в рантайме это просто обычный вызов метода. Ноль overhead.

// Что реально генерирует компилятор
fun fetchUser(logger: Logger, id: String): User


У меня возник вопрос: "зачем нужны context paramter при наличии extension function". Ext fun расширяет API типа, this внутри это и есть ваш тип. Context parameter в функции требует тип для работы, но не является его частью. Разница становится очевидной, когда зависимостей несколько:

// Extension с несколькими зависимостями выглядит натянуто
fun Logger.fetchUser(analytics: Analytics, db: Database, id: String): User

// Context parameters читаются как декларация зависимостей
context(logger: Logger, analytics: Analytics, db: Database)
fun fetchUser(id: String): User


Extension function не может быть расширением сразу нескольких типов одновременно, context parameters этого ограничения не имеют.

❗️Callable references через context parameters пока остаются экспериментальными

🔗 Подробнее kotlinlang.org

#Kotlin #KMP #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54👎8
🔐 Вышла cryptography-kotlin 0.6.0 с кучей новых алгоритмов и нормальной документацией.

Эта Kotlin Multiplatform обёртка над OpenSSL, CryptoKit, WebCrypto и JDK — на каждой платформе юзаешь нативный провайдер, но API один. Полезна когда криптография должна работать везде.

В 0.6.0 добавили EdDSA (Ed25519, Ed448), XDH (X25519, X448), ChaCha20-Poly1305, Diffie-Hellman, DSA и несколько вариантов AES. Теперь подписываешь и шифруешь на всех основных алгоритмах. JWK encoding тоже есть для RSA, ECDSA, XDH и EdDSA, плюс API для вывода публичного ключа из приватного.

Документация пересобрана с нуля и теперь полноценно описывает всё.

Есть breaking changes в интерфейсах Key, EncodableKey и связанных с ними

#Kotlin #KMP #Безопасность
👍44👎1
🐱 WiretapKMP = Chucker + Wormholy + мокинг — в одной KMP-библиотеке.

WiretapKMP закрывает сценарий мониторинга сетевых запросов, который раньше требовал двух отдельных инструментов: Chucker на Android и Wormholy на iOS. Одна библиотека, один инспектор, работает без прокси-сервера.

Подключается через плагин под ваш HTTP-клиент:
👉 wiretap-ktor — Android, iOS, JVM
👉 wiretap-okhttp — Android, JVM
👉 wiretap-urlsession — iOS (Swift)

Из коробки пишет HTTP и WebSocket трафик: URL, заголовки, тела запросов и ответов, статус-коды, тайминги, детали TLS. UI на Compose Multiplatform, адаптивный — на планшете и десктопе раскрывается в list-detail.

Для продакшена предусмотрены noop-варианты: wiretap-ktor-noop вместо wiretap-ktor — никакого оверхеда, никакого условного кода.

🐱 GitHub wiretapKMP

#KMP #Kotlin #AndroidDev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35👎3
🚀 Скидки до -20% в Ergostol до 19 апреля 🚀

Если честно, я быстрее всего «ломаюсь» не от задач, а от того, что весь день в одной позе. Поэтому я прям топлю за вещи, которые помогают телу пережить рабочие марафоны.

Стол регулируемый Terra R 2.0 - Очень спасает, когда надо то сидеть, то вставать: и спина "спасибо" говорит, и голова чуть лучше варит.
Встраиваемая беспроводная зарядка Ergostol AirCharge - У меня вечная история: кабель «куда-то делся», телефон на 3% и начинается суета. Встроенная зарядка — это реально про спокойствие и порядок на столе.

➡️ Кто тоже хочет обновить рабочее место - самое время!

💲С промокодом ANDROID10ещё –10% на все столы и опции к ним!
P.S: Так же специально для моих подписчиков промокод действует и на Ozon 🛒

Реклама. ООО «СОФТЭФФЕКТ». ИНН 7735575262
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👎5
🏝 kotlinx.serialization 1.11.0 добавляет кое-что, о чём давно просили в контексте GDPR и логирования: теперь можно запретить библиотеке включать пользовательский JSON в текст исключений.

Новый флаг exceptionsWithDebugInfo в JsonConfiguration управляет этим поведением. По умолчанию сейчас true, то есть поведение старое: в сообщении исключения виден весь входящий JSON. Выставить в false — и пользовательские данные из логов исчезают. Важный момент: когда свойство станет стабильным, дефолт сменится на false. То есть это тихая breaking change в будущем — стоит держать в голове.

Второе изменение — публичный API исключений. JsonException, JsonDecodingException и JsonEncodingException теперь открыты для прямой работы: у них появились публичные свойства shortMessage, path, offset. Это удобно для REST API — можно вернуть клиенту структурированный ответ об ошибке парсинга вместо того, чтобы парсить строку сообщения вручную. API пока experimental.

Релиз основан на Kotlin 2.3.20.

🔗 Release Notes

#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24👎2