Forwarded from Kotlin Multiplatform Broadcast
Koin неплохой DI, но jncencdbt compile time вадлидации не позволял его спокойно использовать в любом большом проекте как тот же Dagger 2. Пропустил зависимость — узнаешь в продакшене. Плагин меняет это фундаментально: если проект собрался, граф валиден. Никакого
checkModules() в тестах, никакого verify() как костыля.Технически плагин работает на уровне FIR + IR, то есть раньше KSP в пайплайне компилятора. Нет генерируемых файлов, нет отдельного тулчейна. DSL и аннотации работают вместе через один плагин.
Три уровня валидации:
👉 каждый модуль отдельно — проверяются определения и их видимость
👉 полный граф при
startKoin<T>() — A3-валидация👉 call-sites — когда feature-модуль вызывает
koinViewModel<T>(), плагин генерирует подсказки, которые app-модуль проверяет при своей сборке⚠️ Сейчас это RC-стадия: Koin 4.2.0-RC1, плагин 0.3.0, требует Kotlin 2.3.20-Beta1. На прод пока не стоит, но попробовать на уже можно так как влияния на продакшен код нету!
Моя библиотека Koin Detekt Rules теперь просто станет не нужна, хотя лучшие практики и форсирование подходов никто не отменял.
🔗 Анонс в блоге
#Koin #Android #DependencyInjection
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
Идея простая: вместо того чтобы объяснять агенту контекст каждый раз руками, ты даёшь ему готовый SKILL.md — файл со структурированными инструкциями, шагами и справочными материалами по конкретной задаче. Агент читает его как спецификацию и работает точнее.
Это следует открытому стандарту agentskills.io, то есть формат не завязан на один инструмент — подходит для Claude Code, Cursor и любого другого агента, который умеет читать файлы из контекста.
Что уже есть в репозитории:
👉 Миграция с XML-вёрстки на Jetpack Compose
👉 Установка и миграция на Navigation 3 (deep links, multiple backstacks)
👉 Анализ R8-правил и оптимизация размера APK
👉 Обновление до последней версии Play Billing Library
Как использовать: скачиваешь нужный SKILL.md из репозитория, добавляешь в контекст агента (в Claude Code — через команду /add-file или как часть промпта), говоришь что нужно сделать. Агент уже знает, как это делается по правилам Google.
Набор пока небольшой, но сама идея правильная: вместо того чтобы учить агента с нуля на каждом проекте, ты даёшь ему готовую базу знаний от самой команды Android.
#AndroidDev #AIDev #ClaudeCode
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Good Reads
Android: Offline-first system design
Таких статей мы читали и слушали уже миллион. На картинке вы видите конечный результат проектирования, но эта статья неплохо показывает то, как прийти к такому решению последовательно. Такого типа задачки это часть этапа собеседований (system design)
🔗 Freedium link
Внутри: путь от "Апка крашится без доступа к интеренету" к Offline-first
Android Good Reads
Таких статей мы читали и слушали уже миллион. На картинке вы видите конечный результат проектирования, но эта статья неплохо показывает то, как прийти к такому решению последовательно. Такого типа задачки это часть этапа собеседований (system design)
🔗 Freedium link
Внутри: путь от "Апка крашится без доступа к интеренету" к Offline-first
Android Good Reads
Forwarded from Android Broadcast
Главное изменение — доступ к контактам. Приложениям, которым не нужен широкий доступ к контактам, теперь обязательно использовать Android Contact Picker. Никакого READ_CONTACTS без реальной необходимости, которую теперь придется доказываться. Тот самый пикер, который появился в Android 17, сразу стал требованием политики — не опцией.
Я писал об этом ещё когда Contact Picker появились в превью Android 17. Google никогда не оставляет такие инструменты просто опцией — новые системные механизмы приватности рано или поздно становятся политикой магахина.
С геолокацией та же история. Location Button из Android 17 — новый системный UI-элемент для разового доступа к точной позиции — уже прописан в политике как рекомендованный минимум для precise location. Фича ещё в бете, требование уже действует.
🔗 Подробности обновления политик Google Play
#GooglePlay #AndroidDev #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Mobile Developer
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
https://android-developers.googleblog.com/2026/04/build-android-apps-3x-faster-using-any-agent.html
Google выкатили набор инструментов для тех, кто разрабатывает Android через агентов - Gemini CLI, Claude Code, Codex или что-то своё.
Обсуждаем тут -> @famous_md_bot (Tier 3)
⸻
TG | Max | YouTube | VkVideo
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Mobile Native ️️
Маяк в пустыне: Kotlin DSL для Android-шейдеров
В статье автор рассказывает про сложности и неудобства работы с шейдерами в Android, из-за чего он заморочился и написал библиотеку, которая оборачивает всё это добро в типизированный Kotlin DSL.
👉 почему голый AGSL в Android-коде быстро начинает утомлять
👉 как выглядит тот же шейдер в RedByteFX
👉 четыре учебных примера - от простого к сложным эффектам
👉 как устроен DSL: координаты, uniform-ы, let(...), fn(...), sample(), sampleUv(), стандартная библиотека и интеграция с Compose;
👉 где библиотека реально выигрывает, а где у неё есть честные ограничения.
Библиотека на GitHub → RedByteFX
Читать (Ru)
В статье автор рассказывает про сложности и неудобства работы с шейдерами в Android, из-за чего он заморочился и написал библиотеку, которая оборачивает всё это добро в типизированный Kotlin DSL.
👉 почему голый AGSL в Android-коде быстро начинает утомлять
👉 как выглядит тот же шейдер в RedByteFX
👉 четыре учебных примера - от простого к сложным эффектам
👉 как устроен DSL: координаты, uniform-ы, let(...), fn(...), sample(), sampleUv(), стандартная библиотека и интеграция с Compose;
👉 где библиотека реально выигрывает, а где у неё есть честные ограничения.
Библиотека не подменяет исполнение, нативный AGSL по-прежнему исполняется на устройстве и работает по принципу Kotlin DSL → сгенерированный AGSL → RuntimeShader / RenderEffect.
Библиотека на GitHub → RedByteFX
Читать (Ru)
Forwarded from Mobile Native ️️
Kotlin Coroutine bridges: converting any callback-based Android API to suspend functions
Полезная статья, в которой показывается, как можно преобразовывать любые коллбэк-ориентированные Android API в suspend-функции используя suspendCoroutine.
👉 The fundamental problem: Callbacks do not compose
👉 The core bridge: suspendCoroutine
👉 Success and error callbacks: The two-path bridge
👉 The callback factory: Abstracting interface boilerplate
👉 Multi-value callbacks: Wrapper classes
👉 Exception hierarchies: Preserving error semantics
👉 The Result<T> variant: Exceptions are not always what you want
👉 The lambda convenience layer: Bridging before the bridge
👉 Real-world application: Bridging Google Play Billing directly
👉 suspendCoroutine versus suspendCancellableCoroutine
👉 Applying the pattern beyond billing
👉 Common mistakes to avoid
Читать (En)
Полезная статья, в которой показывается, как можно преобразовывать любые коллбэк-ориентированные Android API в suspend-функции используя suspendCoroutine.
👉 The fundamental problem: Callbacks do not compose
👉 The core bridge: suspendCoroutine
👉 Success and error callbacks: The two-path bridge
👉 The callback factory: Abstracting interface boilerplate
👉 Multi-value callbacks: Wrapper classes
👉 Exception hierarchies: Preserving error semantics
👉 The Result<T> variant: Exceptions are not always what you want
👉 The lambda convenience layer: Bridging before the bridge
👉 Real-world application: Bridging Google Play Billing directly
👉 suspendCoroutine versus suspendCancellableCoroutine
👉 Applying the pattern beyond billing
👉 Common mistakes to avoid
Читать (En)
Forwarded from Android Live 🤖
Koin Migration
Ещё один MCP в копилку. Разработчики из Koin написали тулзу, которая поможет мигрировать текущий проект практически с любого DI-фреймворка на Koin.
Полагаю, что современные языковые модели в какой-то степени справятся с этой задачей и самостоятельно, но с данным решением переезд станет гораздо комфортнее.
Люблю Koin, считаю его одним из самых удачных dependency-библиотек.
Ещё один MCP в копилку. Разработчики из Koin написали тулзу, которая поможет мигрировать текущий проект практически с любого DI-фреймворка на Koin.
Полагаю, что современные языковые модели в какой-то степени справятся с этой задачей и самостоятельно, но с данным решением переезд станет гораздо комфортнее.
Люблю Koin, считаю его одним из самых удачных dependency-библиотек.
GitHub
GitHub - InsertKoinIO/koin-migration: Koin + Koin Compiler Plugin migration — reference docs and AI skill that automate the move…
Koin + Koin Compiler Plugin migration — reference docs and AI skill that automate the move from Hilt/Dagger/Toothpick/Kodein/manual DI to the Koin Compiler Plugin. - InsertKoinIO/koin-migration
Forwarded from StartAndroid
Сначала Роман Елизаров выступил на Java Rock Star Meetup с докладом про опыт разработчика (DX,Developer Experience). По сути про то, как современный разработчик тратит слишком много сил не на бизнес-задачу, а на обслуживание сложности вокруг себя: выборы, переключения, бойлерплейт, инфраструктурную возню, разрозненные инструменты.
И не так давно нам попался отчет Chainguard Engineering Reality Report 2026. Это уже не взгляд одного сильного практика, а международный срез: 1200 инженеров и технологических руководителей из США, Великобритании, Германии и Франции рассказали, что именно сегодня ломает Developer Experience. Картина оказалась удивительно знакомой: рутина съедает время, поддержка и сопровождение побеждает инновации, инструменты не стыкуются между собой, AI помогает, но не магически, а ровно настолько, насколько хорошо встроен в процесс.
Нам показалось интересным не просто пересказать оба материала, а собрать в единую картину. Где выводы российского специалиста и международной команд рифмуются между собой. Где Елизаров идет глубже и объясняет причины. И где начинается самое интересное - то есть различия между глобальной картиной и тем, как эта тема ощущается на российской почве.
#development
https://habr.com/ru/companies/axiomjdk/articles/1023926/
Хабр
Опыт разработчика как экономика внимания
Привет, Хабр! Эта статья выросла из двух материалов, которые неожиданно хорошо коррелируют между собой. Источники: доклад Романа Елизарова ( @elizarov ) Отчет Chainguard Engineering Reality Report...
Forwarded from Kotlin Multiplatform Broadcast
🔥Главное произошло в KMP части - Flows теперь экспортируются в Swift как AsyncSequence по умолчанию. Это значит, что вся эта суета с обёртками и callback-based API просто исчезает. Пишешь Flow на Kotlin-стороне, Swift видит AsyncSequence, готово.
🔥 Swift packages теперь импортируются прямо в Gradle без всех этих танцев с CocoaPods. Firebase, другие iOS либы импортируются через build.gradle.kts как обычные зависимости.
🔥 Collection literals в экспериментальной стадии. Теперь не только в аннотациях. Сомнительно... ну ОКЭЙ!
🔗 Больше подробностей в документации и @kotlin_broadcast
#kotlin #kmp #swift #release
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Kotlin Multiplatform Broadcast
// Вместо
val shapes: MutableList<String> =
mutableListOf("triangle", "square", "circle")
// Можно будет использовать новый синтаксис
val shapes: MutableList<String> =
["triangle", "square", "circle"]
class DoubleMatrix(vararg val rows: Row) {
companion object {
operator fun of(vararg rows: Row) = DoubleMatrix(*rows)
}
class Row(vararg val elements: Double) {
companion object {
operator fun of(vararg elements: Double) = Row(*elements)
}
}
}
val identityMatrix: DoubleMatrix = [
[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0],
]Для тех кто создает много коллекций с наполнением станет проще. Но вот как часто кроме тестов приходится этим заниматься? Жил без литералов долго и ещё проживу
#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Kotlin Multiplatform Broadcast
Теперь работать с Kotlin Flow в KMP станет проще так как будет автоматическое конвертирование в удобный для Swift формат
fun flowOfStrings(): Flow<String> = flowOf("hello", "any", "world")var actual: [String] = []
// Type String is correctly inferred from Kotlin
for try await element in flowOfStrings().asAsyncSequence() {
actual.append(element)
}
🔗 Как настроить Swift to Kotlin Export
#Kotlin #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Compose Broadcast
В Compose 1.11.0 завезли новый интерфейс PreviewWrapper и аннотацию @PreviewWrapperProvider. Идея простая: вместо того чтобы оборачивать каждый Preview в свою тему, CompositionLocalProvider, моки навигации и прочее, ты один раз описываешь обёртку и просто навешиваешь её аннотацией.
Выглядит это так:
class ThemeWrapper : PreviewWrapper {
@Composable
override fun Wrap(content: @Composable () -> Unit) {
JetsnackTheme {
content()
}
}
}@PreviewWrapperProvider(ThemeWrapper::class)
@Preview
@Composable
private fun ButtonPreview() {
Button(onClick = {}) {
Text("Demo")
}
}
Сценарии где может пригодиться:
👉 встроить тему в превью
👉 подложить FakeNavController или LocalActivity
👉 обернуть в Hilt/Koin провайдер с тестовыми зависимостями
👉 прокинуть моки через CompositionLocal
Раньше для этого либо городили собственную функцию и вызывали её руками в каждом превью, либо писали кастомные
@Preview аннотации с ограниченным набором параметров.‼️ ВАЖНО: фича работает только в Android Studio Panda 4 и выше. В более старых версиях аннотация просто проигнорируется.
#compose #jetpackcompose #android
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Good Reads
Strong Skipping Mode не делает типы stable, лишь позволяет skip’ать
Внутри много кода, а не воды для самопроверки
composable с unstable параметрами, если передан тот же самый объект по ссылке ===, тогда как stable типы по-прежнему сравниваются через equals() из-за этого он не помогает, если создаются новые инстансы (типа listOf(), copy()), и рекомпозиция всё равно происходит, поэтому stability позволяет пропускать перерисовку для разных объектов с одинаковыми данными, а Strong Skipping - это оптимизация для случаев с переиспользованием одной и той же ссылки, а не замена пониманию стабильностиВнутри много кода, а не воды для самопроверки