Платформа 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) предоставляет системе следующие способы более эффективного управления временем автономной работы устройства:
- Обновлены правила, определяющие, когда система помещает ваше приложение в «ограниченный» раздел App Standby Bucket .
- Новые ограничения на работу, которую может выполнять ваше приложение, когда пользователь переводит его в состояние «ограничено» для фонового использования батареи.
Тестируя приложение с этими изменениями, обязательно проверьте следующее:
Проверьте, как ваше приложение реагирует, когда система помещает его в «ограниченный» контейнер App Standby . Используйте следующую команду 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 (FCM)
В Android 13 (API уровня 33) обновлены квоты Firebase Cloud Messaging (FCM) для повышения надежности доставки высокоприоритетных 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 manifest. --> android:sharedUserId="SHARED_PACKAGE_NAME" android:sharedUserMaxSdkVersion="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 использует трамплин, перенаправляющий трафик в приложение «Речевые сервисы Google». В Android 13 этот трамплин убран.
Приложения должны использовать поставщика SpeechService
по умолчанию для устройства, а не жестко кодировать конкретное приложение.