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

Nền tảng Android 14 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 chạy trên Android 14, 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 14.

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

Theo mặc định, tính năng lên lịch chuông báo chính xác bị từ chối

Exact alarms are meant for user-intentioned notifications, or for actions that need to happen at a precise time. Starting in Android 14, the SCHEDULE_EXACT_ALARM permission is no longer being pre-granted to most newly installed apps targeting Android 13 and higher—the permission is denied by default.

Learn more about the changes to the permission for scheduling exact alarms.

Tin truyền đã đăng ký theo bối cảnh được đưa vào hàng đợi trong khi ứng dụng được lưu vào bộ nhớ đệm

Trên Android 14, hệ thống có thể đặt thông báo truyền tin đã đăng ký theo bối cảnh vào hàng đợi trong khi ứng dụng đang ở trạng thái được lưu vào bộ nhớ đệm. Điều này tương tự như hành vi xếp hàng mà Android 12 (API cấp 31) đã ra mắt cho các giao dịch liên kết không đồng bộ. Các tin truyền do tệp kê khai khai báo sẽ không được đưa vào hàng đợi và ứng dụng sẽ bị xoá khỏi trạng thái đã lưu vào bộ nhớ đệm để phân phối tin truyền.

Khi ứng dụng thoát khỏi trạng thái đã lưu vào bộ nhớ đệm (ví dụ: quay lại nền trước) hệ thống sẽ phân phối mọi tin truyền đã xếp hàng đợi. Có thể hợp nhất nhiều thực thể của một số tin truyền nhất định thành một tin truyền. Tuỳ thuộc vào các yếu tố khác, chẳng hạn như hệ thống sức khoẻ, ứng dụng có thể bị xoá khỏi trạng thái đã lưu vào bộ nhớ đệm và mọi trạng thái đã được đưa vào danh sách chờ trước đó tin nhắn truyền phát sẽ được phân phối.

Ứng dụng chỉ có thể loại bỏ các quy trình của riêng mình ở chế độ nền

Kể từ Android 14, khi ứng dụng của bạn gọi killBackgroundProcesses(), API này chỉ có thể loại bỏ các quy trình của ứng dụng đó ở chế độ nền.

Nếu bạn truyền tên gói của một ứng dụng khác vào, phương thức này sẽ không ảnh hưởng đến các quy trình trong nền của ứng dụng đó và thông báo sau sẽ xuất hiện trong Logcat:

Invalid packageName: com.example.anotherapp

Ứng dụng của bạn không nên sử dụng API killBackgroundProcesses(), hoặc tìm cách tác động đến vòng đời xử lý của các ứng dụng khác, ngay cả trên các phiên bản hệ điều hành cũ hơn. Android được thiết kế để tiếp tục lưu các ứng dụng vào bộ nhớ đệm trong nền, và tự động loại bỏ chúng khi hệ thống cần bộ nhớ. Nếu ứng dụng của bạn dừng các ứng dụng khác một cách không cần thiết, thì hiệu suất hệ thống có thể bị giảm và mức tiêu thụ pin sẽ tăng khi yêu cầu khởi động lại hoàn toàn các ứng dụng đó sau đó. Quá trình này sẽ tốn nhiều tài nguyên hơn đáng kể so với việc tiếp tục một ứng dụng hiện có đã lưu vào bộ nhớ đệm.

MTU được đặt thành 517 cho ứng dụng khách GATT đầu tiên yêu cầu MTU

Starting from Android 14, the Android Bluetooth stack more strictly adheres to Version 5.2 of the Bluetooth Core Specification and requests the BLE ATT MTU to 517 bytes when the first GATT client requests an MTU using the BluetoothGatt#requestMtu(int) API, and disregards all subsequent MTU requests on that ACL connection.

To address this change and make your app more robust, consider the following options:

  • Your peripheral device should respond to the Android device's MTU request with a reasonable value that can be accommodated by the peripheral. The final negotiated value will be a minimum of the Android requested value and the remote provided value (for example, min(517, remoteMtu))
    • Implementing this fix could require a firmware update for peripheral
  • Alternatively, limit your GATT characteristic writes based on the minimum between the known supported value of your peripheral and the received MTU change
    • A reminder that you should reduce 5 bytes from the supported size for the headers
    • For example: arrayMaxLength = min(SUPPORTED_MTU, GATT_MAX_ATTR_LEN(517)) - 5

Lý do mới khiến ứng dụng có thể được đặt vào bộ chứa chế độ chờ bị hạn chế

Android 14 introduces a new reason an app can be placed into the restricted standby bucket. The app's jobs trigger ANR errors multiple times due to onStartJob, onStopJob, or onBind method timeouts. (See JobScheduler reinforces callback and network behavior for changes to onStartJob and onStopJob.)

To track whether or not the app has entered the restricted standby bucket, we recommend logging with the API UsageStatsManager.getAppStandbyBucket() on job execution or UsageStatsManager.queryEventsForSelf() on app startup.

mlock giới hạn ở 64 KB

In Android 14 (API level 34) and higher, the platform reduces the maximum memory that can be locked using mlock() to 64 KB per process. In previous versions, the limit was 64 MB per process. This restriction promotes better memory management across apps and the system. To provide more consistency across devices, Android 14 adds a new CTS test for the new mlock() limit on compatible devices.

Hệ thống thực thi việc sử dụng tài nguyên của ứng dụng được lưu vào bộ nhớ đệm

