Android Broadcast
14.6K subscribers
3.88K photos
401 videos
11 files
6.39K links
Подборка новостей и статей для Android разработчиков.

Реклама и связь с автором @ab_manager

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
🚀 Grab включил R8 на 10 млн строк кода и избавился от всплесков ANR после релизов

«Каждый еженедельный релиз — всплеск ANR», — так описывают жизнь команды Grab, суперприложения из Юго-Восточной Азии с 10-летней кодовой базой. Холодный старт тормозило чтение множества DEX-файлов, а Cloud Profiles из Google Play не покрывали их критичные пути вроде сборки графа Dagger.

Сначала команда перешла на proguard-android-optimize.txt и добавила Baseline и Startup Profiles, через девять месяцев — на R8 full mode. Вместо широких исключений нашли конкретные классы, к которым обращаются через рефлексию и динамические прокси, и написали для них точечные keep-правила. Оценки оптимизации R8 теперь отслеживают в CI, а новые keep-правила планируют пропускать только с обоснованием.

Итог: ANR меньше на 32%, холодный старт быстрее на 35%. Недавно писал, что Google взялся за R8 всерьёз, — вот как это выглядит на большом проекте.

🔗 Кейс Grab

#Android #AndroidDev #R8 #Performance
🔥26👍11
🤖 Mac.apk открыл исходники: Android-приложения на Mac без эмулятора и виртуальной машины

Чтобы запустить Android-приложение на Mac, обычно поднимают эмулятор — целый Android в виртуальной машине. Автор Mac.apk пошёл путём Wine: его программа сама изображает Android поверх macOS. 19 октября код открыли под AGPL-3.0.

При первом запуске DEX переводится в Java-байткод и работает на встроенной OpenJDK, 64-битный ARM-код выполняется на чипе Apple как есть, а графика идёт через ANGLE и MoltenVK в Metal. Каждое приложение — отдельное окно с иконкой в Dock.

Разработчикам важно: на Mac.apk ваше приложение запускается без настоящих Google Play Services: Play Billing и Play Integrity недоступны, а рекламный SDK Google получает пустой ответ. Если не хотите видеть там своё приложение, автор по запросу внесёт его в список блокировки.

⚠️ Это альфа-версия: нужны Apple Silicon и macOS 26.4+, часть приложений пока не запускается.


🔗 GitHub · Как это устроено · Для разработчиков

#Android #AndroidDev #macOS #OpenSource
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32👍7
🤖 Google объяснил Android-разработчикам, как устроены ИИ-агенты и что писать в AGENTS.md

Агент обновляет библиотеку с ломающими изменениями, а нового API нет в его обучающих данных, и по сотням файлов сыплются ошибки компиляции. С разбора таких ситуаций начинается новый раздел AI tools на developer.android.com: агент — это LLM плюс обвязка с инструкциями, инструментами, навыками и циклом выполнения.

Главный практический совет: пишите в AGENTS.md конкретные команды и пути, а не пожелания. Не «убедись, что проект собирается», а ./gradlew assembleDebug; не «бери свежие версии», а «версии из gradle/libs.versions.toml, новые зависимости — только после вопроса». Навыки устаревают, поэтому свежие факты агенту лучше давать через поиск по документации в Android CLI.

В квикстарте инструменты подобраны под опыт: новичкам — Google AI Studio, своему агенту вроде Claude Code — Android CLI и skills, для продакшена — Android Studio.

🔗 Как работают агенты · Квикстарт

#Android #AndroidDev #AI #AIAgents
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28❤5
🤖 Виджеты на Android 17: слишком тяжёлые картинки теперь роняют приложение

Приложение обновляет виджет с парой крупных фото и падает с IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage. Так Android 17 ведёт себя с приложениями на targetSdk 37: если картинки в RemoteViews не влезают в лимит, система отклоняет обновление и бросает исключение. На targetSdk 36 и ниже это пока только предупреждение в логе. Google переписал описание этого изменения и добавил, как считается лимит и как в него уложиться.

Лимит — 6 * width * height байт, то есть полтора полноэкранных буфера ARGB_8888. Считаются картинки для всех ориентаций и размеров виджета сразу, поэтому responsive-виджет легко съедает бюджет копиями одного и того же Bitmap.

👉 Размер экрана берите из WindowManager.currentWindowMetrics, а не из displayMetrics: на складных устройствах тот может вернуть размер неактивного дисплея.

👉 Уменьшайте картинки до размеров виджета, а для непрозрачных используйте RGB_565 — это вдвое меньше памяти.

