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

Платформа 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

Метод JobInfo.Builder#setImportantWhileForeground(boolean) указывает на важность задания, когда приложение планирования находится на переднем плане или когда временно освобождено от фоновых ограничений.

Этот метод устарел с Android 12 (уровень API 31). Начиная с Android 16, он больше не работает эффективно, и вызов этого метода будет игнорироваться.

Это удаление функциональности также применимо к JobInfo#isImportantWhileForeground() . Начиная с Android 16, при вызове метода метод возвращает false .

Упорядоченная область приоритета вещания больше не глобальна

Приложениям Android разрешено определять приоритеты приемников вещания, чтобы контролировать порядок, в котором получатели получают и обрабатывают трансляцию. Для получателей, объявленных в манифесте, приложения могут использовать атрибут android:priority для определения приоритета, а для получателей, зарегистрированных в контексте, приложения могут использовать API IntentFilter#setPriority() для определения приоритета. При отправке широковещательной рассылки система доставляет ее получателям в порядке их приоритета, от самого высокого к самому низкому.

В Android 16 порядок широковещательной доставки с использованием атрибута android:priority или IntentFilter#setPriority() между различными процессами не гарантируется. Приоритеты вещания будут соблюдаться только в рамках одного и того же процесса подачи заявки, а не во всех процессах.

Кроме того, приоритеты вещания будут автоматически ограничены диапазоном ( SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY – 1). Только системным компонентам будет разрешено устанавливать SYSTEM_LOW_PRIORITY , SYSTEM_HIGH_PRIORITY в качестве приоритета широковещания.

Ваше приложение может пострадать, если оно выполняет одно из следующих действий:

  1. Ваше приложение объявило несколько процессов с одним и тем же намерением широковещания и ожидает получения этих намерений в определенном порядке в зависимости от приоритета.
  2. Процесс вашего приложения взаимодействует с другими процессами и ожидает получения широковещательного намерения в определенном порядке.

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

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

Android 16 includes the latest updates to the Android Runtime (ART) that improve the Android Runtime's (ART's) performance and provide support for additional Java features. Through Google Play System updates, these improvements are also available to over a billion devices running Android 12 (API level 31) and higher.

As these changes are released, libraries and app code that rely on internal structures of ART might not work correctly on devices running Android 16, along with earlier Android versions that update the ART module through Google Play system updates.

Relying on internal structures (such as non-SDK interfaces) can always lead to compatibility problems, but it's particularly important to avoid relying on code (or libraries containing code) that leverages internal ART structures, since ART changes aren't tied to the platform version the device is running on and they go out to over a billion devices through Google Play system updates.

All developers should check whether their app is impacted by testing their apps thoroughly on Android 16. In addition, check the known issues to see if your app depends on any libraries that we've identified that rely on internal ART structures. If you do have app code or library dependencies that are affected, seek public API alternatives whenever possible and request public APIs for new use cases by creating a feature request in our issue tracker.

Режим совместимости с размером страницы 16 КБ

В Android 15 появилась поддержка страниц памяти размером 16 КБ для оптимизации производительности платформы. В Android 16 добавлен режим совместимости , позволяющий запускать некоторые приложения, созданные для страниц памяти размером 4 КБ, на устройстве, настроенном для страниц памяти 16 КБ.

Когда ваше приложение работает на устройстве с Android 16 или более поздней версии, если Android обнаруживает, что ваше приложение имеет выровненные страницы памяти размером 4 КБ, оно автоматически использует режим совместимости и отображает диалоговое окно уведомления для пользователя. Установка свойства android:pageSizeCompat в AndroidManifest.xml для включения режима обратной совместимости предотвратит отображение диалогового окна при запуске вашего приложения. Чтобы использовать свойство android:pageSizeCompat , скомпилируйте приложение с помощью Android 16 SDK .

Для обеспечения максимальной производительности, надежности и стабильности размер вашего приложения по-прежнему должен составлять 16 КБ. Для получения более подробной информации ознакомьтесь с нашей недавней публикацией в блоге об обновлении ваших приложений для поддержки страниц памяти 16 КБ.

Диалоговое окно режима совместимости, которое отображается, когда система обнаруживает, что приложение, выровненное по 4 КБ, может работать более оптимально, если выровнено по 16 КБ.

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

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.

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

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 обеспечивает стандартную защиту от атак перенаправления Intent , требуя минимальной совместимости и внесения изменений со стороны разработчика.

Мы внедряем решения по усилению безопасности, встроенные в систему защиты от эксплойтов, использующих перенаправление Intent . В большинстве случаев приложения, использующие намерения, обычно не сталкиваются с проблемами совместимости; мы собирали метрики на протяжении всего процесса разработки, чтобы отслеживать, в каких приложениях могут возникнуть сбои.

Перенаправление намерения в Android происходит, когда злоумышленник может частично или полностью контролировать содержимое намерения, используемого для запуска нового компонента в контексте уязвимого приложения, в то время как приложение-жертва запускает ненадежное намерение подуровня в поле extras намерения («верхнего уровня»). Это может привести к тому, что приложение-злоумышленник запустит приватные компоненты в контексте приложения-жертвы, выполнит привилегированные действия или получит доступ по URI к конфиденциальным данным, что потенциально может привести к краже данных и выполнению произвольного кода.

Отказаться от обработки перенаправления намерений

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

Для приложений, компилируемых с использованием Android 16 (API уровня 36) SDK или выше

Вы можете напрямую использовать метод 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 представляет новое поведение во время сопряжения сопутствующего устройства для защиты конфиденциальности местоположения пользователя от вредоносных приложений. Все сопутствующие приложения, работающие на Android 16, больше не уведомляются напрямую о тайм-ауте обнаружения с помощью RESULT_DISCOVERY_TIMEOUT . Вместо этого пользователь уведомляется о событиях тайм-аута с помощью визуального диалога. Когда пользователь закрывает диалог, приложение оповещается об ошибке ассоциации с помощью RESULT_USER_REJECTED .

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

Связность

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

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

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

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

,

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

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

,

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

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