Это изменение почти никто не увидит в changelog’ах, но оно напрямую влияет на то, насколько плавно работает интерфейс любого приложения.
MessageQueue — это очередь задач главного потока с которой работает Handler. Каждый Android-разработчик фактически работает с ней каждый день, даже если напрямую не задумывается об этом. Looper берёт из неё сообщения, передаёт их Handler’ам, выполняет UI-обновления, lifecycle-события, обработку ввода, invalidate, работу фреймворков и большую часть межпоточного взаимодействия. По сути, это диспетчер всей работы main thread.
Исторически эта очередь почти не менялась около двадцати лет. Внутри она была защищена одним lock’ом. Пока один поток добавлял сообщение, другой не мог работать с очередью. На старых устройствах это не было критично, но на современных многоядерных системах стало появляться всё чаще: background-поток держит lock, планировщик переключает CPU на другие задачи, а UI-поток в этот момент ждёт.
В Android 17 мезанизм работы очереди переписали полностью. Новая реализация стала lock-free. Вместо общего lock используются атомарные операции, а сама структура очереди разделена на две части: потоки могут добавлять сообщения без блокировок, а главный поток уже самостоятельно упорядочивает и выполняет задачи. Важное свойство такого подхода — хотя бы один поток всегда может продолжать работу независимо от поведения остальных.
Это не обновление из категории «приложение стало быстрее на X процентов». Изменение работает глубже. Оно снижает вероятность случайных блокировок главного потока, уменьшает количество missed frames и делает время кадра стабильнее под нагрузкой. Особенно это заметно в сценариях, где одновременно происходит много фоновой работы: запуск приложения, работа камеры, тяжёлые UI, интенсивные операции в фоне.
🤯 В одном из примеров Google показывают блокировку UI-потока почти на 18 мс только из-за конкуренции за lock — этого уже достаточно, чтобы пропустить кадр на экране 60 Гц, не говорю уже про 120.
На самом деле это интересный сигнал о направлении развития Android. Долгое время оптимизации происходили на уровне API и фреймворков. Сейчас Google всё чаще переписывает базовые механизмы конкурентности самой платформы. И это логично: современные устройства уже редко упираются в вычислительную мощность, чаще — в синхронизацию потоков и contention. MessageQueue находится в центре всей работы UI-потока, поэтому даже небольшие улучшения здесь масштабируются на всю экосистему.
🔗 Больше подробностей про работу механизма можно найти в техническом разборе от Google
#Android #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥186👍41❤28👎6
Android Broadcast
Android 9 (API 28) сегодня — это более 95% всех активных Android‑устройств в мире. Повышение minSdkVersion до этого уровня открывает доступ к новым платформенным API, среди которых особенно интересен
AppComponentFactory позволяет задать фабрику, которая будет управлять созданием экземпляров
#Android #AndroidDev #Android9
AppComponentFactory.AppComponentFactory позволяет задать фабрику, которая будет управлять созданием экземпляров
Application, Activity, Service, ContentProvider и BroadcastReceiver. Благодаря этому можно использовать конструкторы с параметрами для этих компонентов и отказаться от полевого инжекта (field injection) или других обходных путей, вызванных ограничениями старых версий Android.// Создаем свою фабрику
class MyAppComponentFactory : AppComponentFactory() {
override fun instantiateActivity(
cl: ClassLoader,
className: String,
intent: Intent
): Activity {
return when (className) {
MainActivity::class.java.name ->
MainActivity("Hello from factory")
else ->
super.instantiateActivity(cl, className, intent)
}
}
}
``
<!-- Указываем фабрику в манифесте -->
<application
android:name=".MyApplication"
android:appComponentFactory=".MyAppComponentFactory"
... >
...
</application>
// Используем в Activity конструктор с параметром
class MainActivity(private val message: String) : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
println("Message from factory: $message")
}
}
#Android #AndroidDev #Android9
❤73👍16👎14🤔3🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Сделал короткий обзор зачем нужна GrapheneOS, авторы которой перепили AOSP для лучшей безопасности, что им стоит Google подчернуть в этой ОС и самое главное - какой опыт использования этой ОС
#Android #AndroidBroadcast #GrapheneOS
Please open Telegram to view this post
VIEW IN TELEGRAM
👎33🔥20👍7❤3🤔1
Forwarded from Kotlin Multiplatform Broadcast
Если используете Koin и Detekt, то знаете, что стандартный Detekt ничего не знает о специфике Koin. Можно написать рабочий, но проблемный код — и никаких предупреждений.
Что ловит библиотека:
👉 Service Locator антипаттерны (5 правил)
👉 Ошибки в Module DSL (14 правил)
👉 Проблемы управления скоупами (8 правил)
👉 Platform-специфичные проблемы (8 правил)
👉 Архитектурные нарушения (4 правила)
👉 Koin Annotations (12 правил)
Подключение:
// build.gradle.kts
dependencies {
detektPlugins("dev.androidbroadcast.rules.koin:detekt-koin4-rules:1.0.0")
}
Требования: Kotlin 2.0+, Detekt 1.23.8+, Koin 4.x
Жду фидбэк — каких не хватает, ложные срабатывания, что настраивается неудобно и всё всё. Пишите в комментариях к этому посту или в Issues репозитория 🙌
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍10👎9❤2
Копался в behavior changes для Android 17 и наткнулся на очередное закручивание гаек вокруг запуска Activity из фона.
На этот раз Google расширил BAL (Background Activity Launch) ограничения на
IntentSenderIntentSender - это обёртка над PendingIntent, позволяющая передать право запуска Intent другому приложению или системе. Именно через него работают уведомления, виджеты, shortcuts и межпроцессные вызовы.
Так вот, константа
MODE_BACKGROUND_ACTIVITY_START_ALLOWED теперь deprecated. Если где-то передаёте её через ActivityOptions при работе с PendingIntent — нужно мигрировать на MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE. Разница в том, что теперь Activity из фона запустится только если вызывающее приложение видимо пользователю.val options = ActivityOptions.makeBasic().apply {
pendingIntentBackgroundActivityStartMode =
ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE
}Найти проблемные места просто — Google обновил lint и StrictMode под новые требования. Запускаете lint, ищете использования
MODE_BACKGROUND_ACTIVITY_START_ALLOWED и получаете полный список того, что нужно поправить.Формально это касается только
targetSdk 17+, но лучше не тянуть — сами знаете, как работают дедлайны в Play Console.🔗 Источник developer.android.com
#Android17 #androiddev #security #activity
Please open Telegram to view this post
VIEW IN TELEGRAM
👎20👍14👌7❤3🤯3
This media is not supported in your browser
VIEW IN TELEGRAM
Уже несколько недель я активно погружаюсь в разработку с помощью ИИ и решение разных задач через кодинг агентов. Буду регулярно делиться впечатлениями и находками на Boosty.
🪙 Уже доступен первый выпуск
#AndroidBroadcast #Boosty #ДневникИИКодера
#AndroidBroadcast #Boosty #ДневникИИКодера
Please open Telegram to view this post
VIEW IN TELEGRAM
111👎71👍32❤7👏3🤯3🔥2👌2
Наткнулся на сайт keepandroidopen.org, который призывает бороться с "закрытием" Android. Честно — не понимаю, на что надеются авторы.
Обязательная верификация (подробнее в этом посте) разработчиков ≠ закрытие Android 🚫. Всё что Google делает в этом направлении — происходит при поддержке правительства, а то и вовсе по их инициативе.
Тот, кто публикует вредоносное и не готов себя раскрыть — ну и ладно. Я ничего не теряю.
Пользователям, которым не нравится новый подход, есть варианты:
— прошить телефон на Android без GMS, всё будет как прежде
— купить Huawei, там Google сервисов нет в принципе
Конечно, если не бороться — ничего не сдвинется. Но обязательная верификация всё равно будет. И если она не приведёт к потерям денег у Google — значит всё устраивает 🤷
#Android #Безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
👎91👍12🔥1👏1
😁 Одна хитрость верификации Android разработчика, которая усложняет процесс регистрации
Самая большая проблема верификации для разработчиков, кто из стран, где Google не работает или под санкциями. Для прохождения верификации надо сделать оплату картой, а у тебя нет карты, что Google примет. Вроде как верификация для всех, но технически не подойти к ней.
#Android #GooglePlay
Самая большая проблема верификации для разработчиков, кто из стран, где Google не работает или под санкциями. Для прохождения верификации надо сделать оплату картой, а у тебя нет карты, что Google примет. Вроде как верификация для всех, но технически не подойти к ней.
#Android #GooglePlay
👎58👍7🤯7🎉4❤2🔥2👌1
Coil - это библиотека для загрузки изображений на Android (и теперь Compose Multiplatform). Название расшифровывается как Coroutine Image Loader — библиотека написана на Kotlin с первого дня и отлично вписывается в современный стек: корутины, Compose, KMP.
В новой версии несколько интересных вещей:
🔁 ConcurrentRequestStrategy — теперь можно объединять параллельные сетевые запросы на один и тот же ресурс. По умолчанию отключено и помечено как экспериментальное, но идея хорошая — вместо N одинаковых запросов летит один, остальные ждут результата.
🧵 Асинхронный декодинг JS/WASM — изображения больше не блокируют главный поток браузера. Важно для KMP-проектов с вебом.
🐧 Linux targets — добавили поддержку
linuxX64 и linuxArm64 для non-Compose артефактов.🎞 Улучшенные переходы в Compose — новый
useExistingImageAsPlaceholder позволяет плавно переходить от предыдущего изображения, когда нет placeholder. Мелочь, но визуально приятно.🎬 Embedded video thumbnails — поддержка встроенных превью для видео.
🔧 coil-lint — добавили Android Lint-правило, которое ловит случайные вызовы
kotlin.error() внутри блоков ImageRequest.Builder. Неожиданно полезно.Зависимости Kotlin 2.3.10, Compose 1.9.3, Okio 3.16.4.
#Android #AndroidDev #KMP #kCMP #Compose
Please open Telegram to view this post
VIEW IN TELEGRAM
👍40👎5❤4🔥1👏1🤔1👌1
This media is not supported in your browser
VIEW IN TELEGRAM
В Android 17 на Pixel появится возможность запускать приложение как плавающее окно. Да-да. Вы скажете, что это давно уже было на многих планшетах. Теперь и в стоковой оболочки Pixel будет, хотя вот другим производителям всё равно от этого изменения
#Android #Android17
#Android #Android17
👎15🤔9❤6🔥6👍4🤯3
This media is not supported in your browser
VIEW IN TELEGRAM
#Android #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32🤔12👎8👍3🤯2
// Пример запуска EyeDropper
val eyeDropperLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {
result -> if (result.resultCode == Activity.RESULT_OK) {
val color = result.data?.getIntExtra(Intent.EXTRA_COLOR)
// Обрабатываем полученный результат
}
}
fun launchColorPicker() {
val intent = Intent(Intent.ACTION_OPEN_EYE_DROPPER)
eyeDropperLauncher.launch(intent)
}
#Android #Android17
👍20👎7🤔3🔥1
Если вы ещё не слышали про ML Kit Prompt API — это способ запускать Gemini Nano прямо на Android устройстве без обращения к серверу. Модель живёт в Android AICore как системный сервис, приложение просто отправляет промпт и получает ответ.
APO появился с целью настройки общей модели под конкретную задачу. Это облачный инструмент, который автоматически ищет оптимальный системный промпт для вашей задачи. Вы даёте примеры входных данных и ожидаемых ответов, Gemini Pro/Flash анализирует ошибки, генерирует десятки вариантов промптов параллельно и выбирает лучший. На выходе — просто текст промпта, который вы зашиваете в своё приложение.
Google утверждают, что это даёт
Пока ML Kit Prompt API доступен только на ограниченном числе устройств, но направление очевидно — Google всерьёз строят экосистему on-device AI для Android-разработчиков
🔗 Источник - официальный блог Android Developers
#Android #AndroidDev #MLKit #GeminiNano #OnDeviceAI
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👎17👍8🤔7❤4👌1
🤔 Рефакторить нельзя переписать
Работа с AI-агентами натолкнула меня на мысль, которую давно хотел сформулировать вслух. Когда перед тобой стоит задача — переход с View на Compose, смена архитектуры, миграция на KMP — первый инстинкт: «давай отрефакторим что есть». И вот тут я всё чаще останавливаюсь и задаю себе вопрос: а стоит ли?
Чтобы нормально рефакторить старый код — его нужно сначала покрыть тестами. Понять все сценарии. Убедиться, что после изменений всё ведёт себя так же. Это огромная работа, которую часто недооценивают, а то и вовсе перекладывают на регресс тестирование.
А что если написать рядом новый код по той же спецификации поведения, без груза старых ограничений. Запустил на двух устройствах, сравнил — и всё. Никаких «а вдруг что-то сломалось».
Агенты, кстати, это подтверждают 🤖 Они заметно лучше справляются с написанием нового кода по спецификации, чем с попыткой переписать существующий. Старый код накладывает ограничения. Новый — их снимает.
Мой подход сейчас такой:
👉 Простая библиотека или изолированный модуль → спокойно мигрируй постепенно
👉 Что-то сложное с бизнес-логикой → пиши рядом, потом подменяй импорты
💬 А вы как поступаете? Когда стоит задача миграции или переработки большого куска — рефакторите или пишете заново? Интересно услышать ваш опыт
#Архитектура #Рефакторинг
Работа с AI-агентами натолкнула меня на мысль, которую давно хотел сформулировать вслух. Когда перед тобой стоит задача — переход с View на Compose, смена архитектуры, миграция на KMP — первый инстинкт: «давай отрефакторим что есть». И вот тут я всё чаще останавливаюсь и задаю себе вопрос: а стоит ли?
Чтобы нормально рефакторить старый код — его нужно сначала покрыть тестами. Понять все сценарии. Убедиться, что после изменений всё ведёт себя так же. Это огромная работа, которую часто недооценивают, а то и вовсе перекладывают на регресс тестирование.
А что если написать рядом новый код по той же спецификации поведения, без груза старых ограничений. Запустил на двух устройствах, сравнил — и всё. Никаких «а вдруг что-то сломалось».
Агенты, кстати, это подтверждают 🤖 Они заметно лучше справляются с написанием нового кода по спецификации, чем с попыткой переписать существующий. Старый код накладывает ограничения. Новый — их снимает.
Мой подход сейчас такой:
👉 Простая библиотека или изолированный модуль → спокойно мигрируй постепенно
👉 Что-то сложное с бизнес-логикой → пиши рядом, потом подменяй импорты
#Архитектура #Рефакторинг
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41👎18❤9🤔2
🤯 Конец Android View ближе чем кажется - в будущей версии Android Studio убирают поддержку превью для Custom View.
Источник - сайт Android Developers
#Android #AndroidDev #Compose #AndroidStudio
Источник - сайт Android Developers
#Android #AndroidDev #Compose #AndroidStudio
🤯99👎46🎉25👍16🔥13👌1
Стоит убирать поддержку View превью из Android Studio?
Anonymous Poll
21%
Давно пора
61%
Оставьте, она вам чем-то мешает?
2%
Я IDE вообще не открываю
10%
Да мне п***равно
7%
Не участвую в опросе
👎33👍11❤3🔥3
Ключевые изменения:
👉 Больше не будет форсирования оплаты цифровых товаров и подписок через Google Play
👉 Сторнние сторы получат возможности как у Google Play
Registered App Stores - официальная для программа для сторонних магазинов. Те кто решит пойти в программу поулчат сразу при установке все разрешения и опыт близкий к работе Gooogle Play Программа стартует за пределами США и только потом станет доступна там.
Источник - оф блог Android Developers
#GooglePlay
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍68🎉26❤5👎3