Thay đổi về hành vi: tất cả ứng dụng

Nền tảng Android 16 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 áp dụng cho tất cả ứng dụng khi chạy trên Android 16, bất kể targetSdkVersion. Bạn nên kiểm thử ứng dụng rồi sửa đổi để hỗ trợ những thay đổi 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 chỉ ảnh hưởng đến những ứng dụng nhắm đến Android 16.

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

Android 16 (API cấp 36) 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.

Tối ưu hoá hạn mức JobScheduler

Kể từ Android 16, chúng tôi sẽ điều chỉnh hạn mức thời gian chạy thực thi công việc thông thường và ưu tiên dựa trên các yếu tố sau:

  • Ứng dụng nằm trong bộ chứa chế độ chờ ứng dụng nào: trong Android 16, các bộ chứa chế độ chờ đang hoạt động sẽ bắt đầu được thực thi bằng một hạn mức thời gian chạy hào phóng.
  • Nếu công việc bắt đầu thực thi trong khi ứng dụng ở trạng thái trên cùng: trong Android 16, các công việc bắt đầu trong khi người dùng nhìn thấy ứng dụng và tiếp tục sau khi ứng dụng không hiển thị, sẽ tuân thủ hạn mức thời gian chạy công việc.
  • Nếu công việc đang thực thi trong khi chạy Dịch vụ trên nền trước: trong Android 16, các công việc đang thực thi đồng thời với một dịch vụ trên nền trước sẽ tuân thủ hạn mức thời gian chạy công việc. Nếu bạn đang tận dụng các công việc để chuyển dữ liệu do người dùng khởi tạo, hãy cân nhắc sử dụng công việc chuyển dữ liệu do người dùng khởi tạo.

Thay đổi này ảnh hưởng đến các tác vụ được lên lịch bằng WorkManager, JobScheduler và DownloadManager. Để gỡ lỗi lý do một công việc bị dừng, bạn nên ghi lại lý do công việc của mình bị dừng bằng cách gọi WorkInfo.getStopReason() (đối với các công việc JobScheduler, hãy gọi JobParameters.getStopReason()).

Để biết thông tin về mức độ ảnh hưởng của trạng thái ứng dụng đến tài nguyên mà ứng dụng có thể sử dụng, hãy xem phần Hạn mức tài nguyên quản lý nguồn. Để biết thêm thông tin về các phương pháp hay nhất giúp tối ưu hoá pin, hãy tham khảo hướng dẫn về cách tối ưu hoá mức sử dụng pin cho API lập lịch biểu tác vụ.

Bạn cũng nên tận dụng API JobScheduler#getPendingJobReasonsHistory mới được giới thiệu trong Android 16 để hiểu lý do một công việc không được thực thi.

Thử nghiệm

Để kiểm thử hành vi của ứng dụng, bạn có thể bật tính năng ghi đè một số hoạt động tối ưu hoá hạn mức công việc nhất định, miễn là ứng dụng đang chạy trên thiết bị Android 16.

Để tắt việc thực thi "trạng thái trên cùng sẽ tuân thủ hạn mức thời gian chạy công việc", hãy chạy lệnh adb sau:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME

Để tắt việc thực thi "các công việc đang thực thi đồng thời với một dịch vụ trên nền trước sẽ tuân thủ hạn mức thời gian chạy công việc", hãy chạy lệnh adb sau:

adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME

Để kiểm thử một số hành vi nhất định của nhóm chế độ chờ ứng dụng, bạn có thể đặt nhóm chế độ chờ ứng dụng bằng lệnh adb sau:

adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted

Để tìm hiểu về bộ chứa chế độ chờ ứng dụng mà ứng dụng của bạn đang ở, bạn có thể lấy bộ chứa chế độ chờ ứng dụng của ứng dụng bằng lệnh adb sau:

adb shell am get-standby-bucket APP_PACKAGE_NAME

Lý do dừng các công việc bị bỏ dở khi không có dữ liệu

An abandoned job occurs when the JobParameters object associated with the job has been garbage collected, but JobService#jobFinished(JobParameters, boolean) has not been called to signal job completion. This indicates that the job may be running and being rescheduled without the app's awareness.

Apps that rely on JobScheduler, don't maintain a strong reference to the JobParameters object, and timeout will now be granted the new job stop reason STOP_REASON_TIMEOUT_ABANDONED, instead of STOP_REASON_TIMEOUT.

