Платформа Android 16 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения поведения применяются ко всем приложениям , работающим на Android 16, независимо от targetSdkVersion
. Вам следует протестировать свое приложение, а затем при необходимости изменить его для поддержки этих изменений, где это применимо.
Обязательно ознакомьтесь также со списком изменений поведения, которые влияют только на приложения, ориентированные на Android 16 .
Основная функциональность
Android 16 (уровень API 36) включает следующие изменения, которые изменяют или расширяют различные основные возможности системы Android.
Оптимизация квот JobScheduler
Starting in Android 16, we're adjusting regular and expedited job execution runtime quota based on the following factors:
- Which app standby bucket the application is in: in Android 16, active standby buckets will start being enforced by a generous runtime quota.
- If the job starts execution while the app is in a top state: in Android 16, Jobs started while the app is visible to the user and continues after the app becomes invisible, will adhere to the job runtime quota.
- If the job is executing while running a Foreground Service: in Android 16, jobs that are executing while concurrently with a foreground service will adhere to the job runtime quota. If you're leveraging jobs for user initiated data transfer, consider using user initiated data transfer jobs instead.
This change impacts tasks scheduled using WorkManager, JobScheduler, and
DownloadManager. To debug why a job was stopped, we recommend logging why your
job was stopped by calling WorkInfo.getStopReason()
(for
JobScheduler jobs, call JobParameters.getStopReason()
).
For more information on battery-optimal best practices, refer to guidance on optimize battery use for task scheduling APIs.
We also recommend leveraging the new
JobScheduler#getPendingJobReasonsHistory
API introduced in
Android 16 to understand why a job has not executed.
Testing
To test your app's behavior, you can enable override of certain job quota optimizations as long as the app is running on an Android 16 device.
To disable enforcement of "top state will adhere to job runtime quota", run the
following adb
command:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
To disable enforcement of "jobs that are executing while concurrently with a
foreground service will adhere to the job runtime quota", run the following
adb
command:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
To test certain app standby bucket behavior, you can set the app standby bucket
of your app using the following adb
command:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
To understand the app standby bucket your app is in, you can get the app standby
bucket of your app using the following adb
command:
adb shell am get-standby-bucket APP_PACKAGE_NAME
Причина прекращения пустых рабочих мест
An abandoned job occurs when the JobParameters
object associated with the job
has been garbage collected, but JobService#jobFinished(JobParameters,
boolean)
has not been called to signal job completion. This indicates that
the job may be running and being rescheduled without the app's awareness.
Apps that rely on JobScheduler, don't maintain a strong reference to the
JobParameters
object, and timeout will now be granted the new job stop reason
STOP_REASON_TIMEOUT_ABANDONED
, instead of STOP_REASON_TIMEOUT
.
If there are frequent occurrences of the new abandoned stop reason, the system will take mitigation steps to reduce job frequency.
Apps should use the new stop reason to detect and reduce abandoned jobs.
If you're using WorkManager, AsyncTask, or DownloadManager, you aren't impacted because these APIs manage the job lifecycle on your app's behalf.
Полное прекращение поддержки JobInfo#setImportantWhileForeground
Метод JobInfo.Builder#setImportantWhileForeground(boolean)
указывает на важность задания, когда приложение планирования находится на переднем плане или когда временно освобождено от фоновых ограничений.
Этот метод устарел с Android 12 (уровень API 31). Начиная с Android 16, он больше не работает эффективно, и вызов этого метода будет игнорироваться.
Это удаление функциональности также применимо к JobInfo#isImportantWhileForeground()
. Начиная с Android 16, при вызове метода метод возвращает false
.
Упорядоченная область приоритета широковещательной передачи больше не является глобальной.
Android apps are allowed to define priorities on broadcast receivers to control
the order in which the receivers receive and process the broadcast. For
manifest-declared receivers, apps can use the
android:priority
attribute to define the priority and for
context-registered receivers, apps can use the
IntentFilter#setPriority()
API to define the priority. When
a broadcast is sent, the system delivers it to receivers in order of their
priority, from highest to lowest.
In Android 16, broadcast delivery order using the android:priority
attribute
or IntentFilter#setPriority()
across different processes will not be
guaranteed. Broadcast priorities will only be respected within the same
application process rather than across all processes.
Also, broadcast priorities will be automatically confined to the range
(SYSTEM_LOW_PRIORITY
+ 1,
SYSTEM_HIGH_PRIORITY
- 1). Only system components will be
allowed to set SYSTEM_LOW_PRIORITY
, SYSTEM_HIGH_PRIORITY
as broadcast
priority.
Your app might be impacted if it does either of the following:
- Your application has declared multiple processes with the same broadcast intent, and has expectations around receiving those intents in a certain order based on the priority.
- Your application process interacts with other processes and has expectations around receiving a broadcast intent in a certain order.
If the processes need to coordinate with each other, they should communicate using other coordination channels.
Внутренние изменения АРТ
Android 16 включает последние обновления среды выполнения Android (ART), которые улучшают производительность среды выполнения Android (ART) и обеспечивают поддержку дополнительных функций Java. Благодаря обновлениям системы Google Play эти улучшения также доступны более чем миллиарду устройств под управлением Android 12 (уровень API 31) и выше .
После выхода этих изменений библиотеки и код приложений, использующие внутренние структуры ART, могут работать некорректно на устройствах под управлением Android 16, а также на более ранних версиях Android, которые обновляют модуль ART через обновления системы Google Play.
Использование внутренних структур (например, интерфейсов, отличных от SDK ) всегда может привести к проблемам совместимости, но особенно важно избегать использования кода (или библиотек, содержащих код), который использует внутренние структуры ART, поскольку изменения ART не привязаны к платформе. версию, на которой работает устройство, и они распространяются на более чем миллиард устройств через обновления системы Google Play.
Всем разработчикам следует проверить, не затронуто ли их приложение, путем тщательного тестирования своих приложений на Android 16. Кроме того, проверьте известные проблемы , чтобы узнать, зависит ли ваше приложение от каких-либо выявленных нами библиотек, которые полагаются на внутренние структуры ART. Если у вас есть код приложения или зависимости библиотеки, которые затронуты, по возможности ищите альтернативы общедоступным API и запросите общедоступные API для новых вариантов использования, создав запрос функции в нашем отслеживании проблем.
Режим совместимости размера страницы 16 КБ
В Android 15 появилась поддержка страниц памяти размером 16 КБ для оптимизации производительности платформы. В Android 16 добавлен режим совместимости , позволяющий запускать некоторые приложения, созданные для страниц памяти размером 4 КБ, на устройстве, настроенном для страниц памяти 16 КБ.
Когда ваше приложение работает на устройстве с Android 16 или более поздней версии, если Android обнаруживает, что ваше приложение имеет выровненные страницы памяти размером 4 КБ, оно автоматически использует режим совместимости и отображает диалоговое окно уведомления для пользователя. Установка свойства android:pageSizeCompat
в AndroidManifest.xml
для включения режима обратной совместимости предотвратит отображение диалогового окна при запуске вашего приложения. Чтобы использовать свойство android:pageSizeCompat
, скомпилируйте приложение с помощью Android 16 SDK .
Для обеспечения максимальной производительности, надежности и стабильности размер вашего приложения по-прежнему должен составлять 16 КБ. Для получения более подробной информации ознакомьтесь с нашей недавней публикацией в блоге об обновлении ваших приложений для поддержки страниц памяти 16 КБ.

