Платформа Android 13 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения в поведении применяются ко всем приложениям, работающим на Android 13, независимо от targetSdkVersion . Вам следует протестировать свое приложение, а затем внести необходимые изменения для корректной поддержки этих изменений, где это применимо.
Обязательно ознакомьтесь также со списком изменений в поведении, которые затрагивают только приложения, ориентированные на Android 13 .
Производительность и батарея
Диспетчер задач
Начиная с Android 13 (уровень API 33), пользователи могут выполнить действие из панели уведомлений, чтобы остановить приложения, которые запускают активные службы на переднем плане, как показано на рисунке 1. Эта функция известна как Диспетчер задач . Приложения должны уметь обрабатывать эту остановку, инициированную пользователем .
Улучшить обработку заданий предварительной выборки с помощью JobScheduler.
JobScheduler предоставляет приложениям возможность помечать определенные задачи как задачи «предварительной загрузки» (используя JobInfo.Builder.setPrefetch() ), что означает, что в идеале они должны выполняться незадолго до следующего запуска приложения, чтобы улучшить пользовательский опыт. Исторически JobScheduler использовал этот сигнал только для того, чтобы позволить задачам предварительной загрузки использовать свободные или избыточные данные.
В Android 13 (уровень API 33) и выше система пытается определить время следующего запуска приложения и использует эту оценку для выполнения задач предварительной загрузки. Приложениям следует стараться использовать задачи предварительной загрузки для любой работы, которую они хотят выполнить до следующего запуска приложения.
Использование ресурсов батареи
Android 13 (уровень API 33) предоставляет следующие способы для более эффективного управления временем автономной работы устройства:
- Обновлены правила, определяющие, когда система помещает ваше приложение в категорию «ограниченного доступа» для приложений, находящихся в режиме ожидания .
- Введены новые ограничения на работу вашего приложения, когда пользователь переводит его в состояние «ограниченное» для фонового использования заряда батареи.
При тестировании приложения с внесенными изменениями обязательно проверьте следующее:
Проверьте, как ваше приложение реагирует, когда система помещает его в «ограниченный» резервный сегмент приложений . Используйте следующую команду Android Debug Bridge (ADB), чтобы назначить ваше приложение этому сегменту:
adb shell am set-standby-bucket PACKAGE_NAME restricted
Проверьте, как ваше приложение реагирует на следующие ограничения, которые обычно применяются к приложениям, находящимся в «ограниченном» режиме использования батареи в фоновом режиме:
- Не удаётся запустить службы переднего плана.
- Существующие службы переднего плана удаляются из переднего плана.
- Сигналы тревоги не срабатывают
- Работа не выполняется
Используйте следующую команду ADB, чтобы перевести ваше приложение в это «ограниченное» состояние:
adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
Квоты сообщений Firebase Cloud (FCM) с высоким приоритетом
В Android 13 (уровень API 33) обновлены квоты Firebase Cloud Messaging (FCM) для повышения надежности доставки FCM-сообщений с высоким приоритетом для приложений, отображающих уведомления в ответ на такие сообщения. В Android 13 (уровень API 33) произошли следующие изменения:
- Теперь параметры App Standby Buckets больше не определяют, сколько высокоприоритетных FCM может использовать приложение.
- Теперь система понижает приоритет сообщений с высоким приоритетом, если обнаруживает, что приложение постоянно отправляет такие сообщения, которые не приводят к уведомлению.
Как и в предыдущих версиях Android, высокоприоритетные FCM-сообщения, превышающие квоту, понижаются до обычного приоритета. При запуске служб переднего плана (FGS) в ответ на FCM-сообщение рекомендуется проверять результат вызова RemoteMessage.getPriority() и убедиться, что он равен PRIORITY_HIGH , а также обрабатывать любые потенциальные исключения ForegroundServiceStartNotAllowedException .
Если ваше приложение не всегда отправляет уведомления в ответ на FCM с высоким приоритетом, мы рекомендуем изменить приоритет этих FCM на обычный , чтобы сообщения, приводящие к отправке уведомлений, не понижались в приоритете.
Конфиденциальность
Разрешение на выполнение для уведомлений
В Android 13 (уровень API 33) введено разрешение на отправку уведомлений во время выполнения: POST_NOTIFICATIONS . Это изменение помогает пользователям сосредоточиться на наиболее важных для них уведомлениях.
Мы настоятельно рекомендуем как можно скорее перейти на Android 13 или более позднюю версию, чтобы в полной мере воспользоваться преимуществами дополнительной гибкости и контроля, которые предоставляет эта функция.
Узнайте больше о лучших практиках управления разрешениями приложений .
Скрыть конфиденциальную информацию из буфера обмена
Если ваше приложение позволяет пользователям копировать конфиденциальную информацию, такую как пароли или данные кредитных карт, в буфер обмена, необходимо добавить флаг в ClipDescription объекта ClipData перед вызовом ClipboardManager#setPrimaryClip() . Добавление этого флага предотвратит отображение конфиденциальной информации в предварительном просмотре содержимого.