If there are frequent occurrences of the new abandoned stop reason, the system will take mitigation steps to reduce job frequency.

Apps should use the new stop reason to detect and reduce abandoned jobs.

If you're using WorkManager, AsyncTask, or DownloadManager, you aren't impacted because these APIs manage the job lifecycle on your app's behalf.

Hoàn toàn không dùng JobInfo#setImportantWhileForeground nữa

Phương thức JobInfo.Builder#setImportantWhileForeground(boolean) cho biết tầm quan trọng của một công việc trong khi ứng dụng lên lịch chạy ở nền trước hoặc khi tạm thời được miễn các quy định hạn chế về chế độ nền.

Phương thức này không được dùng nữa kể từ Android 12 (API cấp 31). Kể từ Android 16, phương thức này không còn hoạt động hiệu quả và việc gọi phương thức này sẽ bị bỏ qua.

Việc xoá chức năng này cũng áp dụng cho JobInfo#isImportantWhileForeground(). Kể từ Android 16, nếu được gọi, phương thức này sẽ trả về false.

Phạm vi ưu tiên của thông báo truyền tin theo thứ tự không còn là phạm vi toàn cầu nữa

Ứng dụng Android được phép xác định mức độ ưu tiên trên broadcast receiver để kiểm soát thứ tự mà các broadcast receiver nhận và xử lý thông báo truyền tin. Đối với trình nhận được khai báo trong tệp kê khai, ứng dụng có thể sử dụng thuộc tính android:priority để xác định mức độ ưu tiên và đối với trình nhận được đăng ký theo ngữ cảnh, ứng dụng có thể sử dụng API IntentFilter#setPriority() để xác định mức độ ưu tiên. Khi gửi thông báo truyền tin, hệ thống sẽ phân phối thông báo đó đến các trình thu nhận theo thứ tự ưu tiên, từ cao nhất đến thấp nhất.

Trong Android 16, thứ tự phân phối thông báo truyền tin bằng thuộc tính android:priority hoặc IntentFilter#setPriority() trên các quy trình khác nhau sẽ không được đảm bảo. Mức độ ưu tiên của thông báo truyền tin sẽ chỉ được tuân thủ trong cùng một quy trình ứng dụng thay vì trên tất cả các quy trình.

Ngoài ra, mức độ ưu tiên của thông báo truyền tin sẽ tự động được giới hạn trong phạm vi (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY – 1). Chỉ các thành phần hệ thống mới được phép đặt SYSTEM_LOW_PRIORITY, SYSTEM_HIGH_PRIORITY làm mức độ ưu tiên truyền tin.

Ứng dụng của bạn có thể bị ảnh hưởng nếu thực hiện một trong những hành động sau:

  1. Ứng dụng của bạn đã khai báo nhiều quy trình có cùng một ý định truyền tin và có kỳ vọng về việc nhận các ý định đó theo một thứ tự nhất định dựa trên mức độ ưu tiên.
  2. Quy trình ứng dụng của bạn tương tác với các quy trình khác và có những kỳ vọng về việc nhận ý định truyền tin theo một thứ tự nhất định.

Nếu các quy trình cần phối hợp với nhau, thì các quy trình đó phải giao tiếp bằng các kênh phối hợp khác.

Thay đổi nội bộ về ART

Android 16 bao gồm các bản cập nhật mới nhất cho Android Runtime (ART) giúp cải thiện hiệu suất của Android Runtime (ART) và hỗ trợ thêm các tính năng Java. Thông qua Bản cập nhật hệ thống Google Play, hơn một tỷ thiết bị chạy Android 12 (API cấp 31) trở lên cũng có thể sử dụng các điểm cải tiến này.

Khi những thay đổi này được phát hành, các thư viện và mã ứng dụng dựa vào cấu trúc nội bộ của ART có thể không hoạt động chính xác trên các thiết bị chạy Android 16, cùng với các phiên bản Android cũ cập nhật mô-đun ART thông qua bản cập nhật hệ thống Google Play.

Việc dựa vào các cấu trúc nội bộ (chẳng hạn như giao diện không phải SDK) luôn có thể dẫn đến các vấn đề về khả năng tương thích, nhưng điều đặc biệt quan trọng là tránh dựa vào mã (hoặc thư viện chứa mã) tận dụng các cấu trúc ART nội bộ, vì các thay đổi về ART không liên quan đến phiên bản nền tảng mà thiết bị đang chạy và các thay đổi này sẽ được áp dụng cho hơn một tỷ thiết bị thông qua các bản cập nhật hệ thống của Google Play.

