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

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

РКН https://abdev.by/rkn_tg_ab #MQRZR
Download Telegram
🤖 Handoff в Android 17 — очень интересно, но пока много вопросов

Handoff — новая функция и API, появляющиеся в Android 17. Она предназначена для реализации cross-device continuity — возможности начать работу с активностью приложения на одном Android-устройстве и продолжить её на другом устройстве, связанном с тем же Google-аккаунтом.

На текущий момент попробовать функцию невозможно: API ещё недоступен, а сам сервис не работает даже в эмуляторе с Android 17 Beta 1.

По своей идее Handoff сильно напоминает Continuity в iOS. Вероятно, эта функциональность станет важной частью развития Android в сторону desktop-сценариев и Android for Desktop.

Технически Handoff основан на восстановлении состояния активности на другом устройстве. Концептуально это похоже на восстановление из Saved State, однако появляются новые ограничения и вопросы. Например, данные, сохранённые только локально, автоматически перенести не получится — их потребуется загружать заново. Также пока неясно, каким образом будет организована работа с навигацией и насколько необходимым станет общий или синхронизируемый state приложения.

Пока остаётся ждать официальных примеров и рекомендаций от Google.

🔗 Источник — Android 17 Changes

#Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯37👍20👎6🔥21🤔1
🤖 В Android 17 переписали один из самых старых и критичных механизмов работы UI потока.

Это изменение почти никто не увидит в 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.

‼️ Большинству приложений ничего делать не нужно — улучшение происходит автоматически. Но обратить внимание стоит тем, кто занимается производительностью, анализирует Perfetto-трейсы или использует рефлексию и внутренние поля MessageQueue. Такие вещи могут перестать работать, потому что внутренняя реализация изменилась.

На самом деле это интересный сигнал о направлении развития Android. Долгое время оптимизации происходили на уровне API и фреймворков. Сейчас Google всё чаще переписывает базовые механизмы конкурентности самой платформы. И это логично: современные устройства уже редко упираются в вычислительную мощность, чаще — в синхронизацию потоков и contention. MessageQueue находится в центре всей работы UI-потока, поэтому даже небольшие улучшения здесь масштабируются на всю экосистему.

🔗 Больше подробностей про работу механизма можно найти в техническом разборе от Google

#Android #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥189👍4128👎6
🤖 Очередная порция ограничений для Activity в Android 17

Копался в behavior changes для Android 17 и наткнулся на очередное закручивание гаек вокруг запуска Activity из фона.

На этот раз Google расширил BAL (Background Activity Launch) ограничения на IntentSender

IntentSender - это обёртка над 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👌73🤯3
This media is not supported in your browser
VIEW IN TELEGRAM
В Android 17 на Pixel появится возможность запускать приложение как плавающее окно. Да-да. Вы скажете, что это давно уже было на многих планшетах. Теперь и в стоковой оболочки Pixel будет, хотя вот другим производителям всё равно от этого изменения

#Android #Android17
👎15🤔98🔥6👍4🤯3
This media is not supported in your browser
VIEW IN TELEGRAM
🤖 EyeDropper API - встроенный пикер цвета в пикселе на Android 17. Вот я не понял кому этого так не хватало?

#Android #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥36🤔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
👍22👎7🤔3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
📹 В Android перестали появляться новые фичи. Разбирай каждый год новую версию ОС от Google я вообще не вижу там ничего существенно. Всё происходит для улучшения самой ОС: архитектуры, механизмов, ART, работы с памятью, а часть этих фичей доставляют и на предыдущие версии ОС.

Что это? Стагнация? Постепенное закрытие Android или подготовка к будущей трансформации ОС? Делюсь мыслями в новом видео https://youtu.be/WIhFnKRMIfY?si=QVsYvdJLVpmCFS8u

#AndroidBroadcast #Android #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
👎37👍183🔥1🤔1
🤖 В Android 17 запретят прямой доступ к контактам (скорее всего через требование Google Play). На смену приходит Contact Picker

В Android 17 появится встроенный пикер контактов, который позволит выбирать один или несколько контактов, задавая поля которые вам нужны.

Ранее уже был ACTION_PICK, а теперь будет ACTION_PICK_CONTACTS, который запускает спец лаунчер. Для приложения с targetSdk Android 17 и выше будет происходить автоматическая замена на ACTION_PICK_CONTACTS при вызове ACTION_PICK для контактов.

