Một người dùng Android trung bình cài đặt hơn 50 ứng dụng trên thiết bị của họ (số lượng này tăng lên khi cấp RAM của thiết bị tăng lên). Tuy nhiên, có một số lượng đáng kể ứng dụng mà người dùng không sử dụng trong một khoảng thời gian dài.
Chế độ ngủ đông ứng dụng sẽ đưa các ứng dụng mà người dùng không sử dụng trong vài tháng vào trạng thái ngủ đông, tương tự như tính năng tự động thu hồi quyền. Thao tác này sẽ buộc dừng ứng dụng và đưa ứng dụng vào trạng thái mà chúng ta tối ưu hoá cho bộ nhớ thay vì hiệu suất. Tự động thu hồi quyền cũng được đi kèm với trạng thái này và chúng có cùng chế độ cài đặt miễn trừ trong phần Cài đặt. Ứng dụng bị buộc dừng không chạy các công việc hoặc cảnh báo ở chế độ nền và không thể gửi thông báo đẩy. Khi người dùng sử dụng lại ứng dụng, ứng dụng sẽ thoát khỏi trạng thái ngủ đông và các công việc/cảnh báo/thông báo sẽ chạy lại như bình thường. Mọi công việc/cảnh báo/thông báo đã lên lịch trước khi ứng dụng chuyển sang trạng thái ngủ đông đều cần được lên lịch lại.
Việc OEM sửa đổi nền tảng có thể xung đột với việc triển khai chế độ ngủ đông của ứng dụng. Ví dụ
- Việc sửa đổi định nghĩa về mức sử dụng ứng dụng hoặc giới thiệu các cách đánh thức ứng dụng không có trong AOSP có thể làm gián đoạn độ chính xác của chế độ ngủ đông ứng dụng
- Cơ chế hạn chế độc quyền của OEM (tương tự như trạng thái ngủ đông của ứng dụng) có thể thực hiện một mục đích tương tự. Mặc dù cả hai đều có thể tồn tại, nhưng có thể có một số điểm trùng lặp.
CDD trình bày một bộ yêu cầu mới đối với các thay đổi dựa trên mức sử dụng ứng dụng, tương tự như yêu cầu hiện tại 3.5.1. Chế độ ngủ đông ứng dụng tuân theo các yêu cầu sau.
Mã khung này có trong:
- kho lưu trữ: platform/frameworks/base
- thư mục: services/core/java/com/android/server/apphibernces
Logic chính sách nằm trong:
- kho lưu trữ: platform/packages/modules/Permission
- thư mục: PermissionController/src/com/android/permissioncontroller/hibernation
Kiến trúc cấp cao
Dịch vụ hệ thống ngủ đông ứng dụng tối ưu hoá dung lượng lưu trữ cho các ứng dụng mà người dùng ít dùng và ngăn các ứng dụng đó chạy ở chế độ nền. Để đạt được những kết quả này, khi chúng ta ngủ đông một ứng dụng, cụ thể:
- Tự động thu hồi quyền
- Buộc dừng ứng dụng
- Xoá tệp ODEX và VDEX
- Xoá bộ nhớ đệm của ứng dụng
Mục tiêu của chúng tôi là triển khai chế độ ngủ đông dưới dạng một thao tác có thể đảo ngược để người dùng vẫn có thể sử dụng ứng dụng thông qua Trình chạy và các nền tảng khác mà dữ liệu ứng dụng vẫn còn nguyên vẹn. Khi khởi chạy ứng dụng, chúng ta sẽ khôi phục ứng dụng đó từ trạng thái buộc dừng và tiếp tục tạo tệp ODEX và VDEX như bình thường.
Thiết kế dự kiến tập trung vào hai phần chính:
- Xác định thời điểm một gói nên ngủ đông
- Tối ưu hoá gói ngủ đông
Dịch vụ hệ thống mới, AppHibernationService
và dịch vụ công việc, AppHibernationJobService,
trong PermissionController
là một chất kết dính kiểm soát logic và quá trình đưa ra quyết định tổng thể.
Việc xác định thời điểm một gói nên ngủ đông chủ yếu do UsageStatsService
cung cấp và do AppHibernationJobService
quản lý trong PermissionController
. Logic chính sách này nằm trong PermissionController
để cho phép chúng tôi tự động cập nhật thông qua Mainline. Ngoài ra, chúng tôi dự định thêm một tín hiệu mới là mức sử dụng thành phần để ghi lại mức sử dụng các thành phần của gói (ví dụ: dịch vụ, nhà cung cấp nội dung) dưới dạng một chỉ số mới trong UsageStatsService
.
Việc tối ưu hoá một gói là nơi diễn ra tất cả các hoạt động tiết kiệm và tối ưu hoá thực tế. AppHibernationService
giao tiếp với nhiều phần của hệ thống để dừng gói, xoá dữ liệu bộ nhớ đệm, xoá cấu phần phần mềm ART, v.v.
Việc thu hồi quyền được bắt đầu trực tiếp từ AppHibernationJobService
để giữ lại chức năng tự động thu hồi trên các thiết bị chạy Android 11 trở xuống.
Trải nghiệm người dùng
Người dùng được cung cấp cả thông tin và quyền kiểm soát đối với những ứng dụng có thể được ngủ đông.
Tương tự như tính năng tự động thu hồi, người dùng sẽ nhận được thông báo về những ứng dụng nào đang ở trạng thái ngủ đông và có thể chuyển đến phần Cài đặt ngay trong thông báo để mở ứng dụng và thoát khỏi trạng thái ngủ đông hoặc xoá ứng dụng không dùng đến nếu cần.
Chúng tôi tiếp tục hỗ trợ ý định của nhà phát triển về việc yêu cầu người dùng miễn trừ trạng thái ngủ đông bằng ý định tự động thu hồi các quyền hiện có.
Khả năng tương thích ngược
Các tính năng dành riêng cho chế độ ngủ đông sẽ có trên Android 12 trở lên. Tính năng này không thể hoạt động trên các phiên bản cũ hơn vì các thành phần nền tảng (chẳng hạn như dịch vụ hệ thống mới) không có. Tính năng tự động thu hồi sẽ tiếp tục hoạt động như đã triển khai cho các phiên bản hệ điều hành trước đó.
Kể từ Android 12, để đảm bảo khả năng tương thích ngược, một nút bật/tắt trạng thái ngủ đông sẽ được thêm vào trang của ứng dụng ở mục Ứng dụng và thông báo trong phần Cài đặt, đồng thời vẫn giữ nút bật/tắt tự động thu hồi ban đầu trong trình đơn phụ Permissions. Nút bật/tắt này kiểm soát việc miễn trừ tổng thể của hệ thống ngủ đông ứng dụng cho ứng dụng.
Tuỳ chỉnh
Một số hoạt động triển khai là một phần của thành phần hệ thống mô-đun, vì vậy, các đối tác không nên sửa đổi tính năng này. Thay vào đó, đối tác có thể triển khai các tính năng hoặc chức năng tương tự miễn là tuân thủ các yêu cầu của CDD.
Chế độ ngủ đông ứng dụng phải được đặt thành BẬT theo mặc định cho tất cả ứng dụng nhắm đến Android 11 trở lên. Việc này cũng giống như việc tự động thu hồi quyền. Mặc dù chế độ cài đặt có thể ở trạng thái BẬT, nhưng cách triển khai chế độ ngủ đông của ứng dụng có thể khác nhau giữa các ứng dụng nhắm đến Android 11 và Android 12. Cụ thể hơn, chế độ ngủ đông của ứng dụng chỉ hoạt động đối với các ứng dụng nhắm đến Android 11, trong khi về cơ bản, chế độ này chỉ tự động thu hồi đối với các ứng dụng nhắm đến Android 12.
Ngoài ra, OEM có thể đang triển khai một tính năng tương tự. Tuy nhiên, các tính năng đó được nhắm đến trên một tiến trình ngắn hơn nhiều để tối ưu hoá pin, có thể dành riêng cho nhà sản xuất thiết bị gốc (OEM). Mọi tính năng hạn chế tương tự đối với ứng dụng do Nhà sản xuất thiết bị gốc (OEM) phát triển có thể cùng tồn tại với hệ thống ngủ đông của ứng dụng, miễn là các tính năng này đáp ứng các tiêu chí hiện có được xác định trong CDD.
Thử nghiệm
Trạng thái ngủ đông của ứng dụng có CTS và bài kiểm thử đơn vị để đảm bảo ứng dụng hoạt động chính xác.
AutoRevokeTest
AppHibernationIntegrationTest