Изменения поведения: все приложения

Платформа Android 16 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения в поведении применяются ко всем приложениям, работающим на Android 16, независимо от targetSdkVersion . Вам следует протестировать свое приложение, а затем внести в него необходимые изменения для поддержки этих изменений, где это применимо.

Обязательно ознакомьтесь также со списком изменений в поведении, которые затрагивают только приложения, ориентированные на Android 16 .

Основная функциональность

В Android 16 (уровень API 36) внесены следующие изменения, которые модифицируют или расширяют различные основные возможности системы Android.

Оптимизация квот JobScheduler

Начиная с Android 16 мы корректируем квоту времени выполнения обычных и ускоренных заданий на основе следующих факторов:

  • В каком контейнере ожидания приложения находится приложение : в Android 16 активные контейнеры ожидания начнут применяться принудительно с помощью щедрой квоты времени выполнения.
  • Если выполнение задания начинается, когда приложение находится в верхнем состоянии : в Android 16 задания, запущенные, когда приложение видимо пользователю, и продолжающиеся после того, как приложение становится невидимым, будут соответствовать квоте времени выполнения задания.
  • Если задание выполняется во время работы службы переднего плана : в Android 16 задания, выполняемые одновременно с службой переднего плана, будут соответствовать квоте времени выполнения задания. Если вы используете задания для передачи данных, инициированной пользователем, рассмотрите возможность использования заданий передачи данных, инициированных пользователем .

Это изменение влияет на задачи, запланированные с помощью WorkManager, JobScheduler и DownloadManager. Чтобы отладить причину остановки задания, рекомендуем зарегистрировать причину остановки, вызвав WorkInfo.getStopReason() (для заданий JobScheduler вызовите JobParameters.getStopReason() ).

Информацию о том, как состояние вашего приложения влияет на доступные ему ресурсы, см. в разделе «Ограничения ресурсов управления питанием» . Дополнительную информацию о передовых методах оптимизации расхода заряда батареи см. в руководстве по оптимизации использования батареи для API планирования задач .

Мы также рекомендуем использовать новый API JobScheduler#getPendingJobReasonsHistory представленный в Android 16, чтобы понять, почему задание не было выполнено.

Тестирование

Чтобы протестировать поведение вашего приложения, вы можете включить переопределение некоторых оптимизаций квот заданий, если приложение работает на устройстве Android 16.

Чтобы отключить принудительное соблюдение параметра «верхнее состояние будет соответствовать квоте времени выполнения задания», выполните следующую команду adb :

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

Чтобы отключить принудительное выполнение параметра «Задания, которые выполняются одновременно с активной службой, будут придерживаться квоты времени выполнения задания», выполните следующую команду adb :

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

Чтобы протестировать определенное поведение контейнера ожидания приложения, вы можете настроить контейнер ожидания приложения для своего приложения с помощью следующей команды adb :

adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted

Чтобы понять, в каком сегменте режима ожидания приложения находится ваше приложение, вы можете получить сегмент режима ожидания приложения с помощью следующей команды adb :

adb shell am get-standby-bucket APP_PACKAGE_NAME

Причина прекращения работы на заброшенных вакансиях

Прерванное задание происходит, когда объект JobParameters связанный с заданием, был удален, но JobService#jobFinished(JobParameters, boolean) не был вызван для сигнала о завершении задания. Это указывает на то, что задание может выполняться и перепланироваться без ведома приложения.

Приложения, использующие JobScheduler, не поддерживают строгую ссылку на объект JobParameters , и тайм-ауту теперь будет присвоена новая причина остановки задания STOP_REASON_TIMEOUT_ABANDONED вместо STOP_REASON_TIMEOUT .

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

Приложения должны использовать новую причину остановки, чтобы обнаруживать и сокращать количество заброшенных заданий.

Если вы используете WorkManager, AsyncTask или DownloadManager, на вас это не повлияет, поскольку эти API управляют жизненным циклом задания от имени вашего приложения.

Полное прекращение поддержки JobInfo#setImportantWhileForeground

The JobInfo.Builder#setImportantWhileForeground(boolean) method indicates the importance of a job while the scheduling app is in the foreground or when temporarily exempted from background restrictions.

This method has been deprecated since Android 12 (API level 31). Starting in Android 16, it no longer functions effectively and calling this method will be ignored.

This removal of functionality also applies to JobInfo#isImportantWhileForeground(). Starting in Android 16, if the method is called, the method returns 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:

  1. 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.
  2. 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.

внутренние изменения ART

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 introduced support for 16 KB memory pages to optimize performance of the platform. Android 16 adds a compatibility mode, allowing some apps built for 4 KB memory pages to run on a device configured for 16 KB memory pages.

When your app is running on a device with Android 16 or higher, if Android detects that your app has 4 KB aligned memory pages, it automatically uses compatibility mode and display a notification dialog to the user. Setting the android:pageSizeCompat property in the AndroidManifest.xml to enable the backwards compatibility mode will prevent the display of the dialog when your app launches. To use the android:pageSizeCompat property, compile your app using the Android 16 SDK.

For best performance, reliability, and stability, your app should still be 16 KB aligned. Check out our recent blog post on updating your apps to support 16 KB memory pages for more details.

The compatibility mode dialog that displays when the system detects that a 4 KB-aligned app could run more optimally if 16 KB aligned.

Пользовательский опыт и пользовательский интерфейс системы

В Android 16 (уровень API 36) внесены следующие изменения, призванные обеспечить более согласованный и интуитивно понятный пользовательский интерфейс.

Отмена нежелательных объявлений, нарушающих доступность.

