Quản lý nguồn

Android 9 (API cấp 28) giới thiệu các tính năng mới để cải thiện khả năng quản lý nguồn điện của thiết bị. Những thay đổi này, cùng với các tính năng đã có trong các phiên bản trước, giúp đảm bảo rằng tài nguyên hệ thống được cung cấp cho những ứng dụng cần các tài nguyên đó nhất.

Các tính năng quản lý nguồn điện gồm hai loại:

Nhóm chế độ chờ ứng dụng
Dựa trên thói quen sử dụng của người dùng, hệ thống sẽ giới hạn quyền truy cập của ứng dụng vào tài nguyên thiết bị như CPU hoặc pin. Đây là một tính năng mới dành cho Android 9.
Cải tiến trình tiết kiệm pin
Khi trình tiết kiệm pin được bật, hệ thống sẽ đặt ra các hạn chế đối với tất cả ứng dụng. Đây là một tính năng hiện có và sẽ được cải thiện trên Android 9.

Nhóm chế độ chờ ứng dụng

Android 9 giới thiệu một tính năng quản lý pin mới có tên Bộ chứa chế độ chờ ứng dụng. Bộ chứa chế độ chờ ứng dụng giúp hệ thống ưu tiên các yêu cầu của ứng dụng về tài nguyên, dựa trên mức độ gần đây và tần suất dùng ứng dụng. Dựa trên kiểu sử dụng ứng dụng, mỗi ứng dụng sẽ được đưa vào 1 trong 5 bộ chứa mức độ ưu tiên. Hệ thống sẽ giới hạn các tài nguyên thiết bị có sẵn cho mỗi ứng dụng dựa trên bộ chứa chứa ứng dụng đó.

5 nhóm sắp xếp thứ tự ưu tiên các ứng dụng thành các nhóm theo những đặc điểm sau:

Đang hoạt động

Một ứng dụng sẽ nằm trong bộ chứa đang hoạt động nếu người dùng hiện đang dùng ứng dụng, ví dụ:

  • Ứng dụng đã ra mắt một hoạt động
  • Ứng dụng của bạn đang chạy một dịch vụ trên nền trước.
  • Ứng dụng này có một bộ điều hợp đồng bộ hoá liên kết với một nhà cung cấp nội dung mà một ứng dụng trên nền trước sử dụng
  • Người dùng nhấp vào một thông báo trong ứng dụng

Nếu một ứng dụng nằm trong bộ chứa đang hoạt động, hệ thống sẽ không đặt ra bất kỳ hạn chế nào đối với công việc, chuông báo hoặc thông báo FCM của ứng dụng.

Nhóm hoạt động

Một ứng dụng nằm trong bộ chứa nhóm hoạt động nếu ứng dụng đó chạy thường xuyên nhưng hiện không hoạt động. Ví dụ: một ứng dụng mạng xã hội mà người dùng chạy hầu hết các ngày có khả năng nằm trong nhóm hoạt động. Các ứng dụng cũng được thăng cấp vào bộ chứa nhóm hoạt động nếu chúng được sử dụng gián tiếp.

Nếu một ứng dụng ở trong nhóm hoạt động, hệ thống sẽ đặt ra các hạn chế nhỏ về khả năng chạy các công việc và kích hoạt chuông báo. Để biết thông tin chi tiết, vui lòng xem phần Hạn chế quản lý nguồn.

Thường xuyên

Một ứng dụng nằm trong bộ chứa thường xuyên nếu được sử dụng thường xuyên, nhưng không nhất thiết phải mỗi ngày. Ví dụ: một ứng dụng theo dõi bài tập thể dục mà người dùng chạy tại phòng tập thể dục có thể nằm trong bộ chứa thường xuyên.

Nếu một ứng dụng nằm trong bộ chứa thường xuyên, hệ thống sẽ áp dụng các hạn chế mạnh hơn đối với khả năng chạy các công việc và kích hoạt chuông báo, đồng thời đặt ra giới hạn cho các thông báo FCM có mức độ ưu tiên cao. Để biết thông tin chi tiết, vui lòng xem phần Hạn chế quản lý nguồn.

Hiếm

Một ứng dụng nằm trong bộ chứa hiếm nếu ứng dụng không thường xuyên được sử dụng. Ví dụ: một ứng dụng khách sạn mà người dùng chỉ chạy trong khi ở tại khách sạn đó có thể nằm trong bộ chứa hiếm.

Nếu một ứng dụng nằm trong bộ chứa hiếm, thì hệ thống sẽ áp dụng các hạn chế nghiêm ngặt đối với khả năng chạy công việc, kích hoạt chuông báo và nhận thông báo FCM có mức độ ưu tiên cao. Hệ thống cũng giới hạn khả năng kết nối Internet của ứng dụng. Để biết thông tin chi tiết, vui lòng xem phần Hạn chế quản lý nguồn.