// Указываем какие поля надо получить
val requestedFields = arrayListOf(
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
)

// Создаем Intent
val pickContactIntent = Intent(Intent.ACTION_PICK_CONTACTS).apply {
type = ContactsContract.Contacts.CONTENT_TYPE
putStringArrayListExtra(Intent.EXTRA_REQUESTED_DATA_FIELDS, requestedFields)
}

// Запускаем Intent Laucnher
pickContactLauncher.launch(pickContactIntent)


Пишут что это можно протестировать на старых версиях Android. При отправки Intent c ACTION_PICK надо будет добавить EXTRA_USE_SYSTEM_CONTACTS_PICKER.

Хорошее изменение, давно уже пора было ограничить приложениям доступ ко всем контактам, только вот гранулярный доступ как это было сделано с фото эффективнее, чем пикер. Если со стороны Google Play не будет ограничений для приложений, чтобы использовать разрешение `READ_CONTACTS`, то какой смысл в этой новинках.

Я попытался запустить новый пикер на сборке эмулятора Android 17 Beta 2, но пока там ничего не работает. Наверное поэтому и нету ни одной демонстрации его работы в официальной документации.

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

#Android #AndrooidDev #Android17 #Безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍86👎10🔥4🤔3
🤖 Google рассказала больше про Contact Picker из Android 17

Вышла отдельная статья в блоге со скриншотами — можно наконец посмотреть как пикер выглядит в живую.

Из того, что не было в анонсе: на Android 17 старые ACTION_PICK с контактными типами автоматически апгрейдятся до нового пикера. То есть часть приложений получит приватный выбор контактов вообще без изменений кода. Приятный бонус для тех, кто не торопится мигрировать.

В Compose интегрируется через rememberLauncherForActivityResult — код в статье рабочий, можно брать напрямую.

🔗 Источник: android-developers.googleblog.com
📖 Документация: developer.android.com

#Android #AndroidDev #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍47👎9
🤖 Android 17 закручивает гайки для фонового аудио

В Android 17 появилось новое ограничение, которое затронет авторов музыкальных плееров, подкаст-приложений и всего, что воспроизводит звук в фоне без видимого UI.

Суть в следующем: теперь аудио фреймворк проверяет, имеет ли приложение право взаимодействовать с аудио в фоне. Без корректно запущенного foreground service с While-In-Use (WIU) возможностями звук просто отключится.

WIU — это условие, при котором Foreground Service запущен из видимого UI или в ответ на MediaSessionEvent. Если FGS запущен, например, по BOOT_COMPLETE и лезет в аудио — он будет заблокирован.

Рекомендуемый путь — использовать Jetpack Media3 MediaSessionService, который сам управляет жизненным циклом и не требует дополнительных телодвижений. Если media3 не используется, нужно вручную следить за тем, чтобы mediaPlayback FGS запускался из foreground и оставался живым на время транзиентных сбоев (не дольше 10 минут).

На мой взгляд, изменение правильное. Баги, когда приложение просыпается через несколько часов после заморозки и неожиданно начинает воспроизведение — реальная проблема. Другой вопрос, что тихая блокировка без каких-либо ошибок в API сделает диагностику неочевидной. Инструменты вроде `adb dumpsys audio` и logcat помогут, но разработчики, которые не читают changelog, узнают об этом только от пользователей.

🔗 Источник developer.android.com

#Android #AndroidDev #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
👍44👎14
Оказывается Android Automotive всё ещё жива. Новостей про неё мало, но вот иногда доносится. Подробнее в блоге

#Android #Android17 #Automotive
👎12👍5
🤖 Android 17 меняет подход к приватности геолокации.

Вышла Android 17 Beta 3 и все изменения там касаются геолокациии

👉 Location Button — разовый доступ к точной геолокации
Новый UI-элемент из Jetpack, который даёт доступ к точным координатам прямо в момент нажатия, без постоянного разрешения. Пользователь нажал кнопку "поделиться местоположением" в вашем приложении — получил данные один раз в рамках сессии. Никаких диалогов с выбором "разрешить всегда / только сейчас". Кнопку можно кастомизировать: цвет, форма, текст из предопределённого списка. Иконка местоположения остаётся обязательной и неизменной. На Android 16 и ниже Jetpack автоматически откатывается к стандартному диалогу разрешений.

