Как и в предыдущих версиях, Android 17 включает изменения в поведении, которые могут повлиять на ваше приложение. Следующие изменения в поведении применяются исключительно к приложениям, ориентированным на Android 17 или более поздние версии. Если ваше приложение ориентировано на Android 17 или более поздние версии, вам следует внести в него изменения для поддержки этих изменений, где это применимо.
Обязательно ознакомьтесь также со списком изменений в поведении, которые затрагивают все приложения, работающие на Android 17, независимо от targetSdkVersion вашего приложения.
Пользовательский опыт и пользовательский интерфейс системы
В Android 17 внесены следующие изменения, призванные обеспечить более согласованный и интуитивно понятный пользовательский интерфейс.
Виджет ограничения памяти
Beginning with Android 17, for apps targeting
Android 17 (API level 37) or higher, the system enforces a strict memory
limit (1.5 * screen width * screen height * 4) against the combined memory usage
of both Bitmaps and Icons present in the RemoteViews parcel. Exceeding these
limits throws a fatal IllegalArgumentException and crashes the app's process.
For more information, see UpdateAppWidget.
Основная функциональность
В 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.
Эта функция представляет новые API AccessibilityEvent и TextAttribute для улучшения голосовой обратной связи программ чтения с экрана при вводе текста на языке CJKV. Приложения CJKV IME теперь могут сигнализировать о том, был ли выбран вариант преобразования текста во время ввода текста. Приложения с полями редактирования могут указывать типы изменений текста при отправке событий доступности, связанных с изменением текста. Например, приложения могут указать, что изменение текста произошло во время ввода текста или что изменение текста произошло в результате фиксации изменений. Это позволяет службам доступности, таким как программы чтения с экрана, предоставлять более точную обратную связь в зависимости от характера изменения текста.
внедрение приложений
Приложения IME: При установке текста для ввода в поля редактирования IME могут использовать
TextAttribute.Builder.setTextSuggestionSelected()чтобы указать, был ли выбран конкретный кандидат на конверсию.Приложения с полями редактирования: Приложения, использующие пользовательское
InputConnectionмогут получать данные о выборе вариантов текста, вызываяTextAttribute.isTextSuggestionSelected(). Затем этим приложениям следует вызыватьAccessibilityEvent.setTextChangeTypes()при обработке событийTYPE_VIEW_TEXT_CHANGED. Приложения, ориентированные на Android 17 (уровень API 37) и использующие стандартныйTextView, будут иметь эту функцию включенной по умолчанию. (То есть,TextViewбудет обрабатывать получение данных из IME и устанавливать типы изменения текста при отправке событий в службы специальных возможностей).Службы доступности: Службы доступности, обрабатывающие события
TYPE_VIEW_TEXT_CHANGEDмогут вызывать методAccessibilityEvent.getTextChangeTypes()для определения характера изменения и соответствующей корректировки своих стратегий обратной связи.
Конфиденциальность
В Android 17 внесены следующие изменения для повышения конфиденциальности пользователей.
Включена функция ECH (Encrypted Client Hello).
Android 17 introduces platform support for Encrypted Client Hello (ECH), a TLS extension that enhances user privacy by encrypting the Server Name Indication (SNI) in the TLS handshake. This encryption helps prevent network observers from easily identifying the specific domain your app is connecting to.
For apps targeting Android 17 (API level 37) or higher, ECH is used for TLS connections. ECH is active only if the networking library used by the app (for example, HttpEngine, WebView, or OkHttp) has integrated ECH support and the remote server also supports the ECH protocol. If ECH cannot be negotiated, the client sends an ECH extension with randomized contents (a mechanism called ECH GREASE). See RFC 9849 for more details on how ECH GREASE works.
To allow apps to customize this behavior, Android 17 adds a new
<domainEncryption> element to the Network Security Configuration file.
Developers can use <domainEncryption> within <base-config> or
<domain-config> tags to select an ECH mode (for example,
"enabled" or "disabled") on a global or per-domain basis.
For more information, see the Encrypted Client Hello documentation.
Для приложений, ориентированных на 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 внесены следующие улучшения в безопасность устройств и приложений.
Безопасность деятельности
In Android 17, the platform continues its shift toward a "secure-by-default" architecture, introducing a suite of enhancements designed to mitigate high-severity exploits such as phishing, interaction hijacking, and confused deputy attacks. This update requires developers to explicitly opt in to new security standards to maintain app compatibility and user protection.
Key impacts for developers include:
- BAL hardening & improved opt-in: We are refining Background Activity
Launch (BAL) restrictions by extending protections to
IntentSender. Developers must migrate away from the legacyMODE_BACKGROUND_ACTIVITY_START_ALLOWEDconstant. Instead, you should adopt granular controls likeMODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, which restricts activity starts to scenarios where the calling app is visible, significantly reducing the attack surface. - Adoption tools: Developers should utilize strict mode and updated lint checks to identify legacy patterns and ensure readiness for future target SDK requirements.
Включить КТ по умолчанию
Если приложение ориентировано на 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
For apps targeting Android 17 (API level Android 17 (API level 37)) and
higher, Contacts Provider 2 (CP2) enforces strict SQL query validation when
the ContactsContract.Data table is accessed without
READ_CONTACTS permission.
With this change, if an app doesn't have READ_CONTACTS
permission, StrictColumns and
StrictGrammar options are set when querying
the ContactsContract.Data table. If a query
uses a pattern that isn't compatible with these, it will be
rejected and cause an exception to be thrown.
Интеллект
В Android 17 внесены следующие изменения в систему интеллекта.
Функция setContentCaptureEnabled устарела.
Функция захвата контента включена по умолчанию на некоторых устройствах, чтобы позволить встроенным функциям искусственного интеллекта анализировать содержимое экрана для обеспечения интеллектуального взаимодействия.
Начиная с Android 17, метод API ContentCaptureManager.setContentCaptureEnabled(boolean) устарел. Для приложений, ориентированных на Android 17 (уровень API 37) или выше, вызов setContentCaptureEnabled(false) больше не отключает захват контента.
Если вашему приложению необходимо продолжать отключать захват контента или ограничивать захват содержимого экрана системой, вам следует перейти к использованию параметра макета окна FLAG_SECURE .
Чтобы отключить захват контента, установите флаг FLAG_SECURE для вашего окна, как показано в следующем примере:
Котлин
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
Java
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
);
Для получения более подробной информации см. справочную документацию по WindowManager.LayoutParams.FLAG_SECURE .
СМИ
В Android 17 внесены следующие изменения в работу с мультимедиа.
Фоновое усиление защиты звука
Начиная с Android 17, аудиофреймворк вводит ограничения на фоновые взаимодействия со звуком, включая воспроизведение аудио, запросы на фокусировку на аудио и API изменения громкости, чтобы гарантировать, что эти изменения инициируются пользователем осознанно.
Некоторые ограничения на воспроизведение звука распространяются на все приложения. Однако ограничения более строгие, если приложение ориентировано на Android 17 (уровень API 37). Если такое приложение взаимодействует со звуком в фоновом режиме, у него должна быть запущена служба переднего плана. Кроме того, приложение должно соответствовать одному или обоим из следующих требований:
- Сервис переднего плана должен обладать возможностью мониторинга во время использования (WIU).
- Приложение должно иметь точно такие же разрешения для будильника и взаимодействовать с аудиопотоками
USAGE_ALARM.
Для получения дополнительной информации, включая стратегии смягчения последствий, см. раздел «Усиление защиты фонового звука» .
форм-факторы устройств
В Android 17 внесены следующие изменения для улучшения пользовательского опыта на устройствах различных размеров и форм-факторов.
Изменения в API платформы позволяют игнорировать ограничения по ориентации, масштабируемости и соотношению сторон на больших экранах (sw>=600dp).
We introduced Platform API changes in Android 16 to ignore orientation, aspect ratio, and resizability restrictions on large screens (sw >= 600dp) for apps targeting API level 36 or higher. Developers have the option to opt out of these changes with SDK 36, but this opt-out will no longer be available for apps that target Android 17 (API level 37) or higher.
For more information, see Restrictions on orientation and resizability are ignored.
Подключение
В Android 17 внесены следующие изменения для повышения согласованности и соответствия стандартному поведению Java InputStream для Bluetooth RFCOMM-сокетов.
Последовательное поведение функции чтения BluetoothSocket для RFCOMM
For apps targeting Android 17 (API level 37), the
read() method of the InputStream obtained from an
RFCOMM-based BluetoothSocket now returns -1 when the
socket is closed or the connection is dropped.
This change makes RFCOMM socket behavior consistent with LE CoC sockets and
aligns with the standard InputStream.read()
documentation, which states that -1 is returned when the end of the stream is
reached.
Apps that rely solely on catching an IOException to break out of a read loop may
be impacted by this change and should update the BluetoothSocket read loops to
explicitly check for a return value of -1. This ensures the loop terminates
correctly when the remote device disconnects or the socket is closed. For an
example of the recommended implementation, see the
code snippet in the Transfer Bluetooth data
guide.