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

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

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

Пользовательский опыт и пользовательский интерфейс системы

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

Виджет ограничения памяти

Начиная с Android 17, для приложений, ориентированных на Android 17 (уровень API 37) или выше, система устанавливает строгое ограничение на использование памяти (1,5 * ширина экрана * высота экрана * 4) для суммарного использования памяти как Bitmap-элементами, так и Icon-элементами, находящимися в пакете RemoteViews. Превышение этих ограничений приводит к фатальной ошибке IllegalArgumentException и сбою процесса приложения.

Для получения дополнительной информации см. 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.

此功能引入了新的 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 引入了对加密 Client Hello (ECH) 的平台支持。ECH 是一项 TLS 扩展,可通过加密 TLS 握手中的服务器名称指示 (SNI) 来增强用户隐私保护。这种加密有助于防止网络观察者轻易识别出您的应用所连接的特定网域。

对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,ECH 用于 TLS 连接。只有当应用使用的网络库(例如 HttpEngine、WebView 或 OkHttp)已集成 ECH 支持,并且远程服务器也支持 ECH 协议时,ECH 才会处于有效状态。如果无法协商 ECH,客户端会发送包含随机内容的 ECH 扩展程序(一种称为 ECH GREASE 的机制)。如需详细了解 ECH GREASE 的运作方式,请参阅 RFC 9849

为了允许应用自定义此行为,Android 17 向网络安全配置文件添加了一个新的 <domainEncryption> 元素。开发者可以在 <base-config><domain-config> 标记中使用 <domainEncryption>,以全局或按网域选择 ECH 模式(例如 "enabled""disabled")。

如需了解详情,请参阅加密的客户端 Hello 文档。

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

Android 17 引入了 ACCESS_LOCAL_NETWORK 运行时权限,以保护用户免遭未经授权的本地网络访问。由于此权限属于现有的 NEARBY_DEVICES 权限组,因此已授予其他 NEARBY_DEVICES 权限的用户不会再次收到提示。这项新要求可防止恶意应用利用不受限制的本地网络访问权限进行隐蔽的用户跟踪和指纹识别。通过声明和请求此权限,您的应用可以发现并连接到局域网 (LAN) 中的设备,例如智能家居设备或投屏接收器。

以 Android 17(API 级别 37)或更高版本为目标平台的应用现在可以通过两种方式与 LAN 设备保持通信:采用系统介导的、可保护隐私的设备选择器来跳过权限提示,或者在运行时明确请求这项新权限来保持本地网络通信。

如需了解详情,请参阅本地网络权限文档。

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

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

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

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

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

从 Android 17 开始,Android 将扩展其短信动态密码保护功能,以适用于标准短信(包含未使用 WebOTP 或 SMS Retriever 格式的动态密码的短信)。对于以 Android 17(API 级别 37)或更高版本为目标平台的大多数应用,这些短信在收到后三小时内无法使用。此延迟旨在帮助防止 OTP 劫持。在这 3 小时的延迟期间,SMS_RECEIVED_ACTION 广播会被保留,并且 SMS 提供方数据库查询会被过滤。延迟结束后,这些应用即可访问相应短信。

某些应用(例如默认的短信助理应用、已连接的设备配套应用等)不受此延迟限制。所有依赖于读取短信消息来提取 OTP 的应用都应改用 SMS RetrieverSMS User Consent API,以确保功能能够继续正常运行。

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

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

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

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

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

  • BAL hardening & improved opt-in: We are refining Background Activity Launch (BAL) restrictions by extending protections to IntentSender . Developers must migrate away from the legacy MODE_BACKGROUND_ACTIVITY_START_ALLOWED constant. Instead, you should adopt granular controls like MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE , which restricts activity starts to scenarios where the calling app is visible, significantly reducing the attack surface.
  • Инструменты внедрения: Разработчикам следует использовать строгий режим и обновленные проверки синтаксиса для выявления устаревших шаблонов и обеспечения готовности к будущим требованиям целевого SDK.

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

如果应用以 Android 17(API 级别 37)或更高版本为目标平台,则默认启用证书透明度 (CT)。(在 Android 16 上,CT 可用,但应用必须选择启用。)

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

如果您的应用以 Android 17(API 级别 37)或更高版本为目标平台,则 Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护功能现在也适用于原生库。

使用 System.load() 加载的所有原生文件都必须标记为只读。 否则,系统会抛出 UnsatisfiedLinkError

我们建议应用尽可能避免动态加载代码,因为这样做会大大增加应用因代码注入或代码篡改而遭到入侵的风险。

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

对于以 Android 17(API 级别 37)及更高级别为目标平台的应用,联系人提供程序 2 (CP2) 会限制数据视图中包含某些个人身份信息 (PII) 的列。启用此变更后,系统会从数据视图中移除这些列,以增强用户隐私保护。 受限列包括:

使用 ContactsContract.Data 中这些列的应用可以通过与 RAW_CONTACT_ID 联接,改为从 ContactsContract.RawContacts 中提取这些列。

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

对于以 Android 17(API 级别 37)及更高版本为目标平台的应用,当在没有 READ_CONTACTS 权限的情况下访问 ContactsContract.Data 表时,联系人提供程序 2 (CP2) 会强制执行严格的 SQL 查询验证。

在此更改之后,如果应用没有 READ_CONTACTS 权限,则在查询 ContactsContract.Data 表时,系统会设置 StrictColumnsStrictGrammar 选项。如果查询使用的模式与这些模式不兼容,则会被拒绝并导致抛出异常。

Интеллект

В 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).

我们在 Android 16 中引入了平台 API 变更,以忽略以 API 级别 36 或更高级别为目标的应用在大屏 (sw >= 600dp) 设备上的屏幕方向、宽高比和尺寸调整能力限制。开发者可以选择使用 SDK 36 停用这些变更,但对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,此停用选项将不再可用。

如需了解详情,请参阅忽略了有关屏幕方向和可调整大小性的限制

Подключение

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

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

对于以 Android 17(API 级别 37)为目标平台的应用,从基于 RFCOMM 的 BluetoothSocket 获取的 InputStreamread() 方法现在在套接字关闭或连接断开时返回 -1

此变更使 RFCOMM 套接字行为与 LE CoC 套接字保持一致,并与标准 InputStream.read() 文档保持一致,该文档指出,当到达数据流末尾时,系统会返回 -1

仅依靠捕获 IOException 来跳出读取循环的应用可能会受到此变更的影响,应更新 BluetoothSocket 读取循环以明确检查 -1 的返回值。这可确保在远程设备断开连接或套接字关闭时,循环正确终止。如需查看推荐的实现示例,请参阅传输蓝牙数据指南中的代码段