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

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

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

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

Точная настройка времени для оповещений по умолчанию запрещена.

Точные сигналы тревоги предназначены для уведомлений, предназначенных пользователю, или для действий, которые должны произойти в определенное время. Начиная с Android 14, разрешение SCHEDULE_EXACT_ALARM больше не предоставляется заранее большинству недавно установленных приложений, предназначенных для Android 13 и более поздних версий — по умолчанию разрешение запрещено.

Узнайте больше об изменениях в разрешении на планирование точных сигналов тревоги .

Контекстно-зависимая передача данных ставится в очередь, в то время как приложения кэшируются.

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

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

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

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.

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

Начиная с Android 14, стек Android Bluetooth более строго соответствует версии 5.2 базовой спецификации Bluetooth и запрашивает MTU BLE ATT размером 517 байт, когда первый клиент GATT запрашивает MTU с помощью API BluetoothGatt#requestMtu(int) и игнорирует все последующие запросы MTU для этого соединения ACL.

Чтобы учесть это изменение и сделать ваше приложение более надежным, рассмотрите следующие варианты:

  • Ваше периферийное устройство должно ответить на запрос MTU устройства Android с разумным значением, которое может быть обработано периферийным устройством. Окончательное согласованное значение будет минимумом запрошенного значения Android и значения, предоставленного удаленным устройством (например, min(517, remoteMtu) )
    • Для реализации этого исправления может потребоваться обновление прошивки для периферийных устройств.
  • Альтернативно, ограничьте запись характеристик GATT на основе минимума между известным поддерживаемым значением вашего периферийного устройства и полученным изменением MTU.
    • Напоминаем, что вам следует уменьшить поддерживаемый размер заголовков на 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 КБ

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) и пакеты поддержки для предприятий
  • Медиа-уведомления
  • Пакет выбора поиска по умолчанию

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

Чтобы повысить конфиденциальность пользователей, в Android 14 увеличено количество мест, где система отображает информацию, которую вы указали в форме Play Console. В настоящее время пользователи могут просмотреть эту информацию в разделе «Безопасность данных» на странице вашего приложения в Google Play.

Мы рекомендуем вам ознакомиться с политикой обмена данными о местоположении вашего приложения и внести необходимые обновления в раздел безопасности данных Google Play вашего приложения.

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

Доступность

Нелинейное масштабирование шрифта до 200%.

Начиная с Android 14, система поддерживает масштабирование шрифтов до 200%, предоставляя пользователям дополнительные возможности доступа.

Если вы уже используете единицы измерения масштабированных пикселей (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 фильтрует видимость пакетов в целях конфиденциальности.