База знаний android
1 subscriber
2.48K photos
284 videos
2 files
3.77K links
Download Telegram
💉 Koin наконец получил то, чего ему не хватало с самого начала: нативный Kotlin Compiler Plugin на K2, который проверяет граф зависимостей прямо во время сборки.

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
🤖 Google выложила официальный репозиторий Android Skills — набор инструкций для ИИ-агентов, заточенных под Android-разработку.

Идея простая: вместо того чтобы объяснять агенту контекст каждый раз руками, ты даёшь ему готовый 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.

🐱 GitHub Android Skills

#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
Forwarded from Android Broadcast
🛒 Google Play обновил сразу несколько политик — и все они завязаны на фичи Android 17.

Главное изменение — доступ к контактам. Приложениям, которым не нужен широкий доступ к контактам, теперь обязательно использовать Android Contact Picker. Никакого READ_CONTACTS без реальной необходимости, которую теперь придется доказываться. Тот самый пикер, который появился в Android 17, сразу стал требованием политики — не опцией.

Я писал об этом ещё когда Contact Picker появились в превью Android 17. Google никогда не оставляет такие инструменты просто опцией — новые системные механизмы приватности рано или поздно становятся политикой магахина.

С геолокацией та же история. Location Button из Android 17 — новый системный UI-элемент для разового доступа к точной позиции — уже прописан в политике как рекомендованный минимум для precise location. Фича ещё в бете, требование уже действует.

‼️ Geofancing убрали из разрешённых сценариев для Foreground Service. Рекомендуется переходить на Geofence API. На всё это у разработчиков 30 дней, начиная с 15 апреля 2026 года.

🔗 Подробности обновления политик Google Play

#GooglePlay #AndroidDev #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Mobile Developer
🤖 Android CLI — тулкит для AI-агентов
https://android-developers.googleblog.com/2026/04/build-android-apps-3x-faster-using-any-agent.html

Google выкатили набор инструментов для тех, кто разрабатывает Android через агентов - Gemini CLI, Claude Code, Codex или что-то своё.

⚡️ Android CLI - лёгкий интерфейс к Android SDK для агентов. Команды: android sdk install, android create (проект по официальным шаблонам), android emulator, android run. В тестах Google - на 70% меньше токенов и в 3 раза быстрее, чем когда агент сам тыкался через стандартные тулы.

⚡️ Android Skills - markdown-инструкции (SKILL.md) с пошаговыми техническими спеками. Агент сам подтягивает нужный скилл по метаданным.

⚡️ Android Knowledge Base - android docs даёт агенту доступ к свежим официальным доками Android, Firebase, Kotlin. Решает проблему устаревшего training cutoff у LLM.

Обсуждаем тут -> @famous_md_bot (Tier 3)

💭 Если используешь AI-агентов для Android-разработки — стоит потрогать. Скинь тому, кто пилит через Claude Code или Gemini CLI.

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;
👉 где библиотека реально выигрывает, а где у неё есть честные ограничения.

Библиотека не подменяет исполнение, нативный 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)
Forwarded from Android Live 🤖
Koin Migration

Ещё один MCP в копилку. Разработчики из Koin написали тулзу, которая поможет мигрировать текущий проект практически с любого DI-фреймворка на Koin.

Полагаю, что современные языковые модели в какой-то степени справятся с этой задачей и самостоятельно, но с данным решением переезд станет гораздо комфортнее.

Люблю Koin, считаю его одним из самых удачных dependency-библиотек.
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/
🏝 Вышел Kotlin 2.4.0-Beta2. Стабильные Context parameters, UUID и explicit backing fields, но это не то, что волнует в первую очередь.

🔥Главное произошло в KMP части - Flows теперь экспортируются в Swift как AsyncSequence по умолчанию. Это значит, что вся эта суета с обёртками и callback-based API просто исчезает. Пишешь Flow на Kotlin-стороне, Swift видит AsyncSequence, готово.

🔥 Swift packages теперь импортируются прямо в Gradle без всех этих танцев с CocoaPods. Firebase, другие iOS либы импортируются через build.gradle.kts как обычные зависимости.

🚀 Для Native GC поменялся алгоритм GC c PMCS на CMS — это снижает паузы при сборке мусора. Особенно заметно будет в Compose Multiplatform приложениях.

🐘В JVM части Java 26 поддержка, в Gradle совместимость с 9.4.1.

🔥 Collection literals в экспериментальной стадии. Теперь не только в аннотациях. Сомнительно... ну ОКЭЙ!

🔗 Больше подробностей в документации и @kotlin_broadcast

#kotlin #kmp #swift #release
Please open Telegram to view this post
VIEW IN TELEGRAM
🏝 Поддержка литералов коллекций в Kotlin 2.4.0 [ЭКСПЕРИМЕНТАЛЬНО]

// Вместо
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
🏝🦢 Kotlin to Swift Export - экспериментальная поддержка конвертирования Kotlin Flow в Swift AsyncSequence

Теперь работать с 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
⚙️ Кажется, проблема с обёртками для Preview в Compose наконец-то решена нормально — без копипаста на каждый файл.

В 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 - это оптимизация для случаев с переиспользованием одной и той же ссылки, а не замена пониманию стабильности

Внутри много кода, а не воды для самопроверки