Tất cả nhà phát triển đều nên kiểm tra xem ứng dụng của họ có bị ảnh hưởng hay không bằng cách kiểm thử kỹ lưỡng ứng dụng trên Android 16. Ngoài ra, hãy kiểm tra các vấn đề đã biết để xem ứng dụng của bạn có phụ thuộc vào bất kỳ thư viện nào mà chúng tôi đã xác định là dựa vào cấu trúc ART nội bộ hay không. Nếu mã ứng dụng hoặc các phần phụ thuộc thư viện của bạn bị ảnh hưởng, hãy tìm các API công khai thay thế bất cứ khi nào có thể và yêu cầu API công khai cho các trường hợp sử dụng mới bằng cách tạo yêu cầu về tính năng trong công cụ theo dõi lỗi của chúng tôi.

Chế độ tương thích với kích thước trang 16 KB

Android 15 introduced support for 16 KB memory pages to optimize performance of the platform. Android 16 adds a compatibility mode, allowing some apps built for 4 KB memory pages to run on a device configured for 16 KB memory pages.

When your app is running on a device with Android 16 or higher, if Android detects that your app has 4 KB aligned memory pages, it automatically uses compatibility mode and display a notification dialog to the user. Setting the android:pageSizeCompat property in the AndroidManifest.xml to enable the backwards compatibility mode will prevent the display of the dialog when your app launches. To use the android:pageSizeCompat property, compile your app using the Android 16 SDK.

For best performance, reliability, and stability, your app should still be 16 KB aligned. Check out our recent blog post on updating your apps to support 16 KB memory pages for more details.

The compatibility mode dialog that displays when the system detects that a 4 KB-aligned app could run more optimally if 16 KB aligned.

Trải nghiệm người dùng và giao diện người dùng hệ thống

Android 16 (API cấp 36) có những thay đổi sau đây nhằm tạo ra trải nghiệm người dùng nhất quán và trực quan hơn.

Ngừng sử dụng các thông báo hỗ trợ tiếp cận gây phiền toái

Android 16 không dùng thông báo hỗ trợ tiếp cận nữa, được xác định bằng việc sử dụng announceForAccessibility hoặc gửi sự kiện hỗ trợ tiếp cận TYPE_ANNOUNCEMENT. Những điều này có thể tạo ra trải nghiệm người dùng không nhất quán cho người dùng TalkBack và trình đọc màn hình của Android, đồng thời các giải pháp thay thế sẽ phục vụ tốt hơn nhiều nhu cầu của người dùng trên nhiều công nghệ hỗ trợ của Android.

Ví dụ về các lựa chọn thay thế:

Tài liệu tham khảo cho API announceForAccessibility không dùng nữa bao gồm thêm thông tin chi tiết về các giải pháp thay thế được đề xuất.

Hỗ trợ chế độ thao tác bằng 3 nút

Android 16 hỗ trợ tính năng xem trước thao tác quay lại cho chế độ điều hướng bằng 3 nút cho các ứng dụng đã di chuyển đúng cách sang tính năng xem trước thao tác quay lại. Thao tác nhấn và giữ nút quay lại sẽ bắt đầu ảnh động xem trước thao tác quay lại, cho bạn xem trước vị trí mà thao tác vuốt ngược sẽ đưa bạn đến.

Hành vi này áp dụng cho tất cả các khu vực của hệ thống hỗ trợ ảnh động xem trước thao tác quay lại, bao gồm cả ảnh động hệ thống (quay lại màn hình chính, giữa các tác vụ và giữa các hoạt động).

Ảnh động xem trước thao tác quay lại ở chế độ điều hướng bằng 3 nút.

Kiểu dáng thiết bị

Android 16 (API cấp 36) có những thay đổi sau đây đối với các ứng dụng khi được chủ sở hữu thiết bị ảo chiếu lên màn hình.

Chủ sở hữu thiết bị ảo ghi đè

A virtual device owner is a trusted or privileged app that creates and manages a virtual device. Virtual device owners run apps on a virtual device and then project the apps to the display of a remote device, such as a personal computer, virtual reality device, or car infotainment system. The virtual device owner is on a local device, such as a mobile phone.