👉 В Glance декодируйте Bitmap один раз в provideGlance до provideContent, иначе для каждого размера создаётся своя копия.

URI-картинки в лимит не входят, но лаунчер декодирует их в полном разрешении, так что класть в cacheDir тоже стоит уменьшенную версию.

🔗 Изменения поведения Android 17 · Виджеты на Glance

#Android #AndroidDev #Android17 #AppWidgets
👍20❤4
🚀 Предусловия UI-тестов через API — не всегда быстрее: замеры на 400+ Android-тестах

Почти каждый UI-тест в Android-приложении финансового сервиса начинался одинаково: шесть экранов логина и около 26 секунд, хотя логин эти тесты не проверяли. Команда проверила на Хабре известный совет «готовьте предусловия через API, а не через UI» на трёх кейсах в сьюте на Kaspresso.

Для логина совет сработал: вход через auth-слой приложения занял ~7 секунд вместо ~26, а общее время 418 тестов сократилось на 27%. А переключение тумблера через PATCH оказалось на 29% медленнее трёх тапов. Тест сам грузил большой список продуктов, который приложение потом загружало ещё раз.

Вывод авторов: выигрыш даёт не API сам по себе, а то, что из теста уходит длинная UI-цепочка, которая не лежит на пути к проверяемому экрану.

🔗 Статья на Хабре

#Android #AndroidDev #Testing #Kaspresso
❤7👍3
‼️ Утекли ключи удостоверяющего центра eMudhra: обновите OkHttp до 5.5.1 или 4.12.1

Поздно вечером 17 октября Mozilla получила сообщение: закрытые ключи восьми промежуточных сертификатов удостоверяющего центра eMudhra скомпрометированы. С ними можно выпустить поддельный HTTPS-сертификат для чужого сайта, и клиент, который доверяет этим корням, его примет. Firefox заблокировал сертификаты меньше чем за три часа, а 20 октября Mozilla убрала корень из своего хранилища NSS.

Приложения на OkHttp уязвимы, пока не обновится список доверенных корней платформы, а на Android и JVM это может занять очень долго. Поэтому Jesse Wilson 20 октября выложил обходной путь, а 22 октября вышли OkHttp 5.5.1 и 4.12.1, которые сами блокируют эти 8 сертификатов. Достаточно поднять версию.

Если обновиться сразу нельзя, подключите ForbiddenCertificatesHostnameVerifier из гиста, он работает со всеми поддерживаемыми версиями OkHttp:

val safeClient = client.newBuilder()
.hostnameVerifier(ForbiddenCertificatesHostnameVerifier())
.build()


⚠️ Первая версия обхода была на Interceptor, но он получает сертификаты слишком поздно, когда секреты уже ушли атакующему. Если вы скопировали её 20 октября, замените на HostnameVerifier. На устройствах с Google Play Services Google уже раздал автоматическое обновление, под угрозой прежде всего JVM и AOSP-устройства.


🔗 Jesse Wilson · Mozilla · Changelog 5.5.1 · 4.12.1

#Android #AndroidDev #OkHttp #Security
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34❤7👍4
Один и тот же пуш мгновенно приходит на Pixel — и не приходит вообще на Redmi. Разработчик часами копается в FCM, а виноват не он: Xiaomi, Redmi, Poco, Oppo, Realme, Vivo, iQOO и OnePlus добавляют поверх Android свой агрессивный менеджер батареи, который останавливает приложения в фоне. А остановленное приложение пушей не получает.

Что делают эти прошивки
• Автозапуск выключен по умолчанию (MIUI/HyperOS, ColorOS) — пуш, которому нужен ваш код, не может его запустить.
• Смахивание из недавних = Force stop. Android не доставляет сообщения force-stopped приложению, пока его не откроют.
• Профили экономии батареи ограничивают фон, иногда через несколько дней без открытия приложения.
• Уведомления на экране блокировки и всплывающие выключены — пуш пришёл, но пользователь его не видит.

Что можно сделать в приложении
• Важное — через notification messages, а не data-only: их показывает система без запуска вашего кода.
• High priority — только для того, что пользователь ждёт (подтверждение входа, статус заказа).
• Разные каналы для логинов и промо, чтобы отключение одного не глушило другой.
• Просите настройку один раз и в нужный момент, а не всем в первый день.
• Pull в дополнение к push: при открытии приложения подтягивайте пропущенное — тогда недошедший пуш лишь опоздал, а не потерялся.

