Изменения поведения: приложения для Android 17 и выше

Как и в предыдущих версиях, Android 17 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения в поведении применяются исключительно к приложениям, ориентированным на Android 17 или более поздние версии. Если ваше приложение ориентировано на Android 17 или более поздние версии, вам следует внести в него изменения для поддержки этих изменений, где это применимо.

Обязательно ознакомьтесь также со списком изменений в поведении, которые затрагивают все приложения, работающие на Android 17, независимо от targetSdkVersion вашего приложения.

Основная функциональность

В Android 17 внесены следующие изменения, которые модифицируют или расширяют различные основные возможности системы Android.

Новая реализация MessageQueue без блокировок

Начиная с Android 17, приложения, ориентированные на Android 17 (уровень API 37) или выше, получают новую реализацию android.os.MessageQueue без блокировок. Новая реализация повышает производительность и уменьшает количество пропущенных кадров, но может нарушить работу клиентов, которые используют закрытые поля и методы MessageQueue для рефлексии.

Для получения дополнительной информации, включая стратегии смягчения последствий, см. руководство по изменению поведения в MessageQueue .

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

Приложения, работающие на Android 17 или выше и ориентированные на Android 17 (уровень API 37) или выше, не могут изменять static final поля. Если приложение попытается изменить static final поле с помощью рефлексии, это вызовет исключение IllegalAccessException . Попытка изменить одно из этих полей через API JNI (например, SetStaticLongField() ) приведет к сбою приложения.

Доступность

В Android 17 внесены следующие изменения для улучшения доступности.

Поддержка доступности при вводе текста с физической клавиатуры с использованием сложных IME.

此功能引入了新的 AccessibilityEventTextAttribute API,以增强屏幕阅读器针对 CJKV 语言输入的语音反馈。CJKV IME 应用现在可以指示在文本撰写期间是否已选择文本转换候选内容。具有编辑字段的应用可以在发送文本更改无障碍事件时指定文本更改类型。例如,应用可以指定在文本撰写期间发生了文本更改,或者文本更改是由提交导致的。这样做可让屏幕阅读器等无障碍服务根据文本修改的性质提供更精确的反馈。

应用采用量

  • IME 应用:在编辑字段中设置正在撰写的文本时,IME 可以使用 TextAttribute.Builder.setTextSuggestionSelected() 来指明是否选择了特定的转换候选对象。

  • 具有“编辑字段”权限的应用:维护自定义 InputConnection 的应用可以通过调用 TextAttribute.isTextSuggestionSelected() 来检索候选选择数据。然后,这些应用在调度 TYPE_VIEW_TEXT_CHANGED 事件时应调用 AccessibilityEvent.setTextChangeTypes()。如果应用以 Android 17(API 级别 37)为目标平台,并使用标准 TextView,则默认启用此功能。(也就是说,TextView 将负责从 IME 检索数据,并在向无障碍服务发送事件时设置文本更改类型)。

  • 无障碍服务:处理 TYPE_VIEW_TEXT_CHANGED 事件的无障碍服务可以调用 AccessibilityEvent.getTextChangeTypes() 来识别修改的性质,并相应地调整其反馈策略。

Конфиденциальность

В Android 17 внесены следующие изменения для повышения конфиденциальности пользователей.

Включена функция ECH (Encrypted Client Hello).

В Android 17 появилась поддержка технологии Encrypted Client Hello (ECH), расширения TLS, повышающего конфиденциальность пользователей за счет шифрования Server Name Indication (SNI) в процессе установления соединения TLS. Это шифрование помогает предотвратить легкое определение сетевыми наблюдателями конкретного домена, к которому подключается ваше приложение.

Для приложений, ориентированных на Android 17 (уровень API 37) или выше, для TLS-соединений используется ECH. ECH активен только в том случае, если используемая приложением сетевая библиотека (например, HttpEngine, WebView или OkHttp) имеет встроенную поддержку ECH, а удаленный сервер также поддерживает протокол ECH. Если установить ECH не удается, клиент отправляет расширение ECH со случайным содержимым (механизм, называемый ECH GREASE). Подробнее о работе ECH GREASE см. в RFC 9849 .

Чтобы позволить приложениям настраивать это поведение, Android 17 добавляет новый элемент <domainEncryption> в файл конфигурации сетевой безопасности. Разработчики могут использовать <domainEncryption> внутри тегов <base-config> или <domain-config> для выбора режима шифрования доменных имен (например, "enabled" или "disabled" ) на глобальном уровне или для каждого домена отдельно.

Для получения более подробной информации см. документацию по протоколу Encrypted Client Hello .

