Kotlin Multiplatform Broadcast
9.5K subscribers
841 photos
52 videos
1.14K links
Новости и фичи Kotlin, а также Kotlin Multiplatform

YouTubе канал: https://youtube.com/androidBroadcast
Compose Multiplatform @compose_broadcast
iOS разработка @ios_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
🏝 Kotlin 2.2.10 на шаг ближе - вышла RC2

Стандартное обновление версии языка с исправлением багов релиза X.X.0. Поправили ещё багов.

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥21
❗️Как проверять структуру Kotlin-кода на соответствие архитектуре и неймингу

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

Для Kotlin такую задачу отлично решает библиотека Konsist. Проверки в ней выглядят как обычные Unit-тесты (поддерживается несколько тестовых JVM движков).

Например, в одном из проектов я добавил правила:
👉 Все классы, чьи имена заканчиваются на ViewModel, должны наследоваться от ViewModel (к сожалению, заставить использовать именно Jetpack ViewModel не получилось).
👉 Все свойства с типом MutableStateFlow<*> должны быть недоступны за пределами класса.
private var viewModels: List<KoClassDeclaration> = emptyList()

@BeforeTest
fun setup() {
// Собираем все классы, чьи имена оканчиваются на ViewModel
viewModels = Konsist
.scopeFromProject()
.classes()
.withName { name -> name.endsWith("ViewModel") }
}

@Test
fun `Every ViewModel class extends from 'ViewModel'`() {
viewModels.assertTrue { viewModel ->
viewModel.hasParentWithName("ViewModel", indirectParents = true)
}
}

@Test
fun `MutableStateFlow properties in ViewModel are not visible outside`() {
viewModels
.properties()
.filter { property ->
property.hasType { type ->
type.hasNameMatching(Regex("MutableStateFlow<\\w+>"))
}
}
.assertTrue { property ->
property.hasPrivateModifier || property.hasProtectedModifier
}
}


Правила можно делать любой сложности — от проверки нейминга до соответствия архитектуре.
Всё это запускается как обычные JVM-тесты и выполняется достаточно быстро ⚡️

❗️ konsist пока не достиг версии 1.0 но активно идёт к ней! Работает исправно и позволяет масштабировать правила структуры кода на всё команду!

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍45🔥142
🤯 Как Google делает Android-библиотеки мультиплатформенными 🚀

Разбирая исходники Navigation 3 я наткнулся на необычную папку в KMP-проекте — jvmStubsMain.

src
├── commonMain
├── androidMain
└── jvmStubsMain


Внутри — только методы, которые либо возвращают значения по умолчанию, либо сразу выбрасывают исключения. Сборка под desktop из этого не получится, да и авторы такую цель не ставили. Возникает логичный вопрос: зачем тогда эта папка нужна? 🤔


🏝 Особенность KMP

В Kotlin Multiplatform папка commonMain содержит код, доступный всем таргетам.

Например:
👉 Если у проекта есть Android и iOS таргеты, в commonMain можно писать только чистый Kotlin + мультиплатформенные API.
👉 Но если оставить только Android-таргет, в commonMain внезапно станет доступен весь Android SDK 🤯 — что для меня было сюрпризом.


❗️ Зачем нужен jvmStub

Добавление таких stub-таргетов в Android-библиотеках помогает искусственно ограничить доступ к платформенным API в commonMain.

Почему это работает:
👉 У JVM и Android в KMP нет общего родителя в стандартной иерархии source sets (хотя платформы имеют много общего).
👉 Stub-реализации позволяют “отсечь” случайное попадание Android API в общий код.
👉 Это помогает держать код в commonMain чистым и переиспользуемым — вдруг завтра вы захотите добавить desktop или другую платформу.

💡 jvmStubsMain — это инструмент архитектурной дисциплины. Он не предназначен для полноценной JVM-сборки, но отлично помогает не тянуть Android-зависимости в общий код и сделать чистую арзитектуру


#kotlin #kmp #android #google
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍741🙏1
🏝 Вышел Kotlin 2.2.10 с исправлением багов в версии 2.2.0. Самое время обновиться и проверить всё ли работает у вас

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍5🎉4
Пока вы спали Google выпустила версию KSP, совместимую с Kotlin 2.2.10. Обновляйтесь до версии 2.2.10-2.0.2 и свежий Kotlin

#kotlin #ksp
🎉36👍3
🏝 KMP на Aurora ОС уже тут

Если вам интересно попробовать KMP под Аврора ОС, то вы можете сделать это. Наработки открыты в официальном репе: примеры, библиотеки, документация и QT биндинги.

Работа Kotlin кода на Аврора ОС происходит через нативный код под Linux таргет.

Адаптация Compose для Аврора идёт полным ходом и будет доступно в 2026 году. Я видел запущенный пример простого Compose приложения, и текущий статус работ вселяют большую уверенность в хорошем результате!

То что разработчики ОС стали делать фокус на популярных в мобильном сообществе инструментах - большой плюс. Уже есть Flutter для Аврора ОС, скоро будет еще возможность работать с KMP + Compose. Это явно даст буст для ускорения переноса существующих приложений и кодовой базы.

