Android Broadcast
Подборка новостей и статей для Android разработчиков. Реклама и связь с автором @ab_manager РКН https://abdev.by/rkn_tg_ab #MQRZR
Ko'proq ko'rsatish📈 Telegram kanali Android Broadcast analitikasi
Android Broadcast (@android_broadcast) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 14 573 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 8 794-o'rinni va Rossiya mintaqasida 44 714-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 14 573 obunachiga ega bo‘ldi.
26 Oktabr, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni 61 ga, so‘nggi 24 soatda esa -1 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 39.85% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 23.09% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 5 811 marta ko‘riladi; birinchi sutkada odatda 3 367 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 28 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent api, kotlin, gradle, сборка, androiddev kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Подборка новостей и статей для Android разработчиков.
Реклама и связь с автором @ab_manager
РКН https://abdev.by/rkn_tg_ab #MQRZR”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 27 Oktabr, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
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
kill -3 показал корутину, навсегда вставшую на локе внутри PassthroughConnectionPool в suspend-функции DAO с @Transaction и телом.
Почему так: Room спрашивает у драйвера hasConnectionPool. AndroidSQLiteDriver отвечает true, и Room не заводит свой пул: остаётся одно соединение, привязанное к потоку, без таймаута ожидания. Если код транзакции сменит диспетчер, транзакция ждёт сама себя. Исправление этого дедлока заявлено в Room 3.0.2, но у автора зависало именно на 3.0.2, а в 3.0.3 чинили регрессию от этого исправления.
Как исправить: передать в билдер BundledSQLiteDriver. Он возвращает false, и Room поднимает собственный пул: в WAL четыре читателя и один писатель, а при долгом ожидании через 30 секунд прилетает SQLiteException вместо тихого зависания. Room тоже стоит обновить до актуальной версии.
Room.databaseBuilder<AppDatabase>(context, DB_NAME)
.setDriver(BundledSQLiteDriver()) // was AndroidSQLiteDriver()
.setJournalMode(JournalMode.WRITE_AHEAD_LOGGING)
.build()
⚠️ Что учесть при смене драйвера: • в APK появится своя SQLite: около 620–650 КБ на ABI в сжатом виде, в universal APK все четыре ABI, примерно 2,5 МБ; • соединений станет несколько, Room сам ставит на каждое🔗 dev.to #Android #Room #KotlinPRAGMA synchronous(в WAL это NORMAL), аRoomDatabase.Callback.onOpenвызывается один раз на базу, поэтому PRAGMA оттуда применится только к одному соединению. Автор задаёт её в обёртке над драйвером; • в такой обёртке делегируйтеinTransaction(), иначе дефолтная реализация броситNotImplementedError.
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 #AgentSkillsstylePropertyOf и styleLocalOf.
Пока идёт переделка, с developer.android.com сняли весь раздел про Styles (основы, темизацию, анимации состояний, сравнение с Modifier, рекомендации и ограничения), а также опубликованный ранее скилл для AI-агентов. В Compose 1.13 Styles API остаётся @Experimental.
⚠️ Если вы уже пробовали Styles в коде, API ещё поменяется. Новую форму обещают показать отдельно и собрать по ней отзывы.🔗 Styles update #Compose #JetpackCompose #Android
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
⚠️ Сроки проверок — личный опыт одной команды, а не обязательства магазинов.🔗 Личный опыт публикации в магазинах приложений в России в 2026 году (Хабр) #Android #AndroidDev #RuStore #GooglePlay
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
// Системный список исключений из оптимизации батареи
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
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
Buy milk tomorrow at 7pm получается Buy milk и завтрашние 19:00 в выбранной таймзоне.
Библиотека для Kotlin Multiplatform понимает английский и русский: Android, JVM и iOS. Она разбирает даты, время, диапазоны вроде «завтра с 17:30 до 20:00» и повторения вроде «каждые 2 дня». Context и инициализация не нужны.
val parser = DateParser()
val matches = parser.parse(
text = "buy in 5 hours",
reference = Instant.parse("2024-02-28T10:15:00Z"),
timeZone = TimeZone.UTC
)
val instant = matches.single().instant // 2024-02-28T15:15:00Z
Неоднозначные даты не угадываются: 03/04/2026 без явного DateOrder.MDY или DMY вернёт пустой результат. Кроме момента времени, DateMatch отдаёт конец диапазона, период повторения и оставшийся текст напоминания.
⚠️ Парсер построен на правилах: произвольный текст за пределами поддерживаемых форм может не распознаться. Android — от API 26, Swift/XCFramework-дистрибутива нет. Версия 0.1.3, репозиторий создан в октябре.🔗 GitHub · Документация · klibs.io #Kotlin #KMP #Multiplatform #OpenSource
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./gradlew assembleDebug; не «бери свежие версии», а «версии из gradle/libs.versions.toml, новые зависимости — только после вопроса». Навыки устаревают, поэтому свежие факты агенту лучше давать через поиск по документации в Android CLI.
В квикстарте инструменты подобраны под опыт: новичкам — Google AI Studio, своему агенту вроде Claude Code — Android CLI и skills, для продакшена — Android Studio.
🔗 Как работают агенты · Квикстарт
#Android #AndroidDev #AI #AIAgents⚠️ Это альфа-версия: нужны Apple Silicon и macOS 26.4+, часть приложений пока не запускается.🔗 GitHub · Как это устроено · Для разработчиков #Android #AndroidDev #macOS #OpenSource
ANDROID10 действует на сайте Эргостол и на Ozon!
Как насчёт апгрейда кресла? 🪑
🎥Смотрите обзор кресла Экзо Флекс: https://abdev.by/EiMt
👉 Выбрать себе обновления можно: тут
#рекламаproguard-android-optimize.txt и добавила Baseline и Startup Profiles, через девять месяцев — на R8 full mode. Вместо широких исключений нашли конкретные классы, к которым обращаются через рефлексию и динамические прокси, и написали для них точечные keep-правила. Оценки оптимизации R8 теперь отслеживают в CI, а новые keep-правила планируют пропускать только с обоснованием.
Итог: ANR меньше на 32%, холодный старт быстрее на 35%. Недавно писал, что Google взялся за R8 всерьёз, — вот как это выглядит на большом проекте.
🔗 Кейс Grab
#Android #AndroidDev #R8 #Performancedatastore-tink, а 12 октября вышел 1.3.0-rc01, то есть API уже стабилен.
Шифрование подключается обёрткой над вашим сериализатором: AeadSerializer шифрует данные через Tink (AES-256-GCM), а ключ защищён Android Keystore.
// keysetHandle создаётся через AndroidKeysetManager
val aeadSerializer = AeadSerializer(
aead = keysetHandle.getPrimitive(
RegistryConfiguration.get(), Aead::class.java
),
wrappedSerializer = SettingsSerializer,
// уникальное имя защищает от подмены шифротекста
associatedData = "settings.json".encodeToByteArray(),
)
val dataStore = dataStore(
fileName = "settings.json",
serializer = aeadSerializer,
scope = scope,
)
Работает на Android и JVM. Ошибки расшифровки приходят как CorruptionException, так что их ловит обычный CorruptionHandler. Заодно в 1.3 появился DataStore.Builder, и Google советует переходить на него с DataStoreFactory.
🔗 Release notes DataStore · Разбор на ProAndroidDev
#Android #AndroidDev #DataStore #Securitytasks-genai вышла на Google Maven ещё в конце апреля. Если вы через MediaPipe встроили в приложение языковую модель, которая работает прямо на телефоне, она продолжит работать, но всё новое теперь появляется только в LiteRT-LM, так что переезд стоит спланировать заранее.
LiteRT-LM — рантайм Google для языковых моделей поверх LiteRT. У него свой Kotlin API для Android и JVM с ускорением на GPU и NPU, мультимодальностью и вызовом инструментов. Модели нужны в формате .litertlm, готовые лежат в LiteRT Community на Hugging Face. Актуальная версия — litertlm-android:0.18.0, ещё до 1.0. Базовый сценарий из документации:
val engine = Engine(EngineConfig(modelPath = modelPath, backend = Backend.GPU()))
engine.initialize() // до ~10 секунд, не на главном потоке
engine.createConversation().use { conversation ->
conversation.sendMessageAsync("Привет!").collect { print(it) }
}
Для GPU в манифест нужно добавить uses-native-library для libOpenCL.so и libvndksupport.so с required="false".
⚠️ В AAR LiteRT-LM 0.18.0 нативные библиотеки есть только для arm64-v8a и x86_64. На 32-битных ARM-устройствах загрузка упадёт с🔗 MediaPipe LLM Inference · LiteRT-LM для Android · dev.to #Android #AndroidDev #AI #LiteRTUnsatisfiedLinkError, поэтому проверяйтеBuild.SUPPORTED_ABISзаранее — на это наткнулся Charles Hartmann.