Для приложений, ориентированных на Android 17, требуется разрешение на доступ к локальной сети.

В Android 17 введено разрешение ACCESS_LOCAL_NETWORK , предназначенное для защиты пользователей от несанкционированного доступа к локальной сети. Поскольку это разрешение входит в существующую группу разрешений NEARBY_DEVICES , пользователям, уже предоставившим другие разрешения NEARBY_DEVICES повторное запрос на предоставление разрешения не требуется. Это новое требование предотвращает использование вредоносными приложениями неограниченного доступа к локальной сети для скрытого отслеживания и идентификации пользователей. Объявив и запросив это разрешение, ваше приложение сможет обнаруживать и подключаться к устройствам в локальной сети (LAN), таким как устройства умного дома или приемники трансляции.

Приложения, ориентированные на Android 17 (уровень API 37) или выше, теперь имеют два способа поддерживать связь с устройствами локальной сети: использовать системные средства выбора устройств, обеспечивающие конфиденциальность и позволяющие пропустить запрос на разрешение, или явно запрашивать это новое разрешение во время выполнения для поддержания связи с локальной сетью.

Для получения более подробной информации см. документацию по правам доступа в локальной сети .

Скрытие паролей с физических устройств

Если приложение ориентировано на Android 17 (уровень API 37) или выше, и пользователь использует физическое устройство ввода (например, внешнюю клавиатуру), операционная система Android применяет новый параметр show_passwords_physical ко всем символам в поле ввода пароля. По умолчанию этот параметр скрывает все символы пароля.

Система Android отображает последний введенный символ пароля, чтобы помочь пользователю увидеть, не допустил ли он ошибку при вводе. Однако это гораздо менее необходимо при использовании больших внешних клавиатур. Кроме того, устройства с внешними клавиатурами часто имеют большие дисплеи, что увеличивает риск того, что кто-то увидит введенный пароль.

Если пользователь использует сенсорный экран устройства, система применяет новую настройку show_passwords_touch .

Защита от одноразового пароля (OTP) для стандартных SMS-сообщений

Начиная с Android 17, Android расширяет защиту от использования одноразовых паролей (OTP) в SMS-сообщениях, распространяя её на стандартные SMS-сообщения (SMS-сообщения, содержащие OTP, которые не используют форматы WebOTP или SMS Retriever). Для большинства приложений, ориентированных на Android 17 (уровень API 37) или выше, эти SMS-сообщения становятся доступны только через три часа после получения. Эта задержка предназначена для предотвращения перехвата OTP. В течение этих трёх часов широковещательная рассылка SMS_RECEIVED_ACTION приостанавливается, а запросы к базе данных поставщика SMS фильтруются. SMS-сообщение становится доступным для этих приложений после истечения задержки.

Некоторые приложения, такие как стандартное приложение-помощник для SMS, сопутствующие приложения для подключенных устройств и т. д., не подпадают под действие этой задержки. Всем приложениям, которые используют чтение SMS-сообщений для извлечения OTP, следует перейти на использование API SMS Retriever или SMS User Consent для обеспечения непрерывной работы.

Безопасность

В Android 17 внесены следующие улучшения в безопасность устройств и приложений.

Безопасность деятельности

В Android 17 платформа продолжает переход к архитектуре «безопасность по умолчанию», внедряя ряд улучшений, призванных смягчить последствия серьезных атак, таких как фишинг, перехват взаимодействия и атаки с использованием «запутанного заместителя». Это обновление требует от разработчиков явного согласия на использование новых стандартов безопасности для обеспечения совместимости приложений и защиты пользователей.

К основным последствиям для разработчиков относятся:

  • Усиление защиты BAL и улучшенная возможность включения: Мы совершенствуем ограничения на запуск фоновых действий (BAL), распространяя защиту на IntentSender . Разработчикам необходимо отказаться от устаревшей константы MODE_BACKGROUND_ACTIVITY_START_ALLOWED . Вместо этого следует использовать более детальные средства контроля, такие как MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE , которые ограничивают запуск действий сценариями, когда вызывающее приложение видимо, что значительно уменьшает поверхность атаки.
  • Инструменты внедрения: Разработчикам следует использовать строгий режим и обновленные проверки синтаксиса для выявления устаревших шаблонов и обеспечения готовности к будущим требованиям целевого SDK.

Включить КТ по ​​умолчанию

Если приложение ориентировано на Android 17 (уровень API 37) или выше, прозрачность сертификатов (CT) включена по умолчанию. (На Android 16 прозрачность сертификатов доступна, но приложениям приходилось включать её вручную .)