Пользовательский опыт и системный интерфейс
Android 16 (уровень API 36) включает следующие изменения, призванные создать более последовательный и интуитивно понятный пользовательский интерфейс.
Отказ от деструктивных объявлений о доступности
В Android 16 больше не поддерживаются объявления о специальных возможностях, характеризующиеся использованием announceForAccessibility
или отправкой событий доступности TYPE_ANNOUNCEMENT
. Это может создать несогласованный пользовательский опыт для пользователей TalkBack и программы чтения с экрана Android, а альтернативы лучше удовлетворяют более широкий спектр потребностей пользователей в различных вспомогательных технологиях Android.
Примеры альтернатив:
- Для значительных изменений пользовательского интерфейса, таких как изменения окон, используйте
Activity.setTitle(CharSequence)
иsetAccessibilityPaneTitle(java.lang.CharSequence)
. В Compose используйтеModifier.semantics { paneTitle = "paneTitle" }
- Чтобы сообщить пользователю об изменениях в критическом пользовательском интерфейсе, используйте
setAccessibilityLiveRegion(int)
. В Compose используйтеModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
. Их следует использовать с осторожностью, поскольку они могут генерировать объявления каждый раз при обновлении представления. - Чтобы уведомить пользователей об ошибках, отправьте
AccessibilityEvent
типаAccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
и установитеAccessibilityNodeInfo#setError(CharSequence)
или используйтеTextView#setError(CharSequence)
.
Справочная документация по устаревшему API announceForAccessibility
содержит более подробную информацию о предлагаемых альтернативах.
Поддержка трехкнопочной навигации.
В Android 16 добавлена поддержка прогнозного возврата в трехкнопочную навигацию для приложений, которые правильно перешли на интеллектуальный возврат . Длительное нажатие кнопки «Назад» запускает прогнозирующую анимацию возврата, давая вам предварительный просмотр того, куда вас приведет смахивание назад.
Такое поведение применимо ко всем областям системы, которые поддерживают прогнозирующую анимацию возврата, включая системную анимацию (возврат домой, перекрестные задачи и перекрестные действия).
Форм-факторы устройств
Android 16 (уровень API 36) включает следующие изменения для приложений, проецируемых на дисплеи владельцами виртуальных устройств.
Переопределения владельца виртуального устройства
A virtual device owner is a trusted or privileged app that creates and manages a virtual device. Virtual device owners run apps on a virtual device and then project the apps to the display of a remote device, such as a personal computer, virtual reality device, or car infotainment system. The virtual device owner is on a local device, such as a mobile phone.