Virtual device owner on phone creates virtual device that projects app to remote display.

Per-app overrides

On devices running Android 16 (API level 36), virtual device owners can override app settings on select virtual devices that the virtual device owners manage. For example, to improve app layout, a virtual device owner can ignore orientation, aspect ratio, and resizability restrictions when projecting apps onto an external display.

Common breaking changes

The Android 16 behavior might impact your app's UI on large screen form factors such as car displays or Chromebooks, especially layouts that were designed for small displays in portrait orientation. To learn how to make your app adaptive for all device form factors, see About adaptive layouts.

References

Companion app streaming

Bảo mật

Android 16 (API cấp 36) có những thay đổi giúp tăng cường tính bảo mật của hệ thống để bảo vệ ứng dụng và người dùng khỏi các ứng dụng độc hại.

Cải thiện khả năng bảo mật để chống lại các cuộc tấn công chuyển hướng Ý định

Android 16 provides default security against general Intent redirection attacks, with minimum compatibility and developer changes required.

We are introducing by-default security hardening solutions to Intent redirection exploits. In most cases, apps that use intents normally won't experience any compatibility issues; we've gathered metrics throughout our development process to monitor which apps might experience breakages.

Intent redirection in Android occurs when an attacker can partly or fully control the contents of an intent used to launch a new component in the context of a vulnerable app, while the victim app launches an untrusted sub-level intent in an extras field of an ("top-level") Intent. This can lead to the attacker app launching private components in the context of the victim app, triggering privileged actions, or gaining URI access to sensitive data, potentially leading to data theft and arbitrary code execution.

Opt out of Intent redirection handling

Android 16 introduces a new API that allows apps to opt out of launch security protections. This might be necessary in specific cases where the default security behavior interferes with legitimate app use cases.

For applications compiling against Android 16 (API level 36) SDK or higher

You can directly use the removeLaunchSecurityProtection() method on the Intent object.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
For applications compiling against Android 15 (API level 35) or lower

While not recommended, you can use reflection to access the removeLaunchSecurityProtection() method.

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent", Intent::class.java)
try {
    val removeLaunchSecurityProtection = Intent::class.java.getDeclaredMethod("removeLaunchSecurityProtection")
    removeLaunchSecurityProtection.invoke(iSublevel)
} catch (e: Exception) {
    // Handle the exception, e.g., log it
} // Opt-out from the security hardening using reflection
iSublevel?.let { startActivity(it) }

Ứng dụng đồng hành sẽ không còn nhận được thông báo về thời gian chờ phát hiện nữa

Android 16 giới thiệu một hành vi mới trong quy trình ghép nối thiết bị đồng hành để bảo vệ quyền riêng tư về vị trí của người dùng khỏi các ứng dụng độc hại. Tất cả ứng dụng đồng hành chạy trên Android 16 không còn được thông báo trực tiếp về thời gian chờ khám phá bằng RESULT_DISCOVERY_TIMEOUT. Thay vào đó, người dùng sẽ được thông báo về các sự kiện hết thời gian chờ bằng một hộp thoại trực quan. Khi người dùng đóng hộp thoại, ứng dụng sẽ được cảnh báo về lỗi liên kết với RESULT_USER_REJECTED.

Thời lượng tìm kiếm cũng được kéo dài từ 20 giây ban đầu, và người dùng có thể dừng quá trình khám phá thiết bị bất cứ lúc nào trong quá trình tìm kiếm. Nếu phát hiện được ít nhất một thiết bị trong 20 giây đầu tiên kể từ khi bắt đầu tìm kiếm, thì CDM sẽ ngừng tìm kiếm các thiết bị khác.

Khả năng kết nối

Android 16 (API cấp 36) có những thay đổi sau đây trong ngăn xếp Bluetooth để cải thiện khả năng kết nối với các thiết bị ngoại vi.

Cải thiện khả năng xử lý tình trạng mất liên kết

Starting in Android 16, the Bluetooth stack has been updated to improve security and user experience when a remote bond loss is detected. Previously, the system would automatically remove the bond and initiate a new pairing process, which could lead to unintentional re-pairing. We have seen in many instances apps not taking care of the bond loss event in a consistent way.

To unify the experience, Android 16 improved the bond loss handling to the system. If a previously bonded Bluetooth device could not be authenticated upon reconnection, the system will disconnect the link, retain local bond information, and display a system dialog informing users of the bond loss and directing them to re-pair.