Платформа Android 16 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения поведения применяются ко всем приложениям , работающим на Android 16, независимо от targetSdkVersion
. Вам следует протестировать свое приложение, а затем при необходимости изменить его для поддержки этих изменений, где это применимо.
Обязательно ознакомьтесь также со списком изменений поведения, которые влияют только на приложения, ориентированные на Android 16 .
Основная функциональность
Android 16 включает следующие изменения, которые изменяют или расширяют различные основные возможности системы 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
属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority()
API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。
在 Android 16 中,无法保证使用 android:priority
属性或 IntentFilter#setPriority()
在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。
此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY
+ 1, SYSTEM_HIGH_PRIORITY
- 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITY
、SYSTEM_HIGH_PRIORITY
设置为广播优先级。
如果您的应用执行以下任一操作,可能会受到影响:
- 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
- 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。
如果进程需要相互协调,则应使用其他协调渠道进行通信。
Внутренние изменения АРТ
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 обнаруживает, что ваше приложение имеет выровненные страницы памяти размером 4 КБ, оно автоматически использует режим совместимости и отображает диалоговое окно уведомления для пользователя. Установка свойства android:pageSizeCompat
в AndroidManifest.xml
для включения режима обратной совместимости предотвратит отображение диалогового окна при запуске вашего приложения. Для обеспечения максимальной производительности, надежности и стабильности размер вашего приложения по-прежнему должен составлять 16 КБ. Для получения более подробной информации ознакомьтесь с нашей недавней публикацией в блоге об обновлении ваших приложений для поддержки страниц памяти 16 КБ.

Пользовательский опыт и системный интерфейс
Android 16 включает следующие изменения, призванные создать более последовательный и интуитивно понятный пользовательский интерфейс.
Отказ от деструктивных объявлений о доступности
В 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 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。
此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。
Безопасность
Android 16 включает изменения, повышающие безопасность системы и помогающие защитить приложения и пользователей от вредоносных приложений.
Улучшена защита от атак с перенаправлением намерений.
Android 16 提供了针对常规 Intent
重定向攻击的默认安全防护,并且所需的兼容性和开发者更改最少。
我们将默认针对 Intent
重定向漏洞引入安全增强解决方案。在大多数情况下,使用 intent 的应用通常不会遇到任何兼容性问题;我们在整个开发过程中收集了指标,以监控哪些应用可能会出现故障。
当攻击者部分或完全控制用于在存在漏洞的应用上下文中启动新组件的 intent 内容时,就会出现 Android 中的intent 重定向,而受害应用会在 intent(“顶级”intent)的 extras 字段中启动不可信的子级 intent。这可能会导致攻击者应用在受害应用上下文中启动私有组件、触发特权操作或获得对敏感数据的 URI 访问权限,从而可能导致数据被盗和任意代码执行。
停用 intent 重定向处理
Android 16 引入了一个新 API,允许应用选择停用启动安全保护。在默认安全行为干扰合法应用用例的特定情况下,这可能很有必要。
对于针对 Android 16 SDK 或更高版本进行编译的应用
您可以直接对 intent 对象使用 removeLaunchSecurityProtection()
方法。
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) }