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

Платформа 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 (FCM)

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

  • Резервные сегменты приложений больше не определяют, сколько FCM с высоким приоритетом может использовать приложение.
  • Квоты FCM с высоким приоритетом масштабируются пропорционально количеству уведомлений, отображаемых пользователю в ответ на 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 реализация SpeechService , включая Voice IME, RecognitionService и API на основе намерений , удалена из приложения Google.

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

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

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

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