Для экрана настроек есть стандартные интенты, а для автозапуска у вендоров публичного API нет:
// Системный список исключений из оптимизации батареи
startActivity(Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS))

// Страница настроек приложения: там на большинстве телефонов Autostart и батарея
startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", packageName, null)))


⚠️ Google Play разрешает прямой запрос исключения (REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) лишь в немногих случаях — большинству приложений стоит вести пользователя на экран настроек.


Как проверить, что дело в прошивке: отправьте одно и то же уведомление на Pixel/Samsung и на Xiaomi, смахнув приложение на обоих. Пришло на первом, но не на втором — это battery saver, и одними изменениями на сервере это не исправить.

⚠️ Названия пунктов меню меняются между версиями прошивок — актуальные инструкции по брендам собраны на dontkillmyapp.com.


🔗 Why push notifications go missing on Xiaomi, Oppo, Vivo and Realme

#Android #AndroidDev #FCM #Push #Xiaomi
👍34❤2
🚀 Sentry Android SDK стал на 20–30% быстрее при старте: что поменяли

SentryAndroid.init стоит на критическом пути запуска каждого приложения с Sentry, а таких стартов, по подсчётам компании, около 4,5 млрд в день. За квартал команда сделала больше 40 изменений и сократила инициализацию на 20–30% между версиями 8.43.0 и 8.54.0. Узкие места искали по трейсам Perfetto, в том числе с LLM, а каждый фикс проверяли Macrobenchmark.

Приёмы, которые пригодятся и в вашем коде:

👉 Настройки из манифеста — в байткод при сборке: SDK больше не парсит манифест, одно это дало 6,5%.

👉 Свой парсер DSN вместо java.net.URI: было до 6 мс, стало около 1 мкс.

👉 Общие пулы вместо разовых потоков: в ART каждый поток резервирует 1 МБ под стек.

Нужны SDK от 8.54.0 и Sentry Android Gradle Plugin от 6.20.0.

⚠️ Цифры сняты на синтетическом демо-приложении, в реальных проектах эффект может отличаться.


🔗 Sentry Blog

#Android #AndroidDev #Performance #Sentry
🔥17
🛒 Публикация приложения из России в 2026: опыт с пятью магазинами

Российская команда ИИ-репетитора английского Aisha выложила приложение в RuStore, Google Play, Huawei AppGallery и App Store, а в Samsung Galaxy Store так и не попала. Главные проблемы оказались не в модерации, а в документах и приёме оплаты.

👉 RuStore — регистрация ИП через VK и КЭП, одобрили за день, обновления проходят примерно за час. Подписки — через RuStore Pay.

👉 Google Play — D-U-N-S делали около месяца. Play Billing в России приостановлен, но для российских пользователей действует исключение: подписки принимают через RuStore Pay, Google за эти платежи не берёт комиссию. Модераторам схему пришлось объяснять в примечаниях к проверке. Обновления — 2–3 дня.

👉 Huawei AppGallery — для ИП хватило сканов документов, без D-U-N-S, сторонние платежи разрешены. Проверка — от двух дней, чаще около пяти.

👉 App Store — новым российским аккаунтам Paid Applications Agreement сейчас недоступно, поэтому оформить внешнюю ссылку на оплату не удалось. Вышла только бесплатная версия без внешних ссылок и с кнопкой мгновенного удаления аккаунта.

👉 Samsung Galaxy Store — даже для бесплатного приложения нужен статус коммерческого продавца с D-U-N-S и PayPal на домене компании. Заявку отклонили.

⚠️ Сроки проверок — личный опыт одной команды, а не обязательства магазинов.


🔗 Личный опыт публикации в магазинах приложений в России в 2026 году (Хабр)

#Android #AndroidDev #RuStore #GooglePlay
👍30❤2
🤖 Claude Sonnet 5.5 возглавил Android Bench

Google продолжает пополнять Android Bench — свой лидерборд LLM на реальных задачах Android-разработки. Теперь туда добавили Claude Sonnet 5.5, Gemini 4 Argon и GPT 6.1 Sol, и у рейтинга сменился лидер.

Long-horizon задачи (30 штук: миграции, конвертация приложений, новые фичи):
🥇 Claude Sonnet 5.5 (max) — 40,0%, $1574,9 за прогон
🥈 Claude Opus 5.5 (max) — 37,3%, $1150,3
🥉 GPT 6.1 Sol (max) — 29,3%, $99,5
• GPT 6 Astra (high) — 28,0%
• Gemini 4 Argon (high) — 21,3%