Per-app overrides
On devices running Android 16 (API level 36), virtual device owners can override app settings on select virtual devices that the virtual device owners manage. For example, to improve app layout, a virtual device owner can ignore orientation, aspect ratio, and resizability restrictions when projecting apps onto an external display.
Common breaking changes
The Android 16 behavior might impact your app's UI on large screen form factors such as car displays or Chromebooks, especially layouts that were designed for small displays in portrait orientation. To learn how to make your app adaptive for all device form factors, see About adaptive layouts.
References
Безопасность
Android 16 (уровень API 36) включает изменения, повышающие безопасность системы и помогающие защитить приложения и пользователей от вредоносных приложений.
Улучшена защита от атак с перенаправлением намерений.
Android 16 обеспечивает безопасность по умолчанию от общих атак с перенаправлением Intent
с минимальной совместимостью и необходимыми изменениями разработчика.
Мы по умолчанию представляем решения по усилению безопасности для эксплойтов перенаправления Intent
. В большинстве случаев приложения, использующие намерения, обычно не сталкиваются с проблемами совместимости; мы собирали показатели на протяжении всего процесса разработки, чтобы отслеживать, в каких приложениях могут возникнуть сбои.
Перенаправление намерения в Android происходит, когда злоумышленник может частично или полностью контролировать содержимое намерения, используемого для запуска нового компонента в контексте уязвимого приложения, в то время как приложение-жертва запускает ненадежное намерение подуровня в дополнительном поле намерения («верхнего уровня»). Это может привести к тому, что приложение-злоумышленник запустит частные компоненты в контексте приложения-жертвы, инициирует привилегированные действия или получит URI-доступ к конфиденциальным данным, что потенциально может привести к краже данных и выполнению произвольного кода.
Отключить обработку перенаправления намерений
В Android 16 представлен новый API, который позволяет приложениям отказываться от защиты при запуске. Это может быть необходимо в определенных случаях, когда поведение безопасности по умолчанию мешает законным сценариям использования приложений.
Для приложений, компилируемых с использованием SDK Android 16 (уровень API 36) или выше.
Вы можете напрямую использовать метод removeLaunchSecurityProtection()
для объекта Intent.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
Для приложений, компилируемых под Android 15 (уровень API 35) или ниже.
Хотя это и не рекомендуется, вы можете использовать отражение для доступа к методу removeLaunchSecurityProtection()
.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
// Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }
Возможности подключения
Android 16 (уровень API 36) включает следующие изменения в стеке Bluetooth для улучшения связи с периферийными устройствами.
Улучшенная обработка потерь по облигациям
Начиная с Android 16, стек Bluetooth был обновлен для повышения безопасности и удобства работы пользователей при обнаружении потери удаленного соединения. Раньше система автоматически удаляла связь и инициировала новый процесс сопряжения, что могло привести к непреднамеренному повторному сопряжению. Мы видели во многих случаях приложения, которые не заботятся о событии потери облигаций должным образом.
Чтобы унифицировать этот опыт, в Android 16 улучшена обработка потерь по облигациям в системе. Если ранее подключенное устройство Bluetooth не могло быть аутентифицировано при повторном подключении, система отключит соединение, сохранит информацию о локальной связи и отобразит системное диалоговое окно, информирующее пользователей о потере соединения и предписывающее им выполнить повторное соединение.
,Начиная с Android 16, стек Bluetooth был обновлен для повышения безопасности и удобства работы пользователей при обнаружении потери удаленного соединения. Раньше система автоматически удаляла связь и инициировала новый процесс сопряжения, что могло привести к непреднамеренному повторному сопряжению. Мы видели во многих случаях приложения, которые не заботятся о событии потери облигаций должным образом.
Чтобы унифицировать этот опыт, в Android 16 улучшена обработка потерь по облигациям в системе. Если ранее подключенное устройство Bluetooth не могло быть аутентифицировано при повторном подключении, система отключит соединение, сохранит информацию о локальной связи и отобразит системное диалоговое окно, информирующее пользователей о потере соединения и предписывающее им выполнить повторное соединение.
,Начиная с Android 16, стек Bluetooth был обновлен для повышения безопасности и удобства работы пользователей при обнаружении потери удаленного соединения. Раньше система автоматически удаляла связь и инициировала новый процесс сопряжения, что могло привести к непреднамеренному повторному сопряжению. Мы видели во многих случаях приложения, которые не заботятся о событии потери облигаций должным образом.
Чтобы унифицировать этот опыт, в Android 16 улучшена обработка потерь по облигациям в системе. Если ранее подключенное устройство Bluetooth не могло быть аутентифицировано при повторном подключении, система отключит соединение, сохранит информацию о локальной связи и отобразит системное диалоговое окно, информирующее пользователей о потере соединения и предписывающее им выполнить повторное соединение.