Платформа 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
в качестве приоритета широковещания.
Ваше приложение может пострадать, если оно выполняет одно из следующих действий:
- Ваше приложение объявило несколько процессов с одним и тем же намерением широковещания и ожидает получения этих намерений в определенном порядке в зависимости от приоритета.
- Процесс вашего приложения взаимодействует с другими процессами и ожидает получения широковещательного намерения в определенном порядке.
Если процессам необходимо координировать друг друга, им следует взаимодействовать, используя другие каналы координации.
Внутренние изменения АРТ
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.

Пользовательский опыт и системный пользовательский интерфейс
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
содержит более подробную информацию о предлагаемых альтернативах.
Поддержка 3-кнопочной навигации
В 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 происходит, когда злоумышленник может частично или полностью контролировать содержимое намерения, используемого для запуска нового компонента в контексте уязвимого приложения, в то время как приложение-жертва запускает ненадежное намерение подуровня в поле 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 для улучшения связи с периферийными устройствами.
Улучшение управления убытками по облигациям
Starting in Android 16, the Bluetooth stack has been updated to improve security and user experience when a remote bond loss is detected. Previously, the system would automatically remove the bond and initiate a new pairing process, which could lead to unintentional re-pairing. We have seen in many instances apps not taking care of the bond loss event in a consistent way.
To unify the experience, Android 16 improved the bond loss handling to the system. If a previously bonded Bluetooth device could not be authenticated upon reconnection, the system will disconnect the link, retain local bond information, and display a system dialog informing users of the bond loss and directing them to re-pair.