Theo thiết kế, quy trình của một ứng dụng sẽ ở trạng thái đã lưu vào bộ nhớ đệm khi được chuyển sang chế độ nền và không có thành phần quy trình ứng dụng nào khác đang chạy. Quy trình ứng dụng như vậy có thể sẽ bị tắt do áp lực về bộ nhớ của hệ thống. Khi ở trạng thái này, mọi công việc mà thực thể Activity thực hiện sau khi phương thức onStop() được gọi và trả về đều không đáng tin cậy và không được khuyến khích.

Android 14 đem lại sự nhất quán và biện pháp thực thi cho thiết kế này. Ngay sau khi một quy trình ứng dụng chuyển sang trạng thái đã lưu vào bộ nhớ đệm, công việc ở chế độ nền sẽ không được cho phép, cho đến khi một thành phần quy trình vào lại trạng thái đang hoạt động của vòng đời.

Các ứng dụng có sử dụng API vòng đời được hỗ trợ bởi khung phần mềm thông thường (chẳng hạn như services, JobSchedulerJetpack WorkManager) có thể sẽ không chịu tác động của những thay đổi này.

Trải nghiệm người dùng

Thay đổi về trải nghiệm người dùng đối với thông báo không đóng được

Nếu ứng dụng của bạn cho người dùng thấy thông báo không đóng được, thì nay Android 14 thay đổi hành vi để cho phép người dùng đóng các thông báo như vậy.

Thay đổi này áp dụng cho những ứng dụng ngăn người dùng đóng chế độ nền trước thông báo bằng cách đặt Notification.FLAG_ONGOING_EVENT thông qua Notification.Builder#setOngoing(true) hoặc NotificationCompat.Builder#setOngoing(true). Hành vi của FLAG_ONGOING_EVENT đã được thay đổi để giúp cho người dùng thực sự có thể đóng được các thông báo đó.

Những loại thông báo như vậy vẫn không đóng được trong các điều kiện sau:

  • Khi điện thoại bị khoá
  • Nếu người dùng chọn thao tác Xoá tất cả thông báo (giúp vô tình đóng)

Ngoài ra, hành vi mới này không áp dụng cho các thông báo trong các trường hợp sử dụng sau:

  • CallStyle thông báo
  • Trình kiểm soát chính sách thiết bị (DPC) và các gói hỗ trợ cho doanh nghiệp
  • Thông báo về nội dung nghe nhìn
  • Gói Bộ chọn tìm kiếm mặc định

Thông tin an toàn dữ liệu được trình bày rõ ràng hơn

To enhance user privacy, Android 14 increases the number of places where the system shows the information you have declared in the Play Console form. Currently, users can view this information in the Data safety section on your app's listing in Google Play.

We encourage you to review your app's location data sharing policies and take a moment to make any applicable updates to your app's Google Play Data safety section.

Learn more in the guide about how data safety information is more visible on Android 14.

Hỗ trợ tiếp cận

Điều chỉnh tỷ lệ phông chữ phi tuyến tính lên đến 200%

Starting in Android 14, the system supports font scaling up to 200%, providing users with additional accessibility options.

If you already use scaled pixels (sp) units to define text sizing, then this change probably won't have a high impact on your app. However, you should perform UI testing with the maximum font size enabled (200%) to ensure that your app can accommodate larger font sizes without impacting usability.

Bảo mật

Cấp API mục tiêu tối thiểu có thể cài đặt

Kể từ Android 14, người dùng không thể cài đặt ứng dụng có targetSdkVersion thấp hơn 23. Việc yêu cầu ứng dụng đáp ứng các yêu cầu tối thiểu về cấp độ API mục tiêu giúp cải thiện khả năng bảo vệ quyền riêng tư và bảo mật cho người dùng.

Các phần mềm độc hại thường nhắm đến các cấp độ API cũ để né tránh các biện pháp bảo vệ quyền riêng tư và bảo mật được ra mắt trong các phiên bản Android mới. Ví dụ: một số ứng dụng độc hại sử dụng targetSdkVersion 22 để tránh phải tuân theo mô hình quản lý quyền khi bắt đầu chạy ra mắt năm 2015 trên Android 6.0 Marshmallow (API cấp 23). Thay đổi này trên Android 14 giúp cải thiện khả năng bảo vệ quyền riêng tư và bảo mật, khiến phần mềm độc hại khó lòng qua mặt được. Việc cố gắng cài đặt một ứng dụng nhắm đến cấp độ API thấp hơn sẽ dẫn đến lỗi cài đặt và thông báo sau đây sẽ xuất hiện trong Logcat:

INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7

Trên các thiết bị nâng cấp lên Android 14, mọi ứng dụng có targetSdkVersion thấp hơn 23 đã cài đặt vẫn được duy trì.

Nếu cần kiểm thử một ứng dụng nhắm đến cấp độ API cũ hơn, hãy dùng lệnh ADB sau đây:

adb install --bypass-low-target-sdk-block FILENAME.apk

Tên gói của chủ sở hữu nội dung đa phương tiện có thể bị loại bỏ

The media store supports queries for the OWNER_PACKAGE_NAME column, which indicates the app that stored a particular media file. Starting in Android 14, this value is redacted unless at least one of the following conditions is true:

  • The app that stored the media file has a package name that is always visible to other apps.
  • The app that queries the media store requests the QUERY_ALL_PACKAGES permission.

Learn more about how Android filters package visibility for privacy purposes.