Платформа 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.
Контекстно-зависимая передача данных ставится в очередь, в то время как приложения кэшируются.
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 предназначен для хранения кэшированных приложений в фоновом режиме и автоматического их закрытия, когда системе требуется память. Если ваше приложение без необходимости завершает работу других приложений, оно может снизить производительность системы и увеличить расход заряда батареи, поскольку позже потребуется полный перезапуск этих приложений, что требует значительно больше ресурсов, чем возобновление существующего кэшированного приложения.
Для первого клиента 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.
Система обеспечивает принудительное использование ресурсов кэшированного приложения.
By design, an app's process is in a cached state when it's moved to the
background and no other app process components are running. Such an app process
is subject to being killed due to system memory pressure. Any work that
Activity instances perform after the onStop() method has been called and
returned, while in this state, is unreliable and strongly discouraged.
Android 14 introduces consistency and enforcement to this design. Shortly after an app process enters a cached state, background work is disallowed, until a process component re-enters an active state of the lifecycle.
Apps that use typical framework-supported lifecycle APIs – such as
services, JobScheduler, and Jetpack WorkManager – shouldn't be
impacted by these changes.
пользовательский опыт
Изменения в том, как пользователи воспринимают уведомления, которые нельзя закрыть.
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:
CallStylenotifications- 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, доступный для установки
Начиная с 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_PACKAGESpermission.
Learn more about how Android filters package visibility for privacy purposes.