Android 16 deprecates accessibility announcements, characterized by the use of announceForAccessibility or the dispatch of TYPE_ANNOUNCEMENT accessibility events. These can create inconsistent user experiences for users of TalkBack and Android's screen reader, and alternatives better serve a broader range of user needs across a variety of Android's assistive technologies.

Examples of alternatives:

The reference documentation for the deprecated announceForAccessibility API includes more details about suggested alternatives.

Поддержка навигации с помощью 3 кнопок

Android 16 brings predictive back support to the 3-button navigation for apps that have properly migrated to predictive back. Long-pressing the back button initiates a predictive back animation, giving you a preview of where the back swipe takes you.

This behavior applies across all areas of the system that support predictive back animations, including the system animations (back-to-home, cross-task, and cross-activity).

The predictive back animations in 3-button navigation mode.

Автоматические тематические значки приложений

Beginning with Android 16 QPR 2, Android automatically applies themes to app icons to create a cohesive home screen experience. This occurs if an app does not provide its own themed app icon. Apps can control the design of their themed app icon by including a monochrome layer within their adaptive icon and previewing what their app icon will look like in Android Studio.

форм-факторы устройств

В 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.

Virtual device owner on phone creates virtual device that projects app to remote display.

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

Companion app streaming

Безопасность

В Android 16 (уровень API 36) внесены изменения, повышающие безопасность системы и помогающие защитить приложения и пользователей от вредоносных программ.

Повышена защита от атак с перенаправлением намерений.

Android 16 provides default security against general Intent redirection attacks, with minimum compatibility and developer changes required.

We are introducing by-default security hardening solutions to Intent redirection exploits. In most cases, apps that use intents normally won't experience any compatibility issues; we've gathered metrics throughout our development process to monitor which apps might experience breakages.

Intent redirection in Android occurs when an attacker can partly or fully control the contents of an intent used to launch a new component in the context of a vulnerable app, while the victim app launches an untrusted sub-level intent in an extras field of an ("top-level") Intent. This can lead to the attacker app launching private components in the context of the victim app, triggering privileged actions, or gaining URI access to sensitive data, potentially leading to data theft and arbitrary code execution.

Opt out of Intent redirection handling

Android 16 introduces a new API that allows apps to opt out of launch security protections. This might be necessary in specific cases where the default security behavior interferes with legitimate app use cases.

For applications compiling against Android 16 (API level 36) SDK or higher

You can directly use the removeLaunchSecurityProtection() method on the Intent object.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
For applications compiling against Android 15 (API level 35) or lower

While not recommended, you can use reflection to access the removeLaunchSecurityProtection() method.

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 introduces a new behavior during companion device pairing flow to protect the user's location privacy from malicious apps. All companion apps running on Android 16 are no longer directly notified of discovery timeout using RESULT_DISCOVERY_TIMEOUT. Instead, the user is notified of timeout events with a visual dialog. When the user dismisses the dialog, the app is alerted of the association failure with RESULT_USER_REJECTED.

The search duration has also been extended from the original 20 seconds, and the device discovery can be stopped by the user at any point during the search. If at least one device was discovered within the first 20 seconds of starting the search, the CDM stops searching for additional devices.

Подключение

В Android 16 (уровень API 36) внесены следующие изменения в стек Bluetooth для улучшения связи с периферийными устройствами.

Улучшенная обработка убытков по облигациям

Начиная с Android 16, стек Bluetooth был обновлен для повышения безопасности и удобства работы пользователей при обнаружении потери удаленного соединения. Раньше система автоматически удаляла связь и инициировала новый процесс сопряжения, что могло привести к непреднамеренному повторному сопряжению. Мы видели во многих случаях приложения, которые не заботятся о событии потери облигаций должным образом.

Чтобы унифицировать этот опыт, в Android 16 улучшена обработка потерь по облигациям в системе. Если ранее подключенное устройство Bluetooth не могло быть аутентифицировано при повторном подключении, система отключит соединение, сохранит информацию о локальной связи и отобразит системное диалоговое окно, информирующее пользователей о потере соединения и предписывающее им выполнить повторное соединение.

,

Начиная с Android 16, стек Bluetooth был обновлен для повышения безопасности и удобства работы пользователей при обнаружении потери удаленного соединения. Раньше система автоматически удаляла связь и инициировала новый процесс сопряжения, что могло привести к непреднамеренному повторному сопряжению. Мы видели во многих случаях приложения, которые не заботятся о событии потери облигаций должным образом.

Чтобы унифицировать этот опыт, в Android 16 улучшена обработка потерь по облигациям в системе. Если ранее подключенное устройство Bluetooth не могло быть аутентифицировано при повторном подключении, система отключит соединение, сохранит информацию о локальной связи и отобразит системное диалоговое окно, информирующее пользователей о потере соединения и предписывающее им выполнить повторное соединение.

,

Начиная с Android 16, стек Bluetooth был обновлен для повышения безопасности и удобства работы пользователей при обнаружении потери удаленного соединения. Раньше система автоматически удаляла связь и инициировала новый процесс сопряжения, что могло привести к непреднамеренному повторному сопряжению. Мы видели во многих случаях приложения, которые не заботятся о событии потери облигаций должным образом.

Чтобы унифицировать этот опыт, в Android 16 улучшена обработка потерь по облигациям в системе. Если ранее подключенное устройство Bluetooth не могло быть аутентифицировано при повторном подключении, система отключит соединение, сохранит информацию о локальной связи и отобразит системное диалоговое окно, информирующее пользователей о потере соединения и предписывающее им выполнить повторное соединение.