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ỉ áp dụng cho ứng dụng nhắm đến Android 17 trở lên. Nếu ứng dụng của bạn nhắm đế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 (nếu cần).

Ngoài ra, hãy nhớ tham khảo danh sách các 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 giúp 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 MessageQueue mới không khoá

从 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ý của 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)

Android 17 giới thiệu tính năng hỗ trợ nền tảng cho Encrypted Client Hello (ECH), một tiện ích TLS giúp tăng cường quyền riêng tư của người dùng bằng cách mã hoá Chỉ báo tên máy chủ (SNI) trong quy trình bắt tay TLS. Quá trình mã hoá này giúp ngăn chặn những người quan sát mạng dễ dàng xác định miền cụ thể mà ứng dụng của bạn đang kết nối.

Đối với các ứng dụng nhắm đến Android 17 (cấp độ API 37) trở lên, ECH được dùng cho các kết nối TLS. ECH chỉ hoạt động nếu thư viện mạng mà ứng dụng sử dụng (ví dụ: HttpEngine, WebView hoặc OkHttp) đã tích hợp tính năng hỗ trợ ECH và máy chủ từ xa cũng hỗ trợ giao thức ECH. Nếu không thương lượng được ECH, máy khách sẽ gửi một tiện ích ECH có nội dung ngẫu nhiên (một cơ chế gọi là ECH GREASE). Hãy xem RFC 9849 để biết thêm thông tin chi tiết về cách hoạt động của ECH GREASE.

Để cho phép các ứng dụng tuỳ chỉnh hành vi này, Android 17 sẽ thêm một phần tử <domainEncryption> mới vào tệp Cấu hình bảo mật mạng. Nhà phát triển có thể sử dụng <domainEncryption> trong thẻ <base-config> hoặc <domain-config> để chọn một chế độ ECH (ví dụ: "enabled" hoặc "disabled") trên cơ sở toàn cầu hoặc theo từng miền.

Để biết thêm thông tin, hãy xem tài liệu về Encrypted Client Hello.

Ứ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 trên thiết bị thực

如果应用以 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

Kể từ Android 17, Android sẽ mở rộng tính năng bảo vệ OTP qua SMS để áp dụng cho tin nhắn SMS tiêu chuẩn (tin nhắn SMS chứa OTP không sử dụng định dạng WebOTP hoặc SMS Retriever). Đối với hầu hết các ứng dụng nhắm đến Android 17 (cấp độ API 37) trở lên, những tin nhắn SMS này sẽ không có sẵn cho đến 3 giờ sau khi nhận. Việc trì hoãn này nhằm giúp ngăn chặn hành vi đánh cắp OTP. Trong thời gian trì hoãn 3 giờ này, thông báo SMS_RECEIVED_ACTION sẽ bị giữ lại và các truy vấn cơ sở dữ liệu của nhà cung cấp dịch vụ SMS sẽ được lọc. Sau khi có độ trễ, các ứng dụng này sẽ nhận được tin nhắn SMS.

Một số ứng dụng như ứng dụng trợ lý SMS mặc định, ứng dụng đồng hành của thiết bị thông minh, v.v. được miễn trừ khỏi quy định về độ trễ này. Tất cả các ứng dụng dựa vào việc đọc tin nhắn SMS để trích xuất OTP đều phải chuyển sang sử dụng API SMS Retriever hoặc SMS User Consent để đảm bảo chức năng tiếp tục hoạt động.

Bảo mật

Android 17 có những điểm cải tiến sau đây về tính bảo mật của 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

Nếu ứng dụng của bạn nhắm đến Android 17 (cấp độ API 37) trở lên, thì tính năng bảo vệ Tải mã động (DCL) an toàn hơn được giới thiệu trong Android 14 cho các tệp DEX và JAR hiện đã mở rộng sang các thư viện gốc.

Tất cả các tệp gốc được tải bằng System.load() đều phải được đánh dấu là chỉ có quyền đọc. Nếu không, hệ thống sẽ gửi ra UnsatisfiedLinkError.

Bất cứ khi nào có thể thì bạn nên tránh tải mã động, vì làm như vậy sẽ làm tăng đáng kể nguy cơ ứng dụng có thể bị xâm phạm do bị chèn mã hoặc can thiệp vào mã.

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 quy trình 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

Kể từ Android 17, khung âm thanh sẽ thực thi các quy tắc hạn chế đối với hoạt động tương tác âm thanh ở chế độ nền, bao gồm cả việc phát âm thanh, yêu cầu lấy quyền phát âm thanh và API thay đổi âm lượng để đảm bảo người dùng chủ ý bắt đầu những thay đổi này.

Một số quy định hạn chế về âm thanh áp dụng cho tất cả các ứng dụng. Tuy nhiên, các quy tắc hạn chế sẽ nghiêm ngặt hơn nếu một ứng dụng nhắm đến Android 17 (cấp độ API 37). Nếu một trong các ứng dụng này tương tác với âm thanh trong khi ở chế độ nền, thì ứng dụng đó phải có một dịch vụ chạy ở nền trước. Ngoài ra, ứng dụng phải đáp ứng một hoặc cả hai yêu cầu sau:

  • Dịch vụ trên nền trước phải có các chức năng khi đang sử dụng (WIU).
  • Ứng dụng phải có quyền chuông báo chính xác và tương tác với luồng âm thanh USAGE_ALARM.

Để biết thêm thông tin, bao gồm cả các chiến lược giảm thiểu, hãy xem phần Tăng cường bảo mật cho âm thanh nền.

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 thiết bị và kiểu dáng.

Các thay đổi về Platform API để bỏ qua các hạn chế 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à điều chỉnh theo hành vi InputStream tiêu chuẩn của Java 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.