👉 Примерная геолокация стала умнее
До этого "приблизительный" режим использовал фиксированную сетку 2×2 км. В малонаселённых районах это фактически деанонимизирует пользователя, потому что в квадрате 2 км может быть буквально несколько человек. В Android 17 размер ячейки теперь зависит от плотности населения — чем меньше людей, тем больше область. Логично, что давно должно было быть так.

👉 Индикатор использования геолокации
По аналогии с микрофоном и камерой, при любом обращении к геолокации теперь будет появляться системный индикатор. Плюс — диалог с историей последних обращений с возможностью сразу перейти в настройки разрешений.

👉 Переработанный диалог разрешений
"Точное" и "Приблизительное" местоположение теперь визуально сильнее разделены, чтобы пользователь осознанно выбирал нужный уровень доступа.

🔗 Источник: android-developers.googleblog.com

#Android #AndroidDev #Android17 #Приватность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍68👎8
🤖 В Android 17 нельзя менять `static final` поля через рефлексию или JNI. Звучит логично — static final по определению константа, но на практике это использовалось годами для разных хаков.

👉 Попытка изменить такое поле через рефлексию бросает IllegalAccessException
👉 Попытка через JNI SetStaticLongField() и аналоги — сразу краш приложения
👉 Ограничение включено только для приложений с targetSdk = 37, но в Beta 1 проверка активна для всех приложений, чтобы выловить проблемы раньше

Зачем это нужно? Пока static final поле формально могло меняться, рантайм не мог агрессивно оптимизировать код, который к нему обращается. Теперь — может. На практике это чаще всего задевает тесты, которые через рефлексию подменяют константы в production-коде, и старые хаки с логированием или конфигурацией. Где-то жить станет чуть сложнее, но в целом всё закономерно — меньше хаков, честнее код.

🔗 Источник: developer.android.com

#android #android17
Please open Telegram to view this post
VIEW IN TELEGRAM
👍59👎8
🤖 Улучшение подписи APK в Android 17

Android 17 добавляет поддержку гибридной схемы подписи APK с постквантовым алгоритмом ML-DSA. Классический ключ подписи комбинируется с постквантовым и подпись становится устойчивой к атакам с использованием квантовых вычислений.

Схема гибридная, а не замена старому подходу, поэтому обратная совместимость сохраняется. Старые устройства верифицируют подпись через классический ключ, новые получают дополнительный слой защиты через ML-DSA.

‼️ ВАЖНО Старый классический ключ переиспользовать нельзя. Это не обновление существующего ключа, а смена подписи, нужно создавать новую пару. Если используете Google Play App Signing, всё сделает Google Play, просто дождитесь опции в консоли. При самостоятельном управлении ключами понадобится обновлённый apksigner.

Квантовые компьютеры, способные реально угрожать текущим подписям,появятся не скоро, да и натравливать его на взлом APK - странный сценарий использования такой машины. Но инфраструктурные вещи лучше внедрять заранее, и хорошо, что Play App Signing снимает эту задачу с большинства из нас.

🔗 Источник: developer.android.com

#Android #Android17 #Безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43👎6
🛒 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
👍31👎9
🤖 Вышел Android 17 Beta 4

Что нового:
👉 Ограничения на выделяемую память для приложений (некий новый механизм)
👉 Автоматической обнаружение аномалий в использовании приложениями ресурсов устройства
👉 Пост квантовое шифрование в Android Keystore

Подробно читайте в отдельных постах @android_broadcast

🔗 Источник Android Developers Blog

#Android #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
👍37👎5
🤯 Android 17 умеет убивать ваше приложение молча. Без стектрейса. Разбираемся. И ЭТО БЕЗ КЛИКБЕЙТА

Начиная с Android 17, появился системный MemoryLimiter — лимит памяти на процесс, привязанный к общему объёму RAM устройства. Превысил лимит — процесс убит. Без exception, без стектрейса.

Как это выглядит:
👉 причина завершения в ApplicationExitInfo = REASON_OTHER
👉 в описании строка "MemoryLimiter:AnonSwap"
👉 в Crashlytics этого НЕ будет: это не краш, а системное убийство процесса

И сразу разрушим главное заблуждение: это НЕ про heap size.