Sol почти в 16 раз дешевле Sonnet за прогон и примерно в 2,7 раза быстрее (26,6 ч против 70,7 ч).

Моделей Grok от SpaceXSI (бывшая xAI), включая флагманскую Grok 4.7, в Android Bench по-прежнему нет.

🔗 Android Bench

#Android #AndroidDev #AI #Benchmark
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤3
🤖 Gemma на 584 МБ без раздувания APK: модель раздаёт Google Play

Kevin Desai добавил в своё KMP-приложение PokeCollect ответы на вопросы о коллекции с помощью Gemma 3 1B на LiteRT-LM. Модель весит 584 МБ, и класть её в APK значит отпугнуть пользователя. Поэтому он вынес её в AI pack библиотеки Play for On-Device AI: хранит и раздаёт модель Google Play.

Модель живёт в отдельном модуле без кода и приезжает одним из трёх способов: вместе с установкой (install-time), сразу после неё (fast-follow) или по запросу (on-demand). Под капотом Play Asset Delivery.

// gemma_pack/build.gradle.kts
plugins { id("com.android.ai-pack") }
aiPack {
packName = "gemma_pack"
dynamicDelivery { deliveryType = "fast-follow" }
}

// app/build.gradle.kts
assetPacks += ":gemma_pack"
implementation("com.google.android.play:ai-delivery:0.2.0-beta01")


В рантайме AiPackManager отдаёт путь к файлу или запускает fetch(), а слушатель сообщает статус. Для загрузок больше 200 МБ по мобильной сети есть статус WAITING_FOR_WIFI.

⚠️ Библиотека в бете и работает только с AAB: нужны AGP 8.8+ и bundletool 1.18+. Лимит — 1,5 ГБ на пак. Для загрузки добавляется foreground service, его придётся задекларировать в Play Console с коротким видео.


🔗 Статья

#Android #AndroidDev #OnDeviceAI #GooglePlay #Gemma
❤17👍6
🤖 В Android-скиллах для агентов появились ML Kit Agent API, Jetpack Ink и память виджетов

Google выпустила v1.0.18 библиотеки Android skills — готовых инструкций, по которым AI-агент работает с конкретными API. Новых скиллов четыре:

👉 mlkit-agent-api — агентные сценарии прямо на устройстве через ML Kit GenAI Agent API на Gemini Nano и AICore

👉 ink-app-builder и ink-custom-brush-builder — рисование от руки на Jetpack Ink в Compose и свои кисти BrushFamily (androidx.ink 1.1.0-alpha03+)

👉 glance-appwidget-updates-and-memory — обновление виджетов на Glance и лимиты памяти на картинки в RemoteViews в Android 17, из-за которых тяжёлые картинки теперь роняют приложение

Ещё обновили 15 скиллов, среди них appfunctions, navigation-3, r8-analyzer и jetpack-compose-performance, а jetpack-compose/theming/styles удалили.

🔗 Релиз v1.0.18

#Android #AndroidDev #AI #AgentSkills
👍8
🤖 AGP 9.6: покрытие инструментальных тестов без JaCoCo при сборке

Чтобы посчитать покрытие кода инструментальными тестами, Android Gradle Plugin (AGP) по умолчанию встраивает счётчики JaCoCo в классы приложения прямо во время сборки. В AGP 9.6.0-alpha01 появился экспериментальный режим с агентом на устройстве: приложение собирается без этого кода, а классы инструментирует агент на тестовом устройстве во время прогона.

По данным Google, сборка ускоряется на 10–20%, debug APK становится меньше на 20–25%, а неиспользуемые сгенерированные классы перестают занижать процент покрытия. Режим включается двумя флагами в gradle.properties поверх привычного enableAndroidTestCoverage = true:

android.experimental.androidTest.coverage.useOnDeviceAgent=true
android.experimental.reportAggregationSupport=true


Отчёт строит та же задача create<Variant>AndroidTestCoverageReport. Нужны устройство с Android 9 или новее и debuggable-сборка.

⚠️ Цифры не совпадут со старыми отчётами: агент считает инструкции DEX, а не Java-байткода, а классы, которые не загрузились во время тестов, в отчёт не попадают. Пороги покрытия при переходе стоит пересмотреть.


🔗 Документация

#Android #AndroidDev #Gradle #Testing
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤4
🚀 Фоновая работа в отдельном процессе: новый раздел гайда Google по памяти