Không bao giờ

Các ứng dụng đã cài đặt nhưng chưa bao giờ chạy sẽ được chỉ định vào bộ chứa không bao giờ chạy. Hệ thống áp dụng các quy định hạn chế nghiêm ngặt đối với những ứng dụng này.

Hệ thống sẽ linh hoạt chỉ định từng ứng dụng cho một bộ chứa ưu tiên rồi chỉ định lại các ứng dụng đó khi cần. Hệ thống này có thể triển khai một ứng dụng tải trước dùng công nghệ học máy để xác định khả năng mỗi ứng dụng được dùng và chỉ định ứng dụng cho bộ chứa thích hợp. Nếu không có ứng dụng hệ thống trên thiết bị, thì theo mặc định, hệ thống sẽ sắp xếp ứng dụng dựa trên thời điểm sử dụng gần đây. Nhiều ứng dụng đang hoạt động hơn được chỉ định cho những bộ chứa ưu tiên ứng dụng hơn, giúp cung cấp nhiều tài nguyên hệ thống hơn cho ứng dụng. Cụ thể, bộ chứa này xác định tần suất chạy công việc của ứng dụng, tần suất ứng dụng có thể kích hoạt chuông báo và tần suất ứng dụng có thể nhận được thông báo Nhắn tin qua đám mây của Firebase (FCM) có mức độ ưu tiên cao. Những hạn chế này chỉ áp dụng khi thiết bị đang chạy bằng pin; hệ thống không áp dụng các hạn chế này đối với ứng dụng trong khi thiết bị đang sạc.

Nhà sản xuất nào cũng có thể đặt các tiêu chí riêng cho cách chỉ định ứng dụng không hoạt động cho các bộ chứa. Bạn không nên cố gắng tác động đến bộ chứa ứng dụng được chỉ định. Thay vào đó, hãy tập trung vào việc đảm bảo ứng dụng của bạn hoạt động hiệu quả trong mọi bộ chứa ứng dụng có thể chứa. Ứng dụng của bạn có thể tìm hiểu xem ứng dụng đang ở trong bộ chứa nào bằng cách gọi phương thức mới UsageStatsManager.getAppStandbyBucket().

Các phương pháp hay nhất

Nếu ứng dụng của bạn đang áp dụng các phương pháp hay nhất cho Chế độ nghỉ và chế độ chờ ứng dụng, thì việc xử lý các tính năng quản lý nguồn mới sẽ không hề khó khăn. Tuy nhiên, một số hành vi ứng dụng trước đây hoạt động tốt giờ có thể gây ra sự cố.

  • Đừng cố gắng thao túng hệ thống để đưa ứng dụng của bạn vào bộ chứa này hay bộ chứa khác. Các phương thức phân bộ chứa của hệ thống có thể thay đổi và mọi nhà sản xuất thiết bị đều có thể chọn viết ứng dụng phân bộ chứa bằng thuật toán riêng. Thay vào đó, hãy đảm bảo ứng dụng của bạn hoạt động theo cách phù hợp dù thuộc bộ chứa nào.
  • Nếu một ứng dụng không có hoạt động trong trình chạy, thì ứng dụng đó có thể không bao giờ được nâng cấp lên bộ chứa đang hoạt động. Bạn nên thiết kế lại ứng dụng để có hoạt động như vậy.
  • Nếu không xử lý được thông báo của ứng dụng, thì người dùng sẽ không thể kích hoạt chương trình khuyến mãi của ứng dụng vào bộ chứa đang hoạt động bằng cách tương tác với thông báo. Trong trường hợp này, bạn nên thiết kế lại một số thông báo thích hợp để cho phép người dùng phản hồi. Để biết thêm về các nguyên tắc, hãy xem phần Mẫu thiết kế thông báo cho Material Design.
  • Tương tự, nếu ứng dụng không hiện thông báo khi nhận được thông báo FCM có mức độ ưu tiên cao, thì người dùng sẽ không có cơ hội tương tác với ứng dụng và do đó sẽ quảng bá ứng dụng đó đến bộ chứa đang hoạt động. Trên thực tế, mục đích duy nhất cho các thông báo FCM có mức độ ưu tiên cao là đẩy một thông báo cho người dùng nên trường hợp này sẽ không bao giờ xảy ra. Nếu bạn đánh dấu một thông báo FCM là có mức độ ưu tiên cao không phù hợp khi thông báo này không kích hoạt hoạt động tương tác của người dùng, thì việc này có thể gây ra các hậu quả tiêu cực khác; chẳng hạn như việc ứng dụng của bạn sử dụng hết hạn mức, khiến các thông báo FCM thực sự khẩn cấp được coi là có mức độ ưu tiên bình thường.

    Lưu ý: Nếu người dùng đóng một thông báo nhiều lần, thì hệ thống sẽ cung cấp cho họ lựa chọn chặn thông báo đó trong tương lai. Không gửi thông báo cho người dùng chỉ với mục đích cố gắng duy trì ứng dụng của bạn ở bộ chứa đang hoạt động!

  • Nếu ứng dụng được chia thành nhiều gói, thì các gói đó có thể nằm trong những bộ chứa khác nhau, do đó sẽ có các cấp truy cập khác nhau. Bạn nên nhớ kiểm thử các ứng dụng như vậy với các gói được chỉ định cho nhiều bộ chứa để đảm bảo ứng dụng hoạt động đúng cách.