getMemoryClass() и largeHeap ограничивают только Java-кучу — объекты под управлением ART. Превысил и получишь OutOfMemoryError со стектрейсом, который ловится. А новый MemoryLimiter считает другое - анонимную память ВСЕГО процесса:
👉 битмапы (с Android 8 их пиксели в нативной памяти, в Java-куче их нет)
👉 нативные библиотеки, медиакодеки, Skia
👉 веса on-device ML/LLM моделей

Всё это в getMemoryClass() не видно. Можно сидеть втрое ниже heap-лимита, никогда не словить OOM — и всё равно быть убитым, потому что суммарная нативная память процесса вылезла за порог. getMemoryClass и OOM — про Java-кучу. MemoryLimiter — про весь процесс. Это два разных предохранителя, и старый про новый вам ничего не скажет.

Важные оговорки, чтобы не было паники на пустом месте:
👉 в Android 17 лимиты заданы консервативно: цель — экстремальные утечки и выбросы, а не нормальные приложения
👉 включены только на части устройств
👉 конкретных чисел Google не публиковал. Реальный лимит своего девайса можно снять командой: adb shell am memory-limiter status

В зоне риска тяжёлые сценарии на устройствах среднего и бюджетного сегмента.
Уже есть задокументированный случай на бете — крупная on-device модель Gemma падала на Pixel 6a с 6 ГБ RAM именно из-за MemoryLimiter. 6 ГБ — это уже не бюджетник. Java-куча там небольшая, а нативка с весами модели — гигабайты в RAM.

Два мифа, которые гуляют по сети и которые повторять не надо:
👉 НЕТ подтверждения, что система шлёт «вежливое предупреждение» перед убийством
👉 НЕТ официального «дедлайна для разработчиков 30 июня». Google его не объявлял

Это первый раз, когда дисциплина по памяти не совет, а правило от ОС. Сейчас лимиты мягкие, но направление одностороннее — закручивать будут, а не отпускать. И самое неприятное тут не сам лимит, а его невидимость: пользователи будут терять сессии, а вы не узнаете, пока специально не начнёте смотреть.

💬 Как вы думаете, связаны ли меры с тем, что оперативка стала дорожать и вставить по 12–16 ГБ стало дорого?

#Android #Android17 #Производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
👎69👍195👏2🎉11
🤖 Android 17 вышел — API level 37 уже на Pixel

Google выпустила финальный Android 17. Исходники открылись в AOSP, обновление катится на поддерживаемые Pixel-устройства.

Главный сигнал релиза: Android официально Compose-first. Все новые API, библиотеки, инструменты и документация будут создаваться только для Jetpack Compose. View (android.widget), Fragments, RecyclerView, ViewPager переходят в maintenance mode: только критические баги, никаких новых фич. Вопрос «когда View умрёт» закрыт — она уже в maintenance.

Breaking changes при таргете SDK 37:

👉 resizeableActivity=false, screenOrientation, minAspectRatio / maxAspectRatio игнорируются системой на large screen (sw > 600 dp). Игры освобождены, остальные нет.

👉 static final поля нельзя менять через reflection: IllegalAccessException. Через JNI — краш.

👉 Native-библиотеки через System.load() должны быть read-only, иначе UnsatisfiedLinkError.

👉 Доступ к локальной сети заблокирован по умолчанию: нужен ACCESS_LOCAL_NETWORK.

👉 Lock-Free MessageQueue быстрее, но ломает код с reflection на приватных полях.

‼️ ВАЖНО CameraX: обновитесь до 1.5.2 или 1.6.0+ — краш на Android 17 из-за нового режима dynamic range.

Из остального: Generational GC в ART, жёсткие лимиты памяти с принудительным завершением процессов, Post-Quantum Cryptography (ML-DSA), AppFunctions как on-device MCP API для AI-агентов (alpha, Gemini в private preview).

#Android #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥64👍8👎631
Media is too big
VIEW IN TELEGRAM
Короткий разбор что нового в Android 17 от Google

0:00 Вступление
0:14 Intelligence System: AppFunctions
0:48 Adaptive-first: большие экраны
1:09 Производительность: память и ART
1:47 Приватность и безопасность
2:20 Камеры и медиа
2:41 Итоги

#Android17 #Android
👍20👎16
🤖 Вышла Android 17 QPR2 Beta - первая бета Android 17.1, которая выйдет в 4 квартале. Пока там только багофикс

#Android #AndroidDev #Android17
Please open Telegram to view this post
VIEW IN TELEGRAM
16👎7