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 các 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
Starting in Android 16, we're adjusting regular and expedited job execution runtime quota based on the following factors:
- Which app standby bucket the application is in: in Android 16, active standby buckets will start being enforced by a generous runtime quota.
- If the job starts execution while the app is in a top state: in Android 16, Jobs started while the app is visible to the user and continues after the app becomes invisible, will adhere to the job runtime quota.
- If the job is executing while running a Foreground Service: in Android 16, jobs that are executing concurrently with a foreground service will adhere to the job runtime quota. If you're leveraging jobs for user initiated data transfer, consider using user initiated data transfer jobs instead.
This change impacts tasks scheduled using WorkManager, JobScheduler, and
DownloadManager. To debug why a job was stopped, we recommend logging why your
job was stopped by calling WorkInfo.getStopReason()
(for
JobScheduler jobs, call JobParameters.getStopReason()
).
For information about how your app's state affects the resources it can use, see Power management resource limits. For more information on battery-optimal best practices, refer to guidance on optimize battery use for task scheduling APIs.
We also recommend leveraging the new
JobScheduler#getPendingJobReasonsHistory
API introduced in
Android 16 to understand why a job has not executed.
Testing
To test your app's behavior, you can enable override of certain job quota optimizations as long as the app is running on an Android 16 device.
To disable enforcement of "top state will adhere to job runtime quota", run the
following adb
command:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
To disable enforcement of "jobs that are executing while concurrently with a
foreground service will adhere to the job runtime quota", run the following
adb
command:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
To test certain app standby bucket behavior, you can set the app standby bucket
of your app using the following adb
command:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
To understand the app standby bucket your app is in, you can get the app standby
bucket of your app using the following adb
command:
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
如果与作业关联的 JobParameters
对象已被垃圾回收,但尚未调用 JobService#jobFinished(JobParameters,
boolean)
来指示作业已完成,则会发生作业被废弃的情况。这表示作业可能会在应用不知情的情况下运行和重新调度。
依赖于 JobScheduler 的应用不会维护对 JobParameters
对象的强引用,并且超时现在将获得新的作业停止原因 STOP_REASON_TIMEOUT_ABANDONED
,而不是 STOP_REASON_TIMEOUT
。
如果新的作业被废弃停止原因频繁出现,系统会采取缓解措施来降低作业频率。
应用应使用新的停止原因来检测和减少被废弃的作业。
如果您使用的是 WorkManager、AsyncTask 或 DownloadManager,则不会受到影响,因为这些 API 会代表您的应用管理作业生命周期。
Hoàn toàn không dùng JobInfo#setImportantWhileForeground nữa
JobInfo.Builder#setImportantWhileForeground(boolean)
方法用于在调度应用位于前台或暂时豁免于后台限制时指示作业的优先级。
自 Android 12(API 级别 31)起,此方法已废弃。从 Android 16 开始,它不再有效,系统会忽略调用此方法。
此功能移除也适用于 JobInfo#isImportantWhileForeground()
。从 Android 16 开始,如果调用该方法,该方法会返回 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:
- Ứ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.
- 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 包含 Android 运行时 (ART) 的最新更新,这些更新可提升 Android 运行时 (ART) 的性能,并支持更多 Java 功能。通过 Google Play 系统更新,搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备也将受益于这些改进。
发布这些变更后,依赖于 ART 内部结构的库和应用代码在搭载 Android 16 的设备以及通过 Google Play 系统更新来更新 ART 模块的较低 Android 版本上可能无法正常运行。
依赖于内部结构(例如非 SDK 接口)始终会导致兼容性问题,但避免依赖于利用内部 ART 结构的代码(或包含代码的库)尤为重要,因为 ART 更改与设备所运行的平台版本无关,并且会通过 Google Play 系统更新推送到超过 10 亿部设备。
所有开发者都应在 Android 16 上对其应用进行全面测试,以检查其应用是否受到影响。此外,请查看已知问题,了解您的应用是否依赖于我们发现的任何依赖于内部 ART 结构的库。如果您的应用代码或库依赖项受到影响,请尽可能寻找公共 API 替代方案,并在问题跟踪器中创建功能请求,为新用例请求公共 API。
Chế độ tương thích với kích thước trang 16 KB
Android 15 đã ra mắt tính năng hỗ trợ trang bộ nhớ 16 KB để tối ưu hoá hiệu suất của nền tảng. Android 16 bổ sung một chế độ tương thích, cho phép một số ứng dụng được tạo cho các trang bộ nhớ 4 KB chạy trên một thiết bị được định cấu hình cho các trang bộ nhớ 16 KB.
Khi ứng dụng của bạn đang chạy trên một thiết bị chạy Android 16 trở lên, nếu Android phát hiện thấy ứng dụng của bạn có các trang bộ nhớ được căn chỉnh 4 KB, thì Android sẽ tự động sử dụng chế độ tương thích và hiển thị hộp thoại thông báo cho người dùng. Việc đặt thuộc tính android:pageSizeCompat
trong AndroidManifest.xml
để bật chế độ tương thích ngược sẽ ngăn hộp thoại hiển thị khi ứng dụng khởi chạy. Để sử dụng thuộc tính android:pageSizeCompat
, hãy biên dịch ứng dụng bằng SDK Android 16.
Để có hiệu suất, độ tin cậy và độ ổn định tốt nhất, ứng dụng của bạn vẫn phải được căn chỉnh 16 KB. Hãy xem bài đăng gần đây trên blog của chúng tôi về cách cập nhật ứng dụng để hỗ trợ trang bộ nhớ 16 KB để biết thêm thông tin chi tiết.

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ế:
- Đối với các thay đổi đáng kể về giao diện người dùng như thay đổi cửa sổ, hãy sử dụng
Activity.setTitle(CharSequence)
vàsetAccessibilityPaneTitle(java.lang.CharSequence)
. Trong Compose, hãy sử dụngModifier.semantics { paneTitle = "paneTitle" }
- Để thông báo cho người dùng về những thay đổi đối với giao diện người dùng quan trọng, hãy sử dụng
setAccessibilityLiveRegion(int)
. Trong Compose, hãy sử dụngModifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}
. Bạn nên sử dụng các thông báo này một cách tiết kiệm vì chúng có thể tạo thông báo mỗi khi Chế độ xem được cập nhật. - Để thông báo cho người dùng về lỗi, hãy gửi
AccessibilityEvent
thuộc loạiAccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR
và đặtAccessibilityNodeInfo#setError(CharSequence)
hoặc sử dụngTextView#setError(CharSequence)
.
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).
Biểu tượng ứng dụng theo chủ đề tự động
Beginning with Android 16 QPR 2, Android automatically applies themes to app icons to create a cohesive home screen experience. This occurs if an app does not provide its own themed app icon. Apps can control the design of their themed app icon by including a monochrome layer within their adaptive icon and previewing what their app icon will look like in Android Studio.
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 đè
Chủ sở hữu thiết bị ảo là một ứng dụng đáng tin cậy hoặc có đặc quyền tạo và quản lý một thiết bị ảo. Chủ sở hữu thiết bị ảo chạy các ứng dụng trên thiết bị ảo, sau đó chiếu các ứng dụng đó lên màn hình của một thiết bị từ xa, chẳng hạn như máy tính cá nhân, thiết bị thực tế ảo hoặc hệ thống thông tin giải trí trên ô tô. Chủ sở hữu thiết bị ảo đang dùng một thiết bị cục bộ, chẳng hạn như điện thoại di động.

