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 (cấp độ API 36) có những thay đổi sau đây nhằm sửa đổi hoặc mở rộng nhiều khả năng cốt lõi của hệ thống Android.
Tối ưu hoá hạn mức JobScheduler
从 Android 16 开始,我们将根据以下因素调整常规作业和加急作业的执行运行时配额:
- 应用所处的应用待机存储分区:在 Android 16 中,活跃待机存储分区将开始通过宽松的运行时配额强制执行。
- 如果作业在应用处于前台状态时开始执行:在 Android 16 中,如果作业在应用对用户可见时开始执行,并在应用变为不可见后继续执行,则会遵守作业运行时配额。
- 如果作业在运行前台服务时执行:在 Android 16 中,与前台服务同时执行的作业将遵守作业运行时配额。如果您利用作业进行用户发起的数据传输,请考虑改用用户发起的数据传输作业。
此变更会影响使用 WorkManager、JobScheduler 和 DownloadManager 调度的任务。如需调试作业停止的原因,我们建议您通过调用 WorkInfo.getStopReason()(对于 JobScheduler 作业,请调用 JobParameters.getStopReason())来记录作业停止的原因。
如需了解应用的状态如何影响其可使用的资源,请参阅电源管理资源限制。 如需详细了解电池优化方面的最佳实践,请参阅有关针对任务调度 API 优化电池使用的指南。
我们还建议利用 Android 16 中引入的新 JobScheduler#getPendingJobReasonsHistory API 来了解作业未执行的原因。
测试
如需测试应用的行为,只要应用在 Android 16 设备上运行,您就可以启用对某些作业配额优化功能的替换。
如需停用“顶级状态将遵守作业运行时配额”的强制执行,请运行以下 adb 命令:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_TOP_STARTED_JOBS APP_PACKAGE_NAME
如需停用“在与前台服务同时执行时,作业将遵守作业运行时配额”的强制执行,请运行以下 adb 命令:
adb shell am compat enable OVERRIDE_QUOTA_ENFORCEMENT_TO_FGS_JOBS APP_PACKAGE_NAME
如需测试特定应用待机分桶行为,您可以使用以下 adb 命令设置应用的应用待机分桶:
adb shell am set-standby-bucket APP_PACKAGE_NAME active|working_set|frequent|rare|restricted
如需了解应用所在的待机分桶,您可以使用以下 adb 命令获取应用的待机分桶:
adb shell am get-standby-bucket APP_PACKAGE_NAME
Lý do dừng các công việc trống bị bỏ dở
Công việc bị bỏ dở xảy ra khi đối tượng JobParameters liên kết với công việc đã được thu thập rác, nhưng JobService#jobFinished(JobParameters,
boolean) chưa được gọi để báo hiệu công việc đã hoàn tất. Điều này cho biết rằng công việc có thể đang chạy và được lên lịch lại mà ứng dụng không biết.
Các ứng dụng dựa vào JobScheduler không duy trì tham chiếu mạnh đến đối tượng JobParameters và giờ đây, thời gian chờ sẽ được cấp lý do dừng công việc mới STOP_REASON_TIMEOUT_ABANDONED thay vì STOP_REASON_TIMEOUT.
Nếu lý do dừng mới bị bỏ dở thường xuyên xuất hiện, hệ thống sẽ thực hiện các bước giảm thiểu để giảm tần suất công việc.
Ứng dụng nên sử dụng lý do dừng mới để phát hiện và giảm số lượng công việc bị bỏ ngang.
Nếu đang sử dụng WorkManager, AsyncTask hoặc DownloadManager, bạn sẽ không bị ảnh hưởng vì các API này thay mặt ứng dụng quản lý vòng đời công việc.
Hoàn toàn không dùng JobInfo#setImportantWhileForeground nữa
The JobInfo.Builder#setImportantWhileForeground(boolean)
method indicates the importance of a job while the scheduling app is in the
foreground or when temporarily exempted from background restrictions.
This method has been deprecated since Android 12 (API level 31). Starting in Android 16, it no longer functions effectively and calling this method will be ignored.
This removal of functionality also applies to
JobInfo#isImportantWhileForeground(). Starting in Android
16, if the method is called, the method returns 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
Android 应用可以为广播接收器定义优先级,以控制接收器接收和处理广播的顺序。对于清单声明的接收器,应用可以使用 android:priority 属性来定义优先级;对于上下文注册的接收器,应用可以使用 IntentFilter#setPriority() API 来定义优先级。发送广播时,系统会按接收器的优先级(从高到低)将其传送给接收器。
在 Android 16 中,无法保证使用 android:priority 属性或 IntentFilter#setPriority() 在不同进程中传送广播的顺序。广播优先级仅在同一应用进程内有效,而不会跨所有进程有效。
此外,广播优先级将自动限制在 (SYSTEM_LOW_PRIORITY + 1, SYSTEM_HIGH_PRIORITY - 1) 的范围内。只有系统组件才能将 SYSTEM_LOW_PRIORITY、SYSTEM_HIGH_PRIORITY 设置为广播优先级。
如果您的应用执行以下任一操作,可能会受到影响:
- 您的应用声明了具有相同广播 intent 的多个进程,并且希望根据优先级以特定顺序接收这些 intent。
- 您的应用进程与其他进程交互,并期望以特定顺序接收广播 intent。
如果进程需要相互协调,则应使用其他协调渠道进行通信。
Các thay đổi nội bộ của 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 đã 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 (cấp độ API 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 废弃了无障碍功能通告,其特征是使用 announceForAccessibility 或调度 TYPE_ANNOUNCEMENT 无障碍功能事件。这可能会给 TalkBack 和 Android 屏幕阅读器用户带来不一致的用户体验,而替代方案可以更好地满足各种 Android 辅助技术的用户需求。
替代方案示例:
- 对于窗口更改等重大界面更改,请使用
Activity.setTitle(CharSequence)和setAccessibilityPaneTitle(java.lang.CharSequence)。在 Compose 中,使用Modifier.semantics { paneTitle = "paneTitle" } - 如需向用户告知关键界面的更改,请使用
setAccessibilityLiveRegion(int)。在 Compose 中,请使用Modifier.semantics { liveRegion = LiveRegionMode.[Polite|Assertive]}。应谨慎使用这些事件,因为它们可能会在每次更新视图时生成通知。 - 如需向用户发送错误通知,请发送类型为
AccessibilityEvent#CONTENT_CHANGE_TYPE_ERROR的AccessibilityEvent并设置AccessibilityNodeInfo#setError(CharSequence),或使用TextView#setError(CharSequence)。
已废弃的 announceForAccessibility API 的参考文档中包含有关建议替代方案的更多详细信息。
Hỗ trợ chế độ thao tác bằng 3 nút
Android 16 为已正确迁移到预测性返回的应用的三按钮导航栏引入了预测性返回支持。长按返回按钮会启动预测性返回动画,让您预览返回滑动手势会打开的界面。
此行为适用于系统中支持预测性返回动画的所有区域,包括系统动画(返回主屏幕、跨任务和跨 activity)。
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 (cấp độ API 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.
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
Bảo mật
Android 16 (cấp độ API 36) có những thay đổi nhằm tăng cường tính bảo mật của hệ thống để giúp 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 độ 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 tính năng bảo mật mặc định chống lại các cuộc tấn công chuyển hướng Intent thông thường, 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 các lỗ hổng chuyển hướng Intent. Trong hầu hết các trường hợp, các ứng dụng sử dụng ý định thông 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 ý đị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 nạn nhân chạy một ý định cấp phụ không đáng tin cậy trong một trường bổ sung của một ("cấp cao nhất") Ý định. Điều này có thể dẫn đến việc ứng dụng của kẻ tấn công chạy các thành phần riêng tư trong bối cảnh ứng dụng nạn nhân, kích hoạt các hành động đặc quyền hoặc giành 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 trộm cắp dữ liệu và thực thi mã tuỳ ý.
Chọn không xử lý việc chuyển hướng ý định
Android 16 giới thiệu một API mới cho phép các ứng dụng chọn không sử dụng các biện pháp bảo vệ bảo mật khi 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 lệ.
Đối với các ứng dụng biên dịch dựa trên SDK Android 16 (cấp độ API 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 (cấp độ API 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 không còn được thông báo về thời gian chờ phát hiện nữa
Android 16 在配套设备配对流程期间引入了一种新行为,以防恶意应用侵犯用户的位置信息隐私。在 Android 16 上运行的所有配套应用都不再直接通过 RESULT_DISCOVERY_TIMEOUT 收到发现超时通知。而是通过可视对话框通知用户超时事件。当用户关闭对话框时,系统会通过 RESULT_USER_REJECTED 提醒应用关联失败。
搜索时长也从原来的 20 秒延长到了 30 秒,并且用户可以在搜索期间的任何时间停止设备发现。如果在开始搜索的前 20 秒内发现了至少 1 部设备,CDM 会停止搜索其他设备。
Khả năng kết nối
Android 16 (cấp độ API 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.