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

从 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 đ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

Trong Android 17, nền tảng này tiếp tục chuyển sang cấu trúc "bảo mật theo mặc định", giới thiệu một bộ các điểm cải tiến được thiết kế để giảm thiểu các hành vi khai thác ở mức độ nghiêm trọng cao, chẳng hạn như tấn công giả mạo, chiếm đoạt tương tác và tấn công nhầm lẫn. Bản cập nhật này yêu cầu nhà phát triển phải chọn sử dụng các tiêu chuẩn bảo mật mới một cách rõ ràng để duy trì khả năng tương thích của ứng dụng và bảo vệ người dùng.

Sau đây là những tác động chính đối với nhà phát triển:

  • Tăng cường BAL và cải thiện lựa chọn tham gia: Chúng tôi đang tinh chỉnh các quy tắc hạn chế về Hoạt động khởi chạy ở chế độ nền (BAL) bằng cách mở rộng các biện pháp bảo vệ cho IntentSender. Nhà phát triển phải di chuyển khỏi hằng số MODE_BACKGROUND_ACTIVITY_START_ALLOWED cũ. Thay vào đó, bạn nên áp dụng các chế độ kiểm soát chi tiết như MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE. Chế độ này hạn chế hoạt động bắt đầu trong các trường hợp ứng dụng gọi điện có thể nhìn thấy, giúp giảm đáng kể bề mặt tấn công.
  • Công cụ áp dụng: Nhà phát triển nên sử dụng chế độ nghiêm ngặt và các chế độ kiểm tra lint mới nhất để xác định các mẫu cũ và đảm bảo đáp ứng các yêu cầu về SDK mục tiêu trong tương lai.

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 quy trình kiểm tra SQL nghiêm ngặt trong CP2

Đối với các ứng dụng nhắm đến Android 17 (cấp độ API Android 17 (cấp độ API 37)) trở lên, Nhà cung cấp danh bạ 2 (CP2) sẽ thực thi quy trình xác thực nghiêm ngặt đối với truy vấn SQL khi bảng ContactsContract.Data được truy cập mà không có quyền READ_CONTACTS.

Với thay đổi này, nếu một ứng dụng không có READ_CONTACTS quyền, thì các tuỳ chọn StrictColumnsStrictGrammar sẽ được đặt khi truy vấn bảng ContactsContract.Data. Nếu một truy vấn sử dụng mẫu không tương thích với các tuỳ chọn này, thì truy vấn đó sẽ bị từ chối và gây ra một ngoại lệ.

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)

Chúng tôi đã giới thiệu các thay đổi về Platform API trong Android 16 để bỏ qua các hạn chế về hướng, tỷ lệ khung hình và khả năng đổi kích thước trên màn hình lớn (sw >= 600dp) đối với các ứng dụng nhắm đến API cấp 36 trở lên. Nhà phát triển có thể chọn không áp dụng những thay đổi này bằng SDK 36, nhưng lựa chọn không áp dụng này sẽ không còn dùng được cho các ứng dụng nhắm đến Android 17 (cấp độ API 37) trở lên.

Để biết thêm thông tin, hãy xem phần Các hạn chế về hướng và khả năng thay đổi kích thước sẽ bị bỏ qua.

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.