Forwarded from Kotlin Multiplatform Broadcast
В сегодняшнем бета-релизе 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 этого ограничения не имеют.
🔗 Подробнее kotlinlang.org
#Kotlin #KMP #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
Вышла новая версия Media3, и там заметное обновление для тех, кто строит плеерный UI на Compose. Главное в этом релизе — продолжение развития модуля
media3-ui-compose-material3. Добавили готовый Player composable, который объединяет ContentFrame с настраиваемыми элементами управления сверху, по центру и снизу. Рядом появился ProgressSlider для перемотки через жесты и PlaybackSpeedControl с кнопкой переключения скорости. На мой взгляд, это уже почти полноценный out-of-the-box плеер на Compose Material3.Breaking changes:
👉
FrameExtractor вынесен в отдельный модуль media3-inspector-frame 👉
LottieOverlay переехал в media3-effect-lottie🔗 Источники: android-developers.googleblog.com
#Android #AndroidDev #Jetpack #Медия
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Good Reads
Не знаю, кто в Google решил, что Beta 3 — идеальный момент для такого объема изменений
👉 Beta 3 = platform stability, то есть API уже зафиксирован и пора прогонять финальную совместимость
👉 На больших экранах больше нельзя будет уклоняться от
👉 dynamic code loading закручивают еще сильнее: нативные библиотеки, загружаемые через
👉 local network access для
👉 появился кастомайз фото-пикера,
👉 в desktop mode всё становится интереснее: interactive pinned windows, виджеты на внешних дисплеях, плюс Google явно двигается в сторону более внятного UX для десктопов
👉 добавили system location button: можно дать
👉 настройку показа паролей разделили для
👉 появился способ понять, что вы близко к ANR timeout. Наконец-то хоть какой-то ранний сигнал перед смертью процесса
👉 еще завезли
В самой статье найдете конкретные ссылки на то что заинтересовало прям в документацию
👉 Beta 3 = platform stability, то есть API уже зафиксирован и пора прогонять финальную совместимость
👉 На больших экранах больше нельзя будет уклоняться от
resizable/orientation/aspect ratio ограничений при targetSdk 17👉 dynamic code loading закручивают еще сильнее: нативные библиотеки, загружаемые через
System.load(), теперь должны быть read-only👉 local network access для
targetSdk 17+ теперь по умолчанию закрыт, нужен новый подход и новый ACCESS_LOCAL_NETWORK👉 появился кастомайз фото-пикера,
RAW14, vendor-defined camera extensions и API для определения типа камеры👉 в desktop mode всё становится интереснее: interactive pinned windows, виджеты на внешних дисплеях, плюс Google явно двигается в сторону более внятного UX для десктопов
👉 добавили system location button: можно дать
precise location только на текущую сессию👉 настройку показа паролей разделили для
touch и physical keyboard👉 появился способ понять, что вы близко к ANR timeout. Наконец-то хоть какой-то ранний сигнал перед смертью процесса
👉 еще завезли
FileManager, stricter StrictMode вокруг URI grants, bridged notifications и пачку новых менеджеров/сервисов, часть из которых пока документирована довольно туманноВ самой статье найдете конкретные ссылки на то что заинтересовало прям в документацию
Forwarded from Android Broadcast
Авторизация в Android-приложениях исторически была болью: Smart Lock, One Tap, FIDO2, Google Sign-In — каждый жил отдельно, со своими проблемами и способом интеграции. Credential Manager заменяет всё это единым Jetpack API.
val request = GetCredentialRequest(
listOf(
GetPasswordOption(),
GetPublicKeyCredentialOption(requestJson = fetchJsonFromServer())
)
)
coroutineScope.launch {
try {
val result = credentialManager.getCredential(
context = activityContext,
request = request
)
when (val credential = result.credential) {
is PublicKeyCredential -> sendToServer(credential.authenticationResponseJson)
is PasswordCredential -> signInWith(credential.id, credential.password)
is CustomCredential -> handleFederatedSignIn(credential)
}
} catch (e: GetCredentialException) {
handleError(e)
}
}
Суть простая: один вызов
getCredential() показывает пользователю bottom sheet, где агрегированы passkeys, сохранённые пароли и Sign in with Google. Пользователь выбирает аккаунт, а не метод входа — API само подбирает подходящий тип учётной данных.По возможностям:
👉 Passkeys — беспарольная аутентификация через публичный ключ с подтверждением биометрией или PIN. Работает с Android 9+, синхронизируется через Google Password Manager
👉 Пароли — поддержка через
GetPasswordOption с Android 4.4, то есть покрывает всю реальную аудиторию👉 FIDO — Sign in with Google теперь нативно встроен в тот же bottom sheet, никаких отдельных SDK
Что происходит в реальных приложениях с passkeys — числа впечатляют. Zoho после интеграции ускорил авторизацию в 6 раз и видит рост использования passkeys на 31% месяц к месяцу. X за 4 недели мигрировал с SmartLock/One Tap/Google Sign-In, удалил сотни строк кода и вдвое улучшил показатели успешного входа.
‼️ ВАЖНО: поддержка сторонних менеджеров паролей (1Password, Bitwarden и т.д.) появилась только с Android 14. На более ранних версиях работает только Google Password Manager.
На мой взгляд, это тот редкий случай когда Google реально упростила жизнь разработчикам, а не наоборот. Если в приложении до сих пор живут отдельные интеграции авторизаций — посмотрите в сторону миграции, оно того стоит и по коду, и по UX.
А вы уже интегрировали Credential Manager к себе? Если да — что больше всего зашло или наоборот споткнулись? Если нет — что останавливает?
#Android #Безопасность #Passkeys
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
⚡️ R8 наконец-то починил AtomicReferenceFieldUpdater в корутинах на Android
Это история про баг, которому больше двух лет. В 2023 году в трекере
Корень проблемы в том, что корутины используют atomicfu, который на JVM компилируется в Atomic*FieldUpdater ради совместимости с KMP. На десктопном JDK это нормально, но ART на Android оптимизирует их хуже. Бенчмарк на Pixel 4a давал 135 нс против 50 нс — разница почти в 3 раза на
R8 в составе AGP 9.2 закрывает этот разрыв на уровне компилятора: он определяет, где
Для нас это значит: никаких изменений в коде, просто обновить AGP. Бесплатное ускорение каждого launch и cancel в приложении.
На мой взгляд, абсолютно правильно решать проблему именно на стороне R8, а не правками всех библиотек.
🔗 Источник - X Andrei Shikov
#kotlin #coroutines #performance
Это история про баг, которому больше двух лет. В 2023 году в трекере
kotlinx.coroutines появился issue: AtomicReferenceFieldUpdater, которым корутины управляют состоянием Job, на Android работает в 2–4 раза медленнее, чем обычный AtomicReference на операциях compareAndSet и lazySet.Корень проблемы в том, что корутины используют atomicfu, который на JVM компилируется в Atomic*FieldUpdater ради совместимости с KMP. На десктопном JDK это нормально, но ART на Android оптимизирует их хуже. Бенчмарк на Pixel 4a давал 135 нс против 50 нс — разница почти в 3 раза на
compareAndSet.R8 в составе AGP 9.2 закрывает этот разрыв на уровне компилятора: он определяет, где
Atomic*FieldUpdater можно заменить на Unsafe-вызовы, и генерирует одну инструкцию вместо цепочки. ART тоже получит аналогичную оптимизацию в JIT, но она имеет ограничения по версии платформы и хуже масштабируется по тестам автора.Для нас это значит: никаких изменений в коде, просто обновить AGP. Бесплатное ускорение каждого launch и cancel в приложении.
На мой взгляд, абсолютно правильно решать проблему именно на стороне R8, а не правками всех библиотек.
🔗 Источник - X Andrei Shikov
#kotlin #coroutines #performance
Forwarded from StartAndroid
Что происходит с подписочной моделью в приложениях
#android #subscription
https://habr.com/ru/articles/1015000
Рынок подписочных приложений быстро меняется. Старые приложения по-прежнему доминируют по доле выручки, но новые каждый день наводняют cторы. ИИ-приложения «умирают» быстрее, чем успевают выходить, а зона безопасной выручки для среднего приложения стремительно исчезает. «Выживания» больше нет: либо процветаешь, либо выгораешь.
Каждый год наш отчёт «Состояние подписочных приложений» ставит целью понять, что меняется в индустрии - что ушло в прошлое и что нас ждёт. В этом году наш набор данных снова вырос и составил более 115 000 приложений с более 16 миллиардов долларов выручки. Мы проанализировали данные по всем 115 тысячам из них.
#android #subscription
https://habr.com/ru/articles/1015000
Хабр
Что происходит с подписочной моделью в приложениях: уроки, тренды и ориентиры на 2026 год
Перевод статьи Лорелея Уитмен, RevenueCat Ключевые выводы из крупнейшего в мире набора данных о подписочных приложениях Краткое содержание Рынок подписочных приложений быстро меняется. Старые...
Forwarded from Mobile Native ️️
Как я пытался чинить анимацию в Jetpack Compose LazyColumn
Интересная статья от разработчика из ТБанка про то, как они решали проблему рассинхронизации анимаций айтемов в
В статье разбирается, почему возникает рассинхрон, как устроен механизм анимаций внутри
Читать (Ru)
Интересная статья от разработчика из ТБанка про то, как они решали проблему рассинхронизации анимаций айтемов в
LazyColumn – когда один из айтемов меняет свои размеры, анимация второго айтема происходит с временным лагом.В статье разбирается, почему возникает рассинхрон, как устроен механизм анимаций внутри
LazyColumn, почему кастомный animateItem обречен с самого начала и к какому решению в итоге пришли.Читать (Ru)
Forwarded from StartAndroid
Разбираем Remote Compose: как Google предлагает строить BDUI
#android #compose #remote
https://habr.com/ru/companies/alfa/articles/1018986/
Remote Compose выглядит очень перспективной технологией. Фреймворк активно развивается и поддерживается командой Google. Однако на момент написания статьи технология всё ещё находится в alpha-версии, поэтому использовать её на проде пока рано.
Но я изучил этот фреймворк и хочу поделиться своим опытом, а когда Remote Compose выйдет в бета-версию вы будете знать, как с ним работать
В статье разберём:
- общую концепцию Remote Compose,
- чем он отличается от классического BDUI,
- какие интересные технические решения используются внутри,
- несколько практических примеров использования.
#android #compose #remote
https://habr.com/ru/companies/alfa/articles/1018986/
Хабр
Разбираем Remote Compose: как Google предлагает строить BDUI
Технологии Backend-Driven UI уже давно используются во многих компаниях, включая Альфа-Банк. Существует множество реализаций этого подхода, и недавно Google представил собственное решение — Remote...
Forwarded from Android Good Reads
Используем
Собственно говоря, весь код на превьюшке. Будет бодро слать вам ошибку компиляции, пока вы не добавите
Android Good Reads
@RequireOptIn чтоб пометить Composable для использования только в превьюСобственно говоря, весь код на превьюшке. Будет бодро слать вам ошибку компиляции, пока вы не добавите
@Suppress или не уберете помеченную функциюAndroid Good Reads
Forwarded from Mobile Compose
#Release #Compose #Changelog
😇 Релиз Compose библиотек (25.03.2026)
🔵 Animation 1.10.6/1.11.0-beta02
🔵 Foundation 1.10.6/1.11.0-beta02
🔵 Material 1.10.6/1.11.0-beta02
🔵 Runtime 1.10.6/1.11.0-beta02
🔵 UI 1.10.6/1.11.0-beta02
▫️ Remote 1.0.0-alpha07
▫ Material 3 1.5.0-alpha16
▫️ Wear Compose 1.6.0
▫ Navigation3 1.1.0-rc01
▫ XR Compose 1.0.0-alpha12
▫ XR Material3 Compose 1.0.0-alpha16
🎨 Список всех изменений
🎨 Mobile Compose 💬 Чат канала
♾
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Kotlin Multiplatform Broadcast
Пять новых extension-функций для
Iterable, Array и Sequence: isSorted(), isSortedDescending(), isSortedWith(comparator), isSortedBy(selector), isSortedByDescending(selector). Все возвращают true если элементы уже стоят в нужном порядке. При первой же неправильной паре вернет false, поэтому на больших коллекциях работает эффективно.val numbers = listOf(1, 2, 3, 4)
numbers.isSorted() // true
val users = listOf(
User("Alice", 24),
User("Bob", 31),
User("Charlie", 29),
)
users.isSortedBy(User::age) // false
#Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Android Broadcast
AGSL (Android Graphics Shading Language) появился в Android 13 как нативный язык шейдеров для GPU. Работает через RuntimeShader и RenderEffect, позволяет делать попиксельные эффекты на любом View или Composable. Но писать его больно: код живёт в строках, uniform-ы привязываются вручную, IDE не помогает.
Библиотека RedByteFX оборачивает это в Kotlin DSL. Вот волновое смещение — сначала голый AGSL, потом то же самое через библиотеку:
// Голый AGSL — строка в коде
uniform shader content;
uniform float wave_amplitude;
uniform float wave_frequency;
half4 main(float2 fragCoord) {
float2 offset = float2(
0.0,
sin(fragCoord.x * wave_frequency) * wave_amplitude
);
return content.eval(fragCoord + offset);
}
// RedByteFX DSL
val effect = redbytefx {
val amplitude = uniformFloat(0f, "wave_amplitude")
val frequency = uniformFloat(0.08f, "wave_frequency")
val offset = let(
float2(0f, sin(fragCoord.x * frequency) * amplitude),
"wave_offset"
)
sample(fragCoord + offset)
}
🔗 habr.com
#Android
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from StartAndroid
Статья рассказывает, как превращать любые колбэк‑ориентированные Android‑API (включая Google Play Billing, локации, Bluetooth и т.п.) в suspend‑функции с помощью suspendCoroutine
#kotlin #coroutines
https://www.revenuecat.com/blog/engineering/kotlin-coroutine-bridge/
#kotlin #coroutines
https://www.revenuecat.com/blog/engineering/kotlin-coroutine-bridge/
RevenueCat
Kotlin Coroutine bridges: converting any callback-based Android API to suspend functions | RevenueCat
This article explores the suspendCoroutine bridge pattern, showing how to convert callback APIs into clean suspend functions, handle diverse callback shapes, design proper error propagation, and how SDKs like RevenueCat apply it at scale.
Forwarded from Android Good Reads
Kotlin 2.4.0 Sorted-Order валидация
Добавили новых
🔗 Ссылка на документацию
Ну и сразу пример:
Android Good Reads
Добавили новых
extension функций в стандартную библиотеку для валидации того как отсортированы коллекции: .isSorted()
.isSortedDescending()
.isSortedWith(comparator)
.isSortedBy(selector)
.isSortedByDescending(selector)
🔗 Ссылка на документацию
Ну и сразу пример:
data class User(val name: String, val age: Int)
fun main() {
val users = listOf(
User("Alice", 24),
User("Bob", 31),
User("Charlie", 29),
)
println(users.isSortedBy(User::age))
// false
}
Android Good Reads
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