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

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

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

Производительность и батарея

Диспетчер задач

Внизу панели уведомлений есть кнопка, на которой указано количество приложений, работающих в фоновом режиме. При нажатии на эту кнопку появляется диалоговое окно со списком приложений. Кнопка "Остановить" находится справа от каждого приложения.
Рисунок 1. Рабочий процесс для диспетчера задач , который позволяет пользователям останавливать приложения с активными службами. Этот процесс доступен только на устройствах с 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 Messaging (FCM) с высоким приоритетом

В Android 13 (уровень API 33) обновлены квоты Firebase Cloud Messaging (FCM), чтобы повысить надежность доставки FCM с высоким приоритетом для приложений, которые показывают уведомления в ответ на FCM с высоким приоритетом. В Android 13 (уровень API 33) изменилось следующее:

  • Группы App Standby больше не определяют, сколько сообщений FCM с высоким приоритетом может использовать приложение.
  • Теперь система понижает приоритет сообщений, если обнаруживает, что приложение постоянно отправляет сообщения с высоким приоритетом, которые не приводят к показу уведомлений.

Как и в предыдущих версиях Android, сообщения FCM с высоким приоритетом, которые превышают квоту, понижаются до обычного приоритета. При запуске активных служб в ответ на 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, в том числе голосовой ввод, RecognitionService и API на основе намерений.

В Android 12 произошли следующие изменения:

  • Функции SpeechService были перенесены в Речевые сервисы от Google, которые стали поставщиком SpeechService по умолчанию.
  • Функции RecognitionService были перенесены в приложение Android System Intelligence, чтобы поддерживать распознавание речи на устройстве.

Чтобы обеспечить совместимость приложений с Android 12, приложение Google использует трамплин для перенаправления трафика в приложение "Речевые сервисы от Google". В Android 13 этот трамплин удален.

Приложения должны использовать поставщика по умолчанию для SpeechService, а не жестко задавать определенное приложение.