Чтобы пометить контент, содержащий конфиденциальную информацию, добавьте логическое значение в поле ClipDescription . Это должны делать все приложения, независимо от целевого уровня API.
// When your app is compiled with the API level 33 SDK or higher
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
}
}
// If your app is compiled with a lower SDK
clipData.apply {
description.extras = PersistableBundle().apply {
putBoolean("android.content.extra.IS_SENSITIVE", true)
}
}
Чтобы узнать больше о новом интерфейсе буфера обмена, посетите страницу функции копирования и вставки .
Безопасность
Откажитесь от использования общего идентификатора пользователя.
Если ваше приложение использует устаревший атрибут android:sharedUserId и больше не зависит от его функциональности, вы можете установить атрибут android:sharedUserMaxSdkVersion равным 32 , как показано в следующем фрагменте кода:
<manifest ...> <!-- To maintain backward compatibility, continue to use "android:sharedUserId" if you already added it to your ma>nifest. -- android:sharedUserId="SHARED_PACKAGE_NAME" android:sharedUserMaxSdkV<ersion=&q>uot;32" ... /manifest
Этот атрибут сообщает системе, что ваше приложение больше не зависит от общего идентификатора пользователя. Если ваше приложение объявляет android:sharedUserMaxSdkVersion и устанавливается на устройства под управлением Android 13 или выше, оно будет работать так, как если бы вы никогда не определяли android:sharedUserId . Обновленные приложения по-прежнему будут использовать существующий общий идентификатор пользователя.
Использование общих идентификаторов пользователей приводит к непредсказуемому поведению в менеджере пакетов. Вместо этого ваше приложение должно использовать надлежащие механизмы связи, такие как сервисы и поставщики контента, для обеспечения взаимодействия между общими компонентами.
пользовательский опыт
Отклоняемые уведомления служб переднего плана
На устройствах под управлением Android 13 и выше пользователи могут по умолчанию отклонять уведомления, связанные с активными службами .
Основная функциональность
Удалена устаревшая копия реализации службы распознавания речи.
В Android 13 из приложения Google удалена реализация SpeechService , включая Voice IME, RecognitionService и API на основе намерений .
В Android 12 произошли следующие изменения:
- Функциональные возможности
SpeechServiceбыли перенесены в приложение Speech Services by Google , которое стало поставщикомSpeechServiceпо умолчанию. - Функциональность
RecognitionServiceбыла перенесена в приложение Android System Intelligence для поддержки распознавания речи на устройстве.
Для обеспечения совместимости приложения с Android 12, приложение Google использует механизм перенаправления трафика на приложение Speech Services by Google. В Android 13 этот механизм был удален.
Приложениям следует использовать поставщика SpeechService по умолчанию, установленного на устройстве, а не жестко прописывать в коде конкретное приложение.