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

Bắt đầu từ Android 17, các ứng dụng nhắm đến Android 17 (cấp độ API 37) trở lên sẽ nhận được một chế độ triển khai mới không khoá của android.os.MessageQueue. Việc triển khai mới này giúp cải thiện hiệu suất và giảm số khung hình bị bỏ lỡ, nhưng có thể làm hỏng những ứng dụng phản ánh các trường và phương thức riêng tư MessageQueue.

Để biết thêm thông tin, bao gồm cả các chiến lược giảm thiểu, hãy xem Hướng dẫn về thay đổi hành vi MessageQueue.

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

Các ứng dụng chạy trên Android 17 trở lên và nhắm đến Android 17 (cấp độ API 37) trở lên không thể thay đổi các trường static final. Nếu một ứng dụng cố gắng thay đổi một trường static final bằng cách sử dụng tính năng phản chiếu, thì ứng dụng đó sẽ gây ra IllegalAccessException. Việc cố gắng sửa đổi một trong các trường này thông qua API JNI (chẳng hạn như SetStaticLongField()) sẽ khiến ứng dụng gặp sự cố.

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

此功能引入了新的 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() 来识别修改的性质,并相应地调整其反馈策略。

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

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

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

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

Nếu một ứng dụng nhắm đến Android 17 (API cấp 37) trở lên và người dùng đang sử dụng một thiết bị đầu vào thực (ví dụ: bàn phím ngoài), thì hệ điều hành Android sẽ áp dụng chế độ cài đặt show_passwords_physical mới cho tất cả các ký tự trong trường mật khẩu. Theo mặc định, chế độ cài đặt đó sẽ ẩn tất cả các ký tự mật khẩu.

Hệ thống Android hiện ký tự mật khẩu được nhập gần đây nhất để giúp người dùng biết họ có nhập sai mật khẩu hay không. Tuy nhiên, điều này ít cần thiết hơn nhiều khi dùng bàn phím ngoài có kích thước lớn. Ngoài ra, các thiết bị có bàn phím bên ngoài thường có màn hình lớn hơn, điều này làm tăng nguy cơ có người nhìn thấy mật khẩu đã nhập.

Nếu người dùng đang sử dụng màn hình cảm ứng của thiết bị, hệ thống sẽ áp dụng chế độ cài đặt show_passwords_touch mới.

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

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

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

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à 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.