Ghi đè cho mỗi ứng dụng
Trên các thiết bị chạy Android 16 (API cấp 36), chủ sở hữu thiết bị ảo có thể ghi đè chế độ cài đặt ứng dụng trên một số thiết bị ảo mà họ quản lý. Ví dụ: để cải thiện bố cục ứng dụng, chủ sở hữu thiết bị ảo có thể bỏ qua các hạn chế về hướng, tỷ lệ khung hình và khả năng thay đổi kích thước khi chiếu ứng dụng lên màn hình ngoài.
Các thay đổi có thể gây lỗi thường gặp
Hành vi của Android 16 có thể ảnh hưởng đến giao diện người dùng của ứng dụng trên các hệ số hình dạng màn hình lớn, chẳng hạn như màn hình ô tô hoặc Chromebook, đặc biệt là những bố cục được thiết kế cho màn hình nhỏ ở hướng dọc. Để tìm hiểu cách làm cho ứng dụng của bạn thích ứng với mọi hệ số hình dạng của thiết bị, hãy xem phần Giới thiệu về bố cục thích ứng.
Tài liệu tham khảo
Truyền phát bằng ứng dụng đồng hành
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 cung cấp chế độ bảo mật mặc định để chống lại các cuộc tấn công chuyển hướng Intent
nói chung, với khả năng tương thích tối thiểu và các thay đổi cần thiết cho nhà phát triển.
Chúng tôi đang giới thiệu các giải pháp tăng cường bảo mật theo mặc định để khai thác việc chuyển hướng Intent
. Trong hầu hết trường hợp, các ứng dụng sử dụng ý định thường sẽ không gặp phải bất kỳ vấn đề nào về khả năng tương thích; chúng tôi đã thu thập các chỉ số trong suốt quá trình phát triển để theo dõi những ứng dụng có thể gặp phải sự cố.
Chuyển hướng ý định trong Android xảy ra khi kẻ tấn công có thể kiểm soát một phần hoặc toàn bộ nội dung của một ý định dùng để chạy một thành phần mới trong bối cảnh một ứng dụng dễ bị tấn công, trong khi ứng dụng mục tiêu chạy một ý định cấp dưới không đáng tin cậy trong một trường bổ sung của một Ý định ("cấp cao nhất"). Điều này có thể dẫn đến việc ứng dụng của kẻ tấn công khởi chạy các thành phần riêng tư trong bối cảnh của ứng dụng mục tiêu, kích hoạt các hành động đặc quyền hoặc giành được quyền truy cập URI vào dữ liệu nhạy cảm, có khả năng dẫn đến hành vi đánh cắp dữ liệu và thực thi mã tuỳ ý.
Chọn không xử lý việc chuyển hướng theo ý định
Android 16 giới thiệu một API mới cho phép ứng dụng chọn không sử dụng các biện pháp bảo vệ khi khởi chạy. Điều này có thể cần thiết trong một số trường hợp cụ thể khi hành vi bảo mật mặc định gây trở ngại cho các trường hợp sử dụng ứng dụng hợp pháp.
Đối với các ứng dụng biên dịch dựa trên SDK Android 16 (API cấp 36) trở lên
Bạn có thể trực tiếp sử dụng phương thức removeLaunchSecurityProtection()
trên đối tượng Intent.
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
Đối với các ứng dụng biên dịch dựa trên Android 15 (API cấp 35) trở xuống
Mặc dù không nên, nhưng bạn có thể sử dụng tính năng phản chiếu để truy cập vào phương thức removeLaunchSecurityProtection()
.
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
Kể từ Android 16, ngăn xếp Bluetooth đã được cập nhật để cải thiện tính bảo mật và trải nghiệm người dùng khi phát hiện thấy mất liên kết từ xa. Trước đây, hệ thống sẽ tự động xoá mối liên kết và bắt đầu một quy trình ghép nối mới, điều này có thể dẫn đến việc ghép nối lại ngoài ý muốn. Chúng tôi nhận thấy trong nhiều trường hợp, các ứng dụng không xử lý sự kiện mất liên kết một cách nhất quán.
Để hợp nhất trải nghiệm, Android 16 đã cải thiện khả năng xử lý mất liên kết với hệ thống. Nếu không xác thực được thiết bị Bluetooth đã liên kết trước đó khi kết nối lại, hệ thống sẽ ngắt kết nối đường liên kết, giữ lại thông tin liên kết cục bộ và hiển thị hộp thoại hệ thống thông báo cho người dùng về việc mất liên kết và hướng dẫn họ ghép nối lại.