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á
Beginning with Android 17, apps targeting Android 17 (API level 37)
or higher receive a new lock-free implementation of
android.os.MessageQueue. The new implementation improves performance and
reduces missed frames, but may break clients that reflect on MessageQueue
private fields and methods.
For more information, including mitigation strategies, see MessageQueue behavior change guidance.
Các trường cuối cùng tĩnh hiện không thể sửa đổi
Apps running on Android 17 or higher that target
Android 17 (API level 37) or higher cannot change static final fields. If
an app attempts to change a static final field by using reflection, it will
cause an IllegalAccessException. Attempting to modify one of these fields
through JNI APIs (such as SetStaticLongField()) will cause the app to crash.
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 AccessibilityEvent và TextAttribute
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ì
InputConnectiontuỳ chỉnh có thể truy xuất dữ liệu lựa chọn ứng viên bằng cách gọiTextAttribute.isTextSuggestionSelected(). Sau đó, các ứng dụng này sẽ gọiAccessibilityEvent.setTextChangeTypes()khi gửi các sự kiệnTYPE_VIEW_TEXT_CHANGED. Các ứng dụng nhắm đến Android 17 (cấp độ API 37) sử dụngTextViewtiêu chuẩn sẽ bật tính năng này theo mặc định. (Tức làTextViewsẽ 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_CHANGEDcó thể gọiAccessibilityEvent.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 introduces platform support for Encrypted Client Hello (ECH), a TLS extension that enhances user privacy by encrypting the Server Name Indication (SNI) in the TLS handshake. This encryption helps prevent network observers from easily identifying the specific domain your app is connecting to.
For apps targeting Android 17 (API level 37) or higher, ECH is used for TLS connections. ECH is active only if the networking library used by the app (for example, HttpEngine, WebView, or OkHttp) has integrated ECH support and the remote server also supports the ECH protocol. If ECH cannot be negotiated, the client sends an ECH extension with randomized contents (a mechanism called ECH GREASE). See RFC 9849 for more details on how ECH GREASE works.
To allow apps to customize this behavior, Android 17 adds a new
<domainEncryption> element to the Network Security Configuration file.
Developers can use <domainEncryption> within <base-config> or
<domain-config> tags to select an ECH mode (for example,
"enabled" or "disabled") on a global or per-domain basis.
For more information, see the Encrypted Client Hello documentation.
Ứ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 introduces the ACCESS_LOCAL_NETWORK runtime permission
to protect users from unauthorized local network access. Because this falls
under the existing NEARBY_DEVICES permission group, users who have already
granted other NEARBY_DEVICES permissions aren't prompted again. This new
requirement prevents malicious apps from exploiting unrestricted local network
access for covert user tracking and fingerprinting. By declaring and requesting
this permission, your app can discover and connect to devices on the local area
network (LAN), such as smart home devices or casting receivers.
Apps targeting Android 17 (API level 37) or higher now have two paths to maintain communication with LAN devices: Adopt system-mediated, privacy-preserving device pickers to skip the permission prompt, or explicitly request this new permission at runtime to maintain local network communication.
For more information, see the Local network permission documentation.
Ẩn mật khẩu trên thiết bị thực
If an app targets Android 17 (API level 37) or higher and the user is using
a physical input device (for example, an external keyboard), the Android
operating system applies the new show_passwords_physical setting to all
characters in the password field. By default, that setting hides all password
characters.
The Android system shows the last-typed password character to help the user see if they mistyped the password. However, this is much less necessary with larger external keyboards. In addition, devices with external keyboards often have larger displays, which increases the danger of someone seeing the typed password.
If the user is using the device's touchscreen, the system applies the new
show_passwords_touch setting.
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
In Android 17, the platform continues its shift toward a "secure-by-default" architecture, introducing a suite of enhancements designed to mitigate high-severity exploits such as phishing, interaction hijacking, and confused deputy attacks. This update requires developers to explicitly opt in to new security standards to maintain app compatibility and user protection.
Key impacts for developers include:
- BAL hardening & improved opt-in: We are refining Background Activity
Launch (BAL) restrictions by extending protections to
IntentSender. Developers must migrate away from the legacyMODE_BACKGROUND_ACTIVITY_START_ALLOWEDconstant. Instead, you should adopt granular controls likeMODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE, which restricts activity starts to scenarios where the calling app is visible, significantly reducing the attack surface. - Adoption tools: Developers should utilize strict mode and updated lint checks to identify legacy patterns and ensure readiness for future target SDK requirements.
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
For apps targeting Android 17 (API level Android 17 (API level 37)) and higher, Contacts Provider 2 (CP2) restricts certain columns containing Personally Identifiable Information (PII) from the data view. When this change is enabled, these columns are removed from the data view to enhance user privacy. The restricted columns include:
Apps that are using these columns from ContactsContract.Data
can extract them from ContactsContract.RawContacts
instead, by joining with RAW_CONTACT_ID.
Thực thi các quy trình kiểm tra SQL nghiêm ngặt trong CP2
For apps targeting Android 17 (API level Android 17 (API level 37)) and
higher, Contacts Provider 2 (CP2) enforces strict SQL query validation when
the ContactsContract.Data table is accessed without
READ_CONTACTS permission.
With this change, if an app doesn't have READ_CONTACTS
permission, StrictColumns and
StrictGrammar options are set when querying
the ContactsContract.Data table. If a query
uses a pattern that isn't compatible with these, it will be
rejected and cause an exception to be thrown.
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)
We introduced Platform API changes in Android 16 to ignore orientation, aspect ratio, and resizability restrictions on large screens (sw >= 600dp) for apps targeting API level 36 or higher. Developers have the option to opt out of these changes with SDK 36, but this opt-out will no longer be available for apps that target Android 17 (API level 37) or higher.
For more information, see Restrictions on orientation and resizability are ignored.
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
For apps targeting Android 17 (API level 37), the
read() method of the InputStream obtained from an
RFCOMM-based BluetoothSocket now returns -1 when the
socket is closed or the connection is dropped.
This change makes RFCOMM socket behavior consistent with LE CoC sockets and
aligns with the standard InputStream.read()
documentation, which states that -1 is returned when the end of the stream is
reached.
Apps that rely solely on catching an IOException to break out of a read loop may
be impacted by this change and should update the BluetoothSocket read loops to
explicitly check for a return value of -1. This ensures the loop terminates
correctly when the remote device disconnects or the socket is closed. For an
example of the recommended implementation, see the
code snippet in the Transfer Bluetooth data
guide.