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

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

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

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

Точные сигналы тревоги по расписанию запрещены по умолчанию

Exact alarms are meant for user-intentioned notifications, or for actions that need to happen at a precise time. Starting in Android 14, the SCHEDULE_EXACT_ALARM permission is no longer being pre-granted to most newly installed apps targeting Android 13 and higher—the permission is denied by default.

Learn more about the changes to the permission for scheduling exact alarms.

Широковещательные рассылки, зарегистрированные в контексте, ставятся в очередь, а приложения кэшируются.

В Android 14 система может помещать трансляции с регистрацией контекста в очередь , пока приложение находится в кэшированном состоянии . Это похоже на поведение очередей, которое Android 12 (уровень API 31) представил для транзакций асинхронного связывания. Широковещательные передачи, объявленные в манифесте, не ставятся в очередь, а приложения удаляются из кэшированного состояния для широковещательной доставки.

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

Приложения могут убивать только свои фоновые процессы

Начиная с Android 14, когда ваше приложение вызывает killBackgroundProcesses() , API может уничтожать только фоновые процессы вашего собственного приложения.

Если вы передадите имя пакета другого приложения, этот метод не окажет влияния на фоновые процессы этого приложения, и в Logcat появится следующее сообщение:

Invalid packageName: com.example.anotherapp

Ваше приложение не должно использовать API killBackgroundProcesses() или иным образом пытаться влиять на жизненный цикл процессов других приложений, даже в более старых версиях ОС. Android предназначен для хранения кэшированных приложений в фоновом режиме и автоматического их закрытия, когда системе требуется память. Если ваше приложение без необходимости завершает работу других приложений, оно может снизить производительность системы и увеличить расход заряда батареи, поскольку позже потребуется полный перезапуск этих приложений, что требует значительно больше ресурсов, чем возобновление существующего кэшированного приложения.

MTU установлен на 517 для первого клиента GATT, запрашивающего MTU.

Starting from Android 14, the Android Bluetooth stack more strictly adheres to Version 5.2 of the Bluetooth Core Specification and requests the BLE ATT MTU to 517 bytes when the first GATT client requests an MTU using the BluetoothGatt#requestMtu(int) API, and disregards all subsequent MTU requests on that ACL connection.

To address this change and make your app more robust, consider the following options:

  • Your peripheral device should respond to the Android device's MTU request with a reasonable value that can be accommodated by the peripheral. The final negotiated value will be a minimum of the Android requested value and the remote provided value (for example, min(517, remoteMtu))
    • Implementing this fix could require a firmware update for peripheral
  • Alternatively, limit your GATT characteristic writes based on the minimum between the known supported value of your peripheral and the received MTU change
    • A reminder that you should reduce 5 bytes from the supported size for the headers
    • For example: 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 КБ

In Android 14 (API level 34) and higher, the platform reduces the maximum memory that can be locked using mlock() to 64 KB per process. In previous versions, the limit was 64 MB per process. This restriction promotes better memory management across apps and the system. To provide more consistency across devices, Android 14 adds a new CTS test for the new mlock() limit on compatible devices.

Система обеспечивает использование ресурсов кэшированного приложения.

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

Информация о безопасности данных становится более наглядной

To enhance user privacy, Android 14 increases the number of places where the system shows the information you have declared in the Play Console form. Currently, users can view this information in the Data safety section on your app's listing in Google Play.

We encourage you to review your app's location data sharing policies and take a moment to make any applicable updates to your app's Google Play Data safety section.

Learn more in the guide about how data safety information is more visible on 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

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

The media store supports queries for the OWNER_PACKAGE_NAME column, which indicates the app that stored a particular media file. Starting in Android 14, this value is redacted unless at least one of the following conditions is true:

  • The app that stored the media file has a package name that is always visible to other apps.
  • The app that queries the media store requests the QUERY_ALL_PACKAGES permission.

Learn more about how Android filters package visibility for privacy purposes.