Thay đổi về hành vi: Ứng dụng nhắm đến Android 17 trở lên

Giống như các bản phát hành trước, Android 17 có các thay đổi về hành vi có thể ảnh hưởng đến ứng dụng của bạn. Những thay đổi về hành vi sau đây chỉ tác động đến ứng dụng hướng đến Android 17 trở lên. Nếu ứng dụng của bạn hướng đến Android 17 trở lên, bạn nên điều chỉnh ứng dụng để hỗ trợ những hành vi này cho phù hợp (nếu cần).

Ngoài ra, hãy nhớ tham khảo danh sách thay đổi về hành vi ảnh hưởng đến tất cả ứng dụng chạy trên Android 17 bất kể targetSdkVersion của ứng dụng.

Chức năng cốt lõi

Android 17 có những thay đổi sau đây nhằm sửa đổi hoặc mở rộng nhiều chức năng cốt lõi của hệ thống Android.

Cách triển khai mới không cần khoá của MessageQueue

从 Android 17 开始,以 Android 17(API 级别 37) 或更高版本为目标平台的应用会收到 android.os.MessageQueue 的新无锁实现。新实现可提升性能并减少丢帧,但可能会破坏反映 MessageQueue 私有字段和方法的客户端。

如需了解详情(包括缓解措施),请参阅 MessageQueue 行为变更指南

Các trường cuối cùng tĩnh hiện không thể sửa đổi

在以 Android 17(API 级别 37)或更高版本为目标平台的 Android 17 或更高版本上运行的应用无法更改 static final 字段。如果应用尝试使用反射更改 static final 字段,则会导致 IllegalAccessException。尝试通过 JNI API(例如 SetStaticLongField())修改其中一个字段会导致应用崩溃。

Hỗ trợ tiếp cận

Android 17 có những thay đổi sau đây để cải thiện khả năng hỗ trợ tiếp cận.

Hỗ trợ tiếp cận cho việc nhập bằng bàn phím vật lý IME phức tạp

Tính năng này giới thiệu các AccessibilityEventTextAttribute API mới để cải thiện phản hồi bằng giọng nói của trình đọc màn hình cho việc nhập ngôn ngữ CJKV. Giờ đây, các ứng dụng IME CJKV có thể báo hiệu liệu một ứng viên chuyển đổi văn bản đã được chọn trong quá trình soạn văn bản hay chưa. Các ứng dụng có trường chỉnh sửa có thể chỉ định loại thay đổi văn bản khi gửi sự kiện hỗ trợ tiếp cận văn bản đã thay đổi. Ví dụ: các ứng dụng có thể chỉ định rằng một thay đổi văn bản đã xảy ra trong quá trình soạn văn bản hoặc một thay đổi văn bản là do một thao tác cam kết. Việc này cho phép các dịch vụ hỗ trợ tiếp cận như trình đọc màn hình đưa ra phản hồi chính xác hơn dựa trên bản chất của việc sửa đổi văn bản.

Số ứng dụng sử dụng

  • Ứng dụng IME: Khi đặt văn bản soạn trong các trường chỉnh sửa, IME có thể sử dụng TextAttribute.Builder.setTextSuggestionSelected() để cho biết liệu một ứng viên chuyển đổi cụ thể có được chọn hay không.

  • Ứng dụng có trường chỉnh sửa: Các ứng dụng duy trì InputConnection tuỳ chỉnh có thể truy xuất dữ liệu lựa chọn ứng viên bằng cách gọi TextAttribute.isTextSuggestionSelected(). Sau đó, các ứng dụng này sẽ gọi AccessibilityEvent.setTextChangeTypes() khi gửi các sự kiện TYPE_VIEW_TEXT_CHANGED. Các ứng dụng nhắm đến Android 17 (cấp độ API 37) sử dụng TextView tiêu chuẩn sẽ bật tính năng này theo mặc định. (Tức là TextView sẽ xử lý việc truy xuất dữ liệu từ IME và đặt các loại thay đổi văn bản khi gửi sự kiện đến các dịch vụ hỗ trợ tiếp cận).

  • Dịch vụ hỗ trợ tiếp cận: Các dịch vụ hỗ trợ tiếp cận xử lý sự kiện TYPE_VIEW_TEXT_CHANGED có thể gọi AccessibilityEvent.getTextChangeTypes() để xác định bản chất của việc sửa đổi và điều chỉnh chiến lược phản hồi cho phù hợp.

Quyền riêng tư

Android 17 có những thay đổi sau đây để cải thiện quyền riêng tư của người dùng.

Đã bật ECH (Encrypted Client Hello – Lời chào được mã hoá của máy khách)