Более безопасный коренной DCL—C

Если ваше приложение ориентировано на Android 17 (уровень API 37) или выше, то защита Safer Dynamic Code Loading (DCL), представленная в Android 14 для файлов DEX и JAR, теперь распространяется и на нативные библиотеки.

Все файлы, загружаемые с помощью System.load() должны быть помечены как доступные только для чтения. В противном случае система выдаст UnsatisfiedLinkError .

Мы рекомендуем приложениям по возможности избегать динамической загрузки кода, поскольку это значительно увеличивает риск взлома приложения путем внедрения или изменения кода.

Ограничение доступа к полям, содержащим персональные данные, в представлении данных CP2.

Для приложений, ориентированных на Android 17 (уровень API Android 17 (уровень API 37)) и выше, Contacts Provider 2 (CP2) ограничивает отображение данных в определенных столбцах, содержащих персональные данные. При включении этой функции данные в этих столбцах удаляются для повышения конфиденциальности пользователей. К ограниченным столбцам относятся:

Приложения, использующие эти столбцы из ContactsContract.Data , могут извлекать их из ContactsContract.RawContacts , объединяя данные с помощью RAW_CONTACT_ID .

Внедрить строгие проверки SQL в CP2

Для приложений, ориентированных на Android 17 (уровень API Android 17 (уровень API 37)) и выше, Contacts Provider 2 (CP2) обеспечивает строгую проверку SQL-запросов при обращении к таблице ContactsContract.Data без разрешения READ_CONTACTS .

Благодаря этому изменению, если у приложения нет разрешения READ_CONTACTS , при запросе к таблице ContactsContract.Data устанавливаются параметры StrictColumns и StrictGrammar . Если запрос использует шаблон, несовместимый с этими параметрами, он будет отклонен, и будет выброшено исключение.

СМИ

В Android 17 внесены следующие изменения в работу с мультимедиа.

Фоновое усиление защиты звука

Начиная с Android 17, аудиофреймворк вводит ограничения на фоновые взаимодействия со звуком, включая воспроизведение аудио, запросы на фокусировку на аудио и API изменения громкости, чтобы гарантировать, что эти изменения инициируются пользователем осознанно.

Некоторые ограничения на воспроизведение звука распространяются на все приложения. Однако ограничения более строгие, если приложение ориентировано на Android 17 (уровень API 37). Если такое приложение взаимодействует со звуком в фоновом режиме, у него должна быть запущена служба переднего плана. Кроме того, приложение должно соответствовать одному или обоим из следующих требований:

Для получения дополнительной информации, включая стратегии смягчения последствий, см. раздел «Усиление защиты фонового звука» .

форм-факторы устройств

В Android 17 внесены следующие изменения для улучшения пользовательского опыта на устройствах различных размеров и форм-факторов.

Изменения в API платформы позволяют игнорировать ограничения по ориентации, масштабируемости и соотношению сторон на больших экранах (sw>=600dp).

В Android 16 мы внесли изменения в Platform API, позволяющие игнорировать ограничения по ориентации, соотношению сторон и масштабируемости на больших экранах (sw >= 600dp) для приложений, ориентированных на API уровня 36 или выше. Разработчики могут отказаться от этих изменений в SDK 36, но эта возможность больше не будет доступна для приложений, ориентированных на Android 17 (API уровня 37) или выше.

Для получения дополнительной информации см. раздел «Ограничения на ориентацию и изменение размера игнорируются» .

Подключение

В Android 17 внесены следующие изменения для повышения согласованности и соответствия стандартному поведению Java InputStream для Bluetooth RFCOMM-сокетов.

Последовательное поведение функции чтения BluetoothSocket для RFCOMM

Для приложений, ориентированных на Android 17 (уровень API 37), метод read() объекта InputStream , полученного из BluetoothSocket на основе RFCOMM, теперь возвращает -1 когда сокет закрывается или соединение разрывается.

Это изменение приводит поведение сокета RFCOMM в соответствие с сокетами LE CoC и согласуется со стандартной документацией InputStream.read() , в которой указано, что при достижении конца потока возвращается значение -1 .

Приложения, которые полагаются исключительно на перехват исключения IOException для выхода из цикла чтения, могут быть затронуты этим изменением и должны обновить циклы чтения BluetoothSocket, чтобы явно проверять возвращаемое значение -1 . ​​Это гарантирует корректное завершение цикла при отключении удаленного устройства или закрытии сокета. Пример рекомендуемой реализации см. в фрагменте кода в руководстве по передаче данных Bluetooth .