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

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

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

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

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

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

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

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

On Android 14, the system can place context-registered broadcasts in a queue while the app is in the cached state. This is similar to the queuing behavior that Android 12 (API level 31) introduced for async binder transactions. Manifest-declared broadcasts aren't queued, and apps are removed from the cached state for broadcast delivery.

When the app leaves the cached state, such as returning to the foreground, the system delivers any queued broadcasts. Multiple instances of certain broadcasts might be merged into one broadcast. Depending on other factors, such as system health, apps might be removed from the cached state, and any previously queued broadcasts are delivered.

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

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

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

Invalid packageName: com.example.anotherapp

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

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

Начиная с 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 introduces a new reason an app can be placed into the restricted standby bucket. The app's jobs trigger ANR errors multiple times due to onStartJob, onStopJob, or onBind method timeouts. (See JobScheduler reinforces callback and network behavior for changes to onStartJob and onStopJob.)

To track whether or not the app has entered the restricted standby bucket, we recommend logging with the API UsageStatsManager.getAppStandbyBucket() on job execution or UsageStatsManager.queryEventsForSelf() on app startup.

mlock ограничен 64 КБ

В Android 14 (уровень API 34) и выше платформа уменьшает максимальный объем памяти, который можно заблокировать с помощью mlock() до 64 КБ на процесс. В предыдущих версиях ограничение составляло 64 МБ на процесс. Это ограничение способствует лучшему управлению памятью в приложениях и системе. Чтобы обеспечить большую согласованность между устройствами, в Android 14 добавлен новый тест CTS для нового ограничения mlock() на совместимых устройствах.

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

По замыслу процесс приложения находится в кэшированном состоянии, когда он перемещается в фоновый режим и никакие другие компоненты процесса приложения не работают. Такой процесс приложения может быть уничтожен из-за нехватки системной памяти. Любая работа, которую экземпляры Activity выполняют после вызова и возврата метода onStop() в этом состоянии, является ненадежной и настоятельно не рекомендуется.

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

Эти изменения не должны затронуть приложения, которые используют типичные API жизненного цикла, поддерживаемые платформой, такие как службы , JobScheduler и Jetpack WorkManager .

Пользовательский опыт

Изменения в том, как пользователи видят уведомления, которые невозможно закрыть

If your app shows non-dismissable foreground notifications to users, Android 14 has changed the behavior to allow users to dismiss such notifications.

This change applies to apps that prevent users from dismissing foreground notifications by setting Notification.FLAG_ONGOING_EVENT through Notification.Builder#setOngoing(true) or NotificationCompat.Builder#setOngoing(true). The behavior of FLAG_ONGOING_EVENT has changed to make such notifications actually dismissable by the user.

These kinds of notifications are still non-dismissable in the following conditions:

  • When the phone is locked
  • If the user selects a Clear all notification action (which helps with accidental dismissals)

Also, this new behavior doesn't apply to notifications in the following use cases:

  • CallStyle notifications
  • Device policy controller (DPC) and supporting packages for enterprise
  • Media notifications
  • The default Search Selector package

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

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%, предоставляя пользователям дополнительные возможности доступа.

Если вы уже используете единицы измерения масштабированных пикселей (sp) для определения размера текста, то это изменение, вероятно, не окажет существенного влияния на ваше приложение. Тем не менее, вам следует провести тестирование пользовательского интерфейса с максимальным размером шрифта (200%), чтобы убедиться, что ваше приложение может работать с более крупными шрифтами без ущерба для удобства использования.

Безопасность

Минимально устанавливаемый целевой уровень API

Starting with Android 14, apps with a targetSdkVersion lower than 23 can't be installed. Requiring apps to meet these minimum target API level requirements improves security and privacy for users.

Malware often targets older API levels in order to bypass security and privacy protections that have been introduced in newer Android versions. For example, some malware apps use a targetSdkVersion of 22 to avoid being subjected to the runtime permission model introduced in 2015 by Android 6.0 Marshmallow (API level 23). This Android 14 change makes it harder for malware to avoid security and privacy improvements. Attempting to install an app targeting a lower API level will result in an installation failure, with the following message appearing in Logcat:

INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7

On devices upgrading to Android 14, any apps with a targetSdkVersion lower than 23 will remain installed.

If you need to test an app targeting an older API level, use the following ADB command:

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.