Android 17 引入了对加密客户端问候 (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")。

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

Ứng dụng nhắm đến Android 17 cần có quyền truy cập vào mạng cục bộ

Android 17 giới thiệu quyền khi bắt đầu chạy ACCESS_LOCAL_NETWORK để bảo vệ người dùng khỏi hoạt động truy cập trái phép vào mạng cục bộ. Vì quyền này thuộc nhóm quyền NEARBY_DEVICES hiện có, nên những người dùng đã cấp các quyền NEARBY_DEVICES khác sẽ không được nhắc lại. Yêu cầu mới này ngăn các ứng dụng độc hại khai thác quyền truy cập mạng cục bộ không hạn chế để theo dõi người dùng và tạo vân tay số một cách bí mật. Bằng cách khai báo và yêu cầu quyền này, ứng dụng của bạn có thể khám phá và kết nối với các thiết bị trên mạng cục bộ (LAN), chẳng hạn như thiết bị nhà thông minh hoặc thiết bị nhận truyền nội dung.

Các ứng dụng nhắm đến Android 17 (cấp độ API 37) trở lên hiện có 2 cách để duy trì giao tiếp với các thiết bị LAN: Sử dụng bộ chọn thiết bị do hệ thống làm trung gian, đảm bảo quyền riêng tư để bỏ qua lời nhắc cấp quyền hoặc yêu cầu rõ ràng quyền mới này trong thời gian chạy để duy trì giao tiếp mạng cục bộ.

Để biết thêm thông tin, hãy xem tài liệu về Quyền truy cập vào mạng cục bộ.

Ẩn mật khẩu khỏi thiết bị vật lý

如果应用以 Android 17(API 级别 37)或更高版本为目标平台,并且用户使用的是实体输入设备(例如外接键盘),Android 操作系统会对密码字段中的所有字符应用新的 show_passwords_physical 设置。默认情况下,该设置会隐藏所有密码字符。

Android 系统会显示用户最后输入的密码字符,以帮助用户查看是否输错了密码。不过,对于较大的外接键盘,此功能就没那么必要了。此外,配备外接键盘的设备通常具有较大的显示屏,这会增加他人看到输入密码的风险。

如果用户使用的是设备触摸屏,系统会应用新的 show_passwords_touch 设置。

Bảo vệ OTP cho tin nhắn SMS tiêu chuẩn

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

某些应用(例如默认短信助理应用、已连接的设备配套应用等)不受此延迟限制。所有依赖于读取短信 来提取动态密码的应用都应改用 SMS RetrieverSMS User Consent API,以确保功能持续可用。

Bảo mật

Android 17 có những cải tiến sau đây về bảo mật thiết bị và ứng dụng.

Bảo mật hoạt động

在 Android 17 中,平台继续向“默认安全”架构转变,引入了一系列旨在缓解网络钓鱼、互动劫持和混淆代理攻击等高严重性漏洞的增强功能。此更新要求开发者明确选择启用新的安全标准,以保持应用兼容性和用户保护。

对开发者的主要影响包括:

  • BAL 安全加固和改进的选择启用: 我们正在优化后台活动启动 (BAL) 限制,方法是将保护范围扩展到 IntentSender。开发者必须从旧版 MODE_BACKGROUND_ACTIVITY_START_ALLOWED 常量迁移。相反,您应 采用精细控制,例如 MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,它将 活动启动限制为调用应用可见的场景,从而显著 缩小攻击面。
  • 采用工具: 开发者应利用严格模式和更新后的 lint 检查来识别旧版模式,并确保为未来的目标 SDK 要求做好准备。

Bật CT theo mặc định

Nếu một ứng dụng nhắm đến Android 17 (API cấp 37) trở lên, thì tính minh bạch của chứng chỉ (CT) sẽ được bật theo mặc định. (Trên Android 16, CT có sẵn nhưng các ứng dụng phải chọn sử dụng.)

DCL gốc an toàn hơn – C

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

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

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

Hạn chế các trường PII trong chế độ xem dữ liệu CP2

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

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

Thực thi các lượt kiểm tra SQL nghiêm ngặt trong CP2

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

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

Nội dung nghe nhìn

Android 17 có những thay đổi sau đây về hành vi của nội dung nghe nhìn.

Tăng cường bảo mật âm thanh ở chế độ nền

从 Android 17 开始,音频框架对后台音频互动(包括音频播放、音频焦点请求和音量更改 API)强制执行限制,以确保这些更改是由用户有意启动的。

部分音频限制适用于所有应用。不过,如果应用以 Android 17(API 级别 37)为目标平台,则限制会更加严格。如果这些应用在后台运行时与音频互动,则必须有前台服务正在运行。此外,应用还必须满足以下一项或两项要求:

  • 前台服务必须具有仅在使用时授予的权限 (WIU)。
  • 应用必须具有精确闹钟权限,并且正在与 USAGE_ALARM 音频流互动。

如需了解详情(包括缓解措施),请参阅后台音频安全加固

Kiểu dáng thiết bị

Android 17 có những thay đổi sau đây để cải thiện trải nghiệm người dùng trên nhiều kích thước và kiểu dáng thiết bị.

Các thay đổi về API nền tảng để bỏ qua các ràng buộc về hướng, khả năng đổi kích thước và tỷ lệ khung hình trên màn hình lớn (sw>=600dp)

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

如需了解详情,请参阅忽略屏幕方向和尺寸调整能力限制

Khả năng kết nối

Android 17 có thay đổi sau đây để cải thiện tính nhất quán và phù hợp với hành vi InputStream Java tiêu chuẩn cho các điểm kết nối Bluetooth RFCOMM.

Hành vi nhất quán của BluetoothSocket read() đối với RFCOMM

Đối với các ứng dụng nhắm đến Android 17 (API cấp 37), phương thức read() của InputStream thu được từ một BluetoothSocket dựa trên RFCOMM hiện trả về -1 khi ổ cắm bị đóng hoặc kết nối bị ngắt.

Thay đổi này giúp hành vi của ổ cắm RFCOMM nhất quán với ổ cắm LE CoC và phù hợp với tài liệu InputStream.read() tiêu chuẩn, trong đó nêu rõ rằng -1 được trả về khi đạt đến cuối luồng.

Các ứng dụng chỉ dựa vào việc bắt một IOException để thoát khỏi vòng lặp đọc có thể bị ảnh hưởng bởi thay đổi này và nên cập nhật các vòng lặp đọc BluetoothSocket để kiểm tra rõ ràng giá trị trả về là -1. Điều này đảm bảo vòng lặp kết thúc đúng cách khi thiết bị từ xa ngắt kết nối hoặc ổ cắm bị đóng. Để biết ví dụ về cách triển khai được đề xuất, hãy xem đoạn mã trong hướng dẫn Truyền dữ liệu Bluetooth.