#kotlin #compose #auroraos
Please open Telegram to view this post
VIEW IN TELEGRAM
31🤔16🔥15
🤯 Какой AI лучше для написания Kotlin кода (спойлер - GPT5)

Ребята из Firebender (позиционируют свой продукт как Cursor для Android Studio) сделали Kotlin-bench - специализированный бенчмарк, который проверяет LLM и AI агентов на 100 реальных задачах для Kotlin и Android разработки.

Причина разработки - AI инструменты для Kotlin и Android по сравнению с fullstack и Python разработкой развиты хуже.

Результаты вполне ожидаемые - лидерами стали последние поколения доступных моделей: GPT-5 с отрывом от Claude Sonnet 4. Хотелось бы увидеть оценку Qwen Code, но её в бенчмарк не включили.

Подробнее с результатами можно ознакомиться тут. Анонс и методология в анонсе

#android #kotlin #ai
🤔26👍92🤯1
🏝 Конфигурация Gitlab CI на Kotln DSL наааадаа ?

Стокнулся с open source проектом для возможности конфигурирования Gitlab CI через Kotlin DSL вместо YAML.

// Пример конфигурации
// Файл .gitlab-ci.main.kts в корне проекта
#!/usr/bin/env kotlin

@file:DependsOn("dev.opensavvy.gitlab:gitlab-ci-kotlin-jvm:VERSION-HERE") // See https://gitlab.com/opensavvy/automation/gitlab-ci.kt/-/releases

import opensavvy.gitlab.ci.*
import opensavvy.gitlab.ci.script.*

val pipeline = gitlabCi {
val test by stage()

val helloWorld by job(stage = test) {
script {
shell("echo 'Hello world'")
}
}
}

pipeline.println()


Я конечно люблю Kotlin, но вот не везде он нужен и может только усложнить всё. YAML файлы прекрасно подходят для описания конфигурации, без лишних сложный конструкций и свободы. Всё четко и под делу!

На ваш взгляд, где будет удобно применение Kotlin помимо разработки приложений?

#kotlin #gitlab

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🤔101🔥1
🏝 Полное текстовое руководство (EN,16м) про OrbitMVI - просто MVI фреймворк для Kotlin Multiplatform с поддержкой Android, iOS и JVM Desktop.

// Пример OrbitMVI
class CalculatorViewModel: ContainerHost<CalculatorState, CalculatorSideEffect>, ViewModel() {

// Include `orbit-viewmodel` for the factory function
override val container = container<CalculatorState, CalculatorSideEffect>(CalculatorState())

fun add(number: Int) = intent {
postSideEffect(CalculatorSideEffect.Toast("Adding $number to ${state.total}!"))

reduce {
state.copy(total = state.total + number)
}
}
}



#kmp #mvi #android #ios #desktop
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17🤔9👍52
🏝 Обновление Kotlin Roadmap - Август 2025

Команда Kotlin обновляет дорожную карту каждые полгода, подводя итоги и планируя следующие шаги:

Compose Multiplatform
👉 Перевести Compose Multiplatform for Web в Beta
👉 Выпустить больше Jetpack библиотек для KMP. В первую очередь Navigation 3 и Paging 3
👉 Новый компонент для ввода текста на iOS с целью чтобы сделать его максимально нативным по виду и поведению
👉 Унификация Compose Preview аннотации (сейчас их 3 с разными пакетами)

Kotlin Multiplatform IDE плагин
👉 Поддержка работы плагина на Windows и Linux, но там не будет поддержки работы со Swift и сборки под Apple платформы
👉 Возможность просмотра документации подключенных Swift/Obj-C библиотек
👉 Поддержка Swift 6.2 и Xсode 2026
👉 Улучшение навигации и рефакторинга кросс языков
👉 Улучшение работы Compose Preview в common

Kotlin/Native и Kotlin/iOS
👉 Развитие Swift Export и стабильный релиз в 2026 году
👉 Поддержать Kotlin Coroutines и Flow в Swift Export
👉 Сокращение времени сборки

Kotlin/JS
👉 Автоматическое переключение на Kotlin/JS для Compose for Web, когда WASM таргет не работает
👉 Расширение возможностей JavaScript Export: suspend функции, value классы, typealias и другие

Kotlin/WASM
👉 Релиз Kotlin/WASM Beta
👉 Поддержка многомодульной компиляции для динамической загрузки

Инструменты для сборки
👉 Сделать конфигурацию Gradle сборки удобнее
👉 Упростить публикацию KMP библиотек
👉 Предоставление Build tools API для удобства интеграции с разными билд системами
👉 Ускорение сборки и процесса импорта проекта в Gradle

#kotlin #compose #wasm #ios #native #gradle #idea #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥38👍64
readline4k - Kotlin/Native библиотека для разработки консольных интерактивных приложений для Desktop

val history = "history.txt" // Filesystem path to the history file.

// Configure the LineEditor.
val config = LineEditorConfig(
maxHistorySize = 100,
completionType = CompletionType.LIST,
// See the documentation for more options.
)

