Платформа Android 14 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения поведения применяются ко всем приложениям , работающим на Android 14, независимо от targetSdkVersion
. Вам следует протестировать свое приложение, а затем изменить его по мере необходимости, чтобы обеспечить его правильную поддержку, где это применимо.
Обязательно ознакомьтесь также со списком изменений поведения, которые влияют только на приложения, предназначенные для Android 14 .
Основная функциональность
Точные сигналы тревоги по расписанию запрещены по умолчанию
Точные сигналы тревоги предназначены для уведомлений, предназначенных пользователю, или для действий, которые должны произойти в определенное время. Начиная с Android 14, разрешение SCHEDULE_EXACT_ALARM
больше не предоставляется заранее большинству недавно установленных приложений, предназначенных для Android 13 и более поздних версий — по умолчанию разрешение запрещено.
Узнайте больше об изменениях в разрешении на планирование точных сигналов тревоги .
Широковещательные рассылки, зарегистрированные в контексте, ставятся в очередь, а приложения кэшируются.
在 Android 14 中,当应用处于缓存状态时,系统可以将上下文注册的广播放入队列中。这与 Android 12(API 级别 31)为异步 binder 事务引入的队列行为类似。在清单中声明的广播不会加入队列,并且应用会从缓存状态中移除以进行广播传递。
当应用离开缓存状态(例如返回前台)时,系统会传递所有已加入队列的广播。某些广播的多个实例 可能会合并为一个广播。取决于其他因素,如系统 运行状况,则可能会从缓存状态中移除应用,以及之前排队 广播。
Приложения могут убивать только свои фоновые процессы
Starting in Android 14, when your app calls killBackgroundProcesses()
,
the API can kill only the background processes of your own app.
If you pass in the package name of another app, this method has no effect on that app's background processes, and the following message appears in Logcat:
Invalid packageName: com.example.anotherapp
Your app shouldn't use the killBackgroundProcesses()
API or otherwise attempt
to influence the process lifecycle of other apps, even on older OS versions.
Android is designed to keep cached apps in the background and kill them
automatically when the system needs memory. If your app kills other apps
unnecessarily, it can reduce system performance and increase battery consumption
by requiring full restarts of those apps later, which takes significantly more
resources than resuming an existing cached app.
MTU установлен на 517 для первого клиента GATT, запрашивающего MTU.
从 Android 14 开始,Android 蓝牙堆栈会更严格地遵循蓝牙核心规范 5.2 版,当第一个 GATT 客户端使用 BluetoothGatt#requestMtu(int)
API 请求 MTU 时,会请求将 BLE ATT MTU 设置为 517 个字节,并忽略针对该 ACL 连接的所有后续 MTU 请求。
如需解决此变更并提高应用的稳健性,请考虑以下选项:
- 您的外围设备应使用可由外围设备适应的合理值来响应 Android 设备的 MTU 请求。最终商定的值将为 Android 请求的值和远程提供的值(例如
min(517, remoteMtu)
)中的最小值- 实现此修复可能需要更新外围设备的固件
- 或者,根据外围设备的已知受支持值与接收到的 MTU 变化之间的最小值限制 GATT 特征写入
- 温馨提示:您应该在支持的标头大小的基础上减少 5 个字节
- 例如:
arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5
Новая причина, по которой приложение можно поместить в резервную корзину с ограниченным доступом
В Android 14 появилась новая причина, по которой приложение можно поместить в ограниченный резервный сегмент . Задания приложения несколько раз вызывают ошибки ANR из-за таймаутов метода onStartJob
, onStopJob
или onBind
. (См. JobScheduler усиливает обратный вызов и сетевое поведение для изменений в onStartJob
и onStopJob
.)
Чтобы отслеживать, вошло ли приложение в ограниченный резервный сегмент, мы рекомендуем войти в журнал с помощью API UsageStatsManager.getAppStandbyBucket()
при выполнении задания или UsageStatsManager.queryEventsForSelf()
при запуске приложения.
mlock ограничен 64 КБ
В Android 14 (уровень API 34) и выше платформа уменьшает максимальный объем памяти, который можно заблокировать с помощью mlock()
до 64 КБ на процесс. В предыдущих версиях ограничение составляло 64 МБ на процесс. Это ограничение способствует лучшему управлению памятью в приложениях и системе. Чтобы обеспечить большую согласованность между устройствами, в Android 14 добавлен новый тест CTS для нового ограничения mlock()
на совместимых устройствах.
Система обеспечивает использование ресурсов кэшированного приложения.
По замыслу процесс приложения находится в кэшированном состоянии, когда он перемещается в фоновый режим и никакие другие компоненты процесса приложения не работают. Такой процесс приложения может быть уничтожен из-за нехватки системной памяти. Любая работа, которую экземпляры Activity
выполняют после вызова и возврата метода onStop()
в этом состоянии, является ненадежной и настоятельно не рекомендуется.
Android 14 обеспечивает последовательность и строгость в этом дизайне. Вскоре после того, как процесс приложения переходит в кэшированное состояние, фоновая работа запрещается до тех пор, пока компонент процесса повторно не перейдет в активное состояние жизненного цикла.
Эти изменения не должны затронуть приложения, которые используют типичные API жизненного цикла, поддерживаемые платформой, такие как службы , JobScheduler
и Jetpack WorkManager .
Пользовательский опыт
Изменения в том, как пользователи видят уведомления, которые невозможно закрыть.
如果您的应用向用户显示不可关闭的前台通知,请注意:Android 14 已更改此行为,允许用户关闭此类通知。
这项变更适用于阻止用户关闭前台的应用
将 Notification.FLAG_ONGOING_EVENT
设置为
Notification.Builder#setOngoing(true)
或
NotificationCompat.Builder#setOngoing(true)
。FLAG_ONGOING_EVENT
的行为已发生变化,使用户实际上能够关闭此类通知。
在以下情况下,此类通知仍不可关闭:
- 当手机处于锁定状态时
- 如果用户选择全部清除通知操作(有助于防止意外关闭)
此外,这一新行为不适用于以下用例中的通知:
CallStyle
条通知- 企业设备政策控制器 (DPC) 和支持软件包
- 媒体通知
- 默认的搜索选择器软件包
Информация о безопасности данных становится более наглядной
Чтобы повысить конфиденциальность пользователей, в Android 14 увеличено количество мест, где система отображает информацию, которую вы указали в форме Play Console. В настоящее время пользователи могут просмотреть эту информацию в разделе «Безопасность данных» на странице вашего приложения в Google Play.
Мы рекомендуем вам ознакомиться с политикой обмена данными о местоположении вашего приложения и внести необходимые обновления в раздел безопасности данных Google Play вашего приложения.
Узнайте больше в руководстве о том, как информация о безопасности данных становится более наглядной на Android 14.
Доступность
Нелинейное масштабирование шрифта до 200 %.
Начиная с Android 14, система поддерживает масштабирование шрифта до 200 %, предоставляя пользователям с плохим зрением дополнительные возможности доступа, соответствующие рекомендациям по доступности веб-контента (WCAG) .
Если вы уже используете масштабированные пиксели (sp) для определения размера текста, то это изменение, вероятно, не окажет большого влияния на ваше приложение. Однако вам следует выполнить тестирование пользовательского интерфейса с включенным максимальным размером шрифта (200%), чтобы убедиться, что ваше приложение может использовать шрифты большего размера без ущерба для удобства использования.
Безопасность
Минимальный устанавливаемый целевой уровень API
Начиная с Android 14, приложения с версией targetSdkVersion
ниже 23 не могут быть установлены. Требование к приложениям соответствовать этим минимальным требованиям к целевому уровню API повышает безопасность и конфиденциальность пользователей.
Вредоносное ПО часто нацелено на старые уровни API, чтобы обойти средства безопасности и конфиденциальности, представленные в новых версиях Android. Например, некоторые вредоносные приложения используют targetSdkVersion
, равный 22, чтобы избежать применения модели разрешений во время выполнения, представленной в 2015 году в Android 6.0 Marshmallow (уровень API 23). Это изменение в Android 14 усложняет вредоносным программам обход улучшений безопасности и конфиденциальности. Попытка установить приложение, ориентированное на более низкий уровень API, приведет к сбою установки, и в Logcat появится следующее сообщение:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7
На устройствах, обновляющихся до Android 14, все приложения с targetSdkVersion
ниже 23 останутся установленными.
Если вам нужно протестировать приложение, ориентированное на более старый уровень API, используйте следующую команду ADB:
adb install --bypass-low-target-sdk-block FILENAME.apk
Названия пакетов владельцев носителей могут быть отредактированы.
Медиа-хранилище поддерживает запросы к столбцу OWNER_PACKAGE_NAME
, который указывает приложение, в котором сохранился конкретный медиа-файл . Начиная с Android 14, это значение удаляется, если не выполняется хотя бы одно из следующих условий:
- Приложение, в котором хранится медиафайл, имеет имя пакета, которое всегда видно другим приложениям.
Приложение, которое запрашивает хранилище мультимедиа, запрашивает разрешение
QUERY_ALL_PACKAGES
.
Узнайте больше о том, как Android фильтрует видимость пакетов в целях конфиденциальности.