В гайде по памяти на developer.android.com появился раздел о том, как держать фоновую работу в лёгком процессе. Android управляет памятью на уровне процесса, а не компонента. Если foreground service (сервис с уведомлением) с загрузкой или синхронизацией живёт в одном процессе с UI, весь процесс сохраняет высокий приоритет, и в памяти остаются остановленные Activity, дерево View и GPU-контексты.

В Android 17 это бьёт по самому приложению: пока у него нет видимого UI, действует более строгий общий лимит памяти на все его процессы. При превышении система притормаживает приложение, а потом может его завершить. Google советует вынести сервис в android:process=":bg". Тогда UI-процесс уходит в кэш, где система его замораживает и сжимает, а воркер работает с минимумом памяти. С Android 17 QPR2 такому процессу можно задать собственный бюджет (нужен AGP 9.5.0 или новее):

<processes>
<process android:process=":bg">
<memory-budget android:maxMb="32" />
</process>
</processes>


⚠️ Application.onCreate вызывается в каждом процессе. Проверяйте Application.getProcessName() и не инициализируйте в :bg UI-библиотеки и нативные движки.


Второй новый раздел объясняет, как вернуть страницы памяти системе через madvise и posix_fadvise, если у вас свои нативные аллокаторы или большие ассеты.

🔗 Lean process · Return memory pages

#Android #AndroidDev #Performance
👍28🔥3❤1
🤖 MultisensoryManager: системные звук и вибрация для типовых действий в UI

В Android 17 QPR2 появился MultisensoryManager, API для Multisensory Design System (MSDS). Это набор готовых токенов обратной связи: звук и вибрация, которые система синхронизирует между собой и подстраивает под возможности конкретного устройства. Подбирать свои паттерны вибрации для переключателей и жестов больше не нужно.

Токены покрывают два случая: отклик на жесты, когда пользователь двигает элементы UI, и смысловой отклик на смену состояния, выбор или прогресс. Проигрывается токен одним вызовом:

val manager : MultisensoryManager=  context.getSystemService()

Switch(checked = checked, onCheckedChange = { isChecked ->
checked = isChecked
manager?.playToken(
if (isChecked) MultisensoryManager.TOKEN_SWITCH_ON
else MultisensoryManager.TOKEN_SWITCH_OFF
)
})


Google рекомендует проигрывать отклик в момент, когда пользователь видит результат действия, чтобы анимация, звук и вибрация совпали. Вызов закрывается проверкой Build.VERSION_CODES_FULL.CINNAMON_BUN_2.

🔗 Документация

#Android #AndroidDev #Haptics
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤1
🔥 Сторонние магазины приложений в России и Беларуси смогут ставить приложения в один тап

Google открыла запись в программу Registered App Stores. Зарегистрированный магазин устанавливает и обновляет приложения без лишних системных подтверждений. Участие добровольное, остальные магазины работают как раньше. Новые возможности включатся 1 декабря 2026 года на устройствах с Android 17 QPR2 и новее.

👉 Что получает магазин: установку в один тап, автоматическое разрешение на установку вместо ручного включения REQUEST_INSTALL_PACKAGES в настройках и обновления приложений в фоне

👉 Где работает: в списке стран есть Россия, Беларусь, Казахстан и Узбекистан, а США и Евросоюза пока нет. Доступность зависит от страны аккаунта пользователя

👉 Что нужно магазину: аккаунт организации в Android Developer Console, пройденная верификация разработчика, ежегодный взнос и передача всего каталога в Google для проверки на вредоносное ПО

🔗 Android Developers · Android Authority

#Android #AndroidDev #GooglePlay
🔥26👍8
🛒 Google Play начнёт оценивать приложения на складных устройствах: адаптированные получат больше показов

На Android Dev Summit Google объявила, что со следующего года Play будет смотреть, как приложения и игры работают на складных смартфонах. Хорошо адаптированным обещают больше возможностей показать себя в магазине. Конкретные требования Google опубликует до конца года.

👉 Чем готовиться: гайдлайны качества адаптивных приложений, для игр — отдельные

👉 Compose adaptive skill для агентов научился позам складных: экраны камеры и медиа он переводит в раскладку для полусложенного телефона на столе

👉 Под Googlebook тот же скилл проверяет UI и добавляет горячие клавиши, курсоры, hover-состояния и подсказки

Будут ли штрафы в поиске для неадаптированных приложений, Google пока не сказала.

🔗 Android Developers Blog · Android Authority

#Android #GooglePlay #AndroidDev
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤2
🤖 Свежая статистика версий Android: Android 16 на четверти устройств, Android 17 на 1%