// Create a new LineEditor instance.
val editor = SimpleLineEditor(
linePrefix = "> ",
config = config,
).also { editor ->
// Set up the completer and highlighter.
editor
// Provides file completion (optional).
.withCompleter(SimpleFileCompleter())
// Provides color highlighting (optional).
.withHighlighter(SimpleHighlighter())

// Load the history from the disk (throws LineEditorError if it fails).
editor.loadHistory(history).getOrThrow()
}

println("Welcome to the LineEditor example!")
println("Press Ctrl+C to exit")

while (true) {
// Read a line from the user.
editor.readLine()
.onFailure { err ->
// err is a LineEditorError
println(err.message)
break

}
.onSuccess { line ->
// We can also add the line to the history
// automatically by setting autoAddHistory = true in the config.
editor.addHistoryEntry(line)
println(line)
}
}

// Save the history to disk.
editor.saveHistory(history)


#kotlin #native #cli
👍23
‼️ Упрощённый и быстрый: Google выпустила специальный плагин для Android-таргетов в KMP

Google анонсировала официальный Gradle-плагин com.android.kotlin.multiplatform.library для настройки Android-таргета в Kotlin Multiplatform (KMP). Это станет стандартом для будущей разработки KMP-библиотек.

➡️ Зачем нужен отдельный плагин?

🚀Скорость и стабильность: Повышение скорости сборки и улучшение работы кэша.
🔨 Улучшенная IDE-интеграция: Более гладкая работа с Android Studio.
🛠 Простота конфигурации: Упрощение настройки KMP-проектов под Android в Gradle.

⚖️ Чем отличается от обычного com.android.library?

Новый плагин заточен именно под библиотеки и лишён избыточных функций:
Нет поддержки множественных вариантов сборки (productFlavors)
Нет поддержки C/C++, AIDL, RenderScript
Нет встроенных возможностей View Binding, Data Binding
Тесты и Android-ресурсы отключены по умолчанию
Компиляция Java отключена по умолчанию (но есть опция включения)

// Пример конфигурации в Gradle Kotlin DSL
plugins {
alias(libs.plugins.kotlin.multiplatform) // Kotlin 2.0+
alias(libs.plugins.android.kotlin.multiplatform.library) // AGP 8.10+
}

// Такого DSL больше не будет для Android KMP библиотеки
android {}

kotlin {
androidLibrary {
namespace = "dev.androidbroadcast.kmplib"
compileSdk = 36
minSdk = 24

enableAndroidResources = true // Включение ресурсов
withJava() // Включение Java

// Настройка тестов для хоста (JVM)
withHostTestBuilder { }

// Настройка инструментальных тестов на устройстве
withDeviceTestBuilder {
sourceSetTreeName = "test"
}

compilations.configureEach {
compilerOptions.configure {
jvmTarget.set(JvmTarget.JVM_21)
}
}
}

sourceSets {
androidMain { ... }
androidHostTest { ... }
androidDeviceTest { ... }
}
}


💬 Что думаете о новом плагине? Уже успели попробовать? Делитесь мнением в комментариях!

#android #kmp #kotlin #gradle #news
Please open Telegram to view this post
VIEW IN TELEGRAM
🏆27🎉10👍5🤔3
🏝 Вышел Kotlin 2.2.20

Что нового:
👉 Улучшили определение перегрузок методов с suspend лямбдами
👉 Kotlin-to-Swift export доступен по умолчанию
👉 Шаринг кода между JS и wasmJS таргетами
👉 Стабильная кроссплатформенная компиляция для Kotlin библиотек
👉 Таргет Kotlin/WASM перешел в статус Beta
👉 Kotlin/Native: Поддержка stack canaries в бинарних для меньшего размера итого бинарнки
👉 Прокачали возможности Kotlin Contracts: поддержка Generic, возможность использования в get/set функция property, новые контракты

Много всего полезного, буду рассказывать отдельно по мере изучения

#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
20👍5
🏝🦢 Чтобы попробовать Kotlin-to-Swift экспорт надо изменить Gradle таск, вызываемый при сборки XCFramework в iOS.

embedAndSignAppleFrameworkForXcode -> embedSwiftExportForXcode

./gradlew :<Shared module>:embedSwiftExportForXcode


Флаг kotlin.experimental.swift-export.enabled можно удалить из gradle.properties, потому что c версии Kotlin 2.2.20 фича включена по умолчанию

‼️ ВАЖНО. Пока не поддерживаются все фичи Kotlin (например, трансляция suspend функций во что-то удобное на Swift). Будут доработки в будущих версия Kotlin (минорных и мажорных)

#kotlin #xcode #swift #kmp
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍6
Forwarded from Compose Broadcast
‼️ Опубликовали первую сборку Navigation3 для Compose Multiplatfom

Подкючайте артефакт org.jetbrains.androidx.navigation3:navigation3-ui:1.0.0-alpha01 в common код и можете пробовать

Ждем актуализации до свежей альфа версии, а также адаптивные layout и интеграцию с ViewModel

#compose #kmp #naviation #jetpack
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥28👍6🤔4