Cải tiến trình tiết kiệm pin

Android 9 thực hiện một số cải tiến đối với chế độ tiết kiệm pin. Nhà sản xuất thiết bị sẽ xác định các hạn chế chính xác được áp dụng. Ví dụ: trên các bản dựng AOSP, hệ thống sẽ áp dụng các hạn chế sau:

  • Hệ thống đặt các ứng dụng ở chế độ chờ ứng dụng một cách linh hoạt hơn, thay vì đợi ứng dụng ở trạng thái rảnh.
  • Giới hạn thực thi trong nền áp dụng cho tất cả ứng dụng, bất kể cấp độ API mục tiêu của ứng dụng.
  • Dịch vụ vị trí có thể bị tắt khi màn hình tắt.
  • Ứng dụng nền không có quyền truy cập mạng.

Ngoài ra, còn có các tính năng tối ưu hoá pin khác dành riêng cho từng thiết bị. Để biết đầy đủ thông tin chi tiết, hãy xem trang mô tả các hạn chế quản lý nguồn.

Như thường lệ, bạn nên kiểm thử ứng dụng trong khi trình tiết kiệm pin đang hoạt động. Bạn có thể bật trình tiết kiệm pin theo cách thủ công thông qua màn hình Cài đặt > Trình tiết kiệm pin của thiết bị.

Kiểm tra và khắc phục sự cố

Các tính năng quản lý nguồn mới ảnh hưởng đến tất cả ứng dụng chạy trên thiết bị Android 9, cho dù ứng dụng đó có nhắm đến Android 9 hay không. Điều quan trọng là đảm bảo ứng dụng của bạn hoạt động đúng cách trên các thiết bị này.

Hãy nhớ kiểm thử các trường hợp sử dụng chính của ứng dụng trong nhiều điều kiện để xem các tính năng quản lý nguồn điện tương tác với nhau như thế nào. Bạn có thể dùng các lệnh Cầu gỡ lỗi Android để bật và tắt một số tính năng.

Lệnh Cầu gỡ lỗi Android

Bạn có thể dùng các lệnh shell Cầu gỡ lỗi Android để thử nghiệm một số tính năng quản lý nguồn.

Để biết thông tin về cách sử dụng ADB nhằm đưa thiết bị của bạn vào chế độ Nghỉ, vui lòng xem Thử nghiệm với chế độ Nghỉ và Chế độ chờ ứng dụng.

Nhóm chế độ chờ ứng dụng

Bạn có thể sử dụng ADB để chỉ định ứng dụng của mình theo cách thủ công cho một Nhóm chế độ chờ ứng dụng. Để thay đổi bộ chứa của một ứng dụng, hãy dùng lệnh sau:

$ adb shell am set-standby-bucket packagename active|working_set|frequent|rare

Bạn cũng có thể sử dụng lệnh đó để đặt nhiều gói cùng một lúc:

$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...

Để kiểm tra xem một ứng dụng đang ở trong nhóm nào, hãy chạy

$ adb shell am get-standby-bucket [packagename]

Nếu bạn không truyền tham số packagename, lệnh sẽ liệt kê các bộ chứa cho tất cả ứng dụng. Ứng dụng cũng có thể tìm thấy bộ chứa trong thời gian chạy bằng cách gọi phương thức mới UsageStatsManager.getAppStandbyBucket().

Trình tiết kiệm pin

Có một số lệnh để kiểm tra cách ứng dụng của bạn hoạt động ở tình trạng pin yếu.

Để mô phỏng thiết bị đang rút phích cắm, hãy dùng lệnh

$ adb shell dumpsys battery unplug

Để kiểm tra xem thiết bị hoạt động như thế nào ở tình trạng pin yếu, hãy dùng lệnh sau:

$ adb shell settings put global low_power 1

Sau khi hoàn tất quá trình kiểm thử, bạn có thể huỷ lệnh cài đặt theo cách thủ công trên thiết bị của bạn bằng lệnh sau:

$ adb shell dumpsys battery reset