Google обновила в Android Studio данные о версиях Android, впервые с декабря 2025 (прошлый срез). Цифры на 1 октября, по устройствам, которые заходили в Google Play за 7 дней. Studio показывает только накопительную долю, доли версий по ней посчитал heise.

👉 Android 16 (API 36): 25,4%. Теперь это самая распространённая версия, в декабре было 7,5%

👉 Android 17 (API 37): 1%, хотя вышел в середине июня. Срок от релиза до среза в этом году короче, чем у Android 16

👉 Для выбора minSdk: API 34+ стоит на 56,4% устройств, API 30+ на 88,3%, API 29+ на 94%. Android 11 до сих пор держит 10,5%

🔗 heise · Android Authority

#Android #AndroidDev #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🤖 Google переписал гайд по SQLite на Android: где база тратит лишнюю память и время

В гайде Google по производительности SQLite раньше были общие советы про индексы и WAL. Теперь там есть разделы про память соединений, кэш скомпилированных запросов и разбор запросов в Perfetto. Базовые советы для Room мы уже разбирали, а про зависание Room 3 из-за SQLite-драйвера писали здесь.

👉 WAL включайте через фреймворк, а не через PRAGMA journal_mode=WAL. Только тогда Android открывает пул соединений, чтобы чтение шло параллельно с записью, и ставит синхронный режим NORMAL. После ручного PRAGMA у базы одно соединение, и каждый коммит делает fsync. Room включает WAL сам на всех устройствах, кроме low-RAM.

👉 Один SQLiteOpenHelper или RoomDatabase на файл. У каждого экземпляра свои кэши. В бенчмарке Google объединение двух хелперов на один файл почти вдвое сократило page cache и больше чем вдвое снизило p95 задержки запросов. Дубли видно в adb shell dumpsys dbinfo <package>: один путь под несколькими Connection pool for.

👉 Кэш скомпилированных запросов вмещает 25 штук. Если в горячих путях запросов больше, SQLite компилирует их заново. Сначала уберите склейку SQL из строк, потом поднимите лимит до 100:

override fun onConfigure(db: SQLiteDatabase) {
db.setMaxSqlCacheSize(SQLiteDatabase.MAX_SQL_CACHE_SIZE)
}


Ещё в гайде есть готовые PerfettoSQL-запросы: самые частые операции, запросы дольше 1 мс на главном потоке и записи вне транзакций.

⚠️ Редко используемую базу лучше закрывать: открытая Room-база в простое держит около 678 КБ page cache и 5 файловых дескрипторов. Но базу, к которой вы ходите каждые несколько секунд, не закрывайте, иначе при каждом открытии кэши собираются заново.


🔗 Best practices for SQLite performance

#Android #AndroidDev #SQLite
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🚀 Какой бюджет памяти поставить приложению на Android 17: Google описал, как найти его замером

С Android 17 QPR2 приложение может объявить в манифесте <memory-budget android:maxMb="...">. Если приложение его превышает, система не убивает процесс, а выгружает холодные страницы и сжимает неактивную кучу в zRAM. Мы уже писали про системные лимиты памяти и бюджет для фонового процесса, но было неясно, какое число ставить. Теперь в гайде есть раздел о том, как подобрать его замером.

Искать нужно «колено»: самый низкий бюджет, при котором система выкидывает только ненужное (кэши картинок с прошлых экранов, буферы старта, однажды прочитанные файлы). Ниже колена приложение начинает подтягивать обратно свои же страницы. Это видно по счётчикам workingset_refault_* в memory.stat, а потом и по джанку.

👉 Замеряйте release-сборку с R8 на Android 17 QPR2 или новее, на сценарии в 30–60 секунд через Macrobenchmark или UI Automator. Отдельно для foreground, perceptible и background: простаивающее приложение ничего не покажет.

👉 Бюджет меняется без пересборки: adb shell am memory-limiter manual <PID> 120MB, а none вместо числа его снимает. Начните с пика без бюджета и снижайте по 10–15 МБ, каждый вариант гоняйте минимум трижды.

👉 Вариант проходит, если процесс выжил, refault почти не выросли, CPU прибавил не больше 5%, доля janky-кадров не больше 1 п.п., а P95 кадра не больше 3 мс.

⚠️ Ручной лимит через am memory-limiter заодно выставляет жёсткий memory.max, поэтому слишком низкое значение может убить процесс. Такой вариант считайте провальным.


🔗 Set app memory budgets

#Android #AndroidDev #Android17
❤5👍3🔥2