Trung bình, người dùng Android 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, một số lượng đáng kể các ứng dụng này không được người dùng sử dụng trong một thời gian dài.
Tính năng 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 tôi tối ưu hoá cho bộ nhớ thay vì hiệu suất. Tính năng Tự động thu hồi quyền cũng được đi kèm với trạng thái này và chúng dùng chung chế độ cài đặt miễn trừ trong phần Cài đặt. Ứng dụng bị dừng bắt buộc sẽ 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. Bạn cần lên lịch lại cho 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.
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 tính năng ngủ đông ứng dụng
- Cơ chế hạn chế độc quyền của OEM tương tự như tính năng 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 nêu ra một bộ yêu cầu mới đối với những 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. Tính năng ngủ đông của ứng dụng tuân theo các yêu cầu sau.
Mã khung nằm trong:
- repo: platform/frameworks/base
- thư mục: services/core/java/com/android/server/apphibernation
Logic chính sách nằm trong:
- repo: 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 sẽ tối ưu hoá bộ nhớ cho các ứng dụng mà người dùng ít sử dụng và ngăn những ứng dụng đó chạy ở chế độ nền. Để đạt được những kết quả này, khi chuyển một ứng dụng sang trạng thái ngủ đông, chúng tôi sẽ thực hiện những việc sau:
- Tự động thu hồi quyền
- Buộc dừng ứng dụng
- Xoá các 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 như một hành động có thể đảo ngược để người dùng vẫn có thể truy cập vào ứ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 bạn chạy ứng dụng, chúng tôi sẽ khôi phục ứng dụng từ trạng thái dừng bắt buộc 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 2 phần chính:
- Xác định thời điểm một gói cần chuyển sang trạng thái ngủ đông
- Tối ưu hoá gói ở trạng thái ngủ đông
Một dịch vụ hệ thống mới, AppHibernationService
và một dịch vụ công việc, AppHibernationJobService,
trong PermissionController
là yếu tố kết nối giúp kiểm soát toàn bộ quá trình đưa ra quyết định và logic.
Việc xác định thời điểm một gói cần chuyển sang trạng thái ngủ đông chủ yếu được hỗ trợ bởi UsageStatsService
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 cập nhật linh hoạt thông qua Mainline. Ngoài ra, chúng tôi dự định thêm một tín hiệu mới (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ụ, trình cung cấp nội dung) dưới dạng một chỉ số mới trong UsageStatsService
.
Tối ưu hoá 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 trong bộ nhớ đệm, xoá các 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
để duy trì chức năng tự động thu hồi trên các thiết bị 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ể chuyển sang trạng thái 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 đang ở chế độ ngủ đông và có thể chuyển đến phần Cài đặt ngay từ thông báo để mở ứng dụng và đưa ứng dụng ra khỏi chế độ 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 là yêu cầu người dùng cho phép miễn trừ khỏi chế độ ngủ đông bằng ý định miễn trừ thu hồi tự động 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 có trên Android 12 trở lên. Tính năng này không hoạt động trên các phiên bản cũ hơn vì không có các thành phần nền tảng (chẳng hạn như dịch vụ hệ thống mới). Tính năng tự động thu hồi vẫn hoạt động như khi được 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 chế độ ngủ đông sẽ được thêm vào trang của ứng dụng trong phần Ứng dụng và thông báo trong phần Cài đặt, đồng thời giữ nguyên nút bật/tắt tự động thu hồi ban đầu trong trình đơn phụ Quyền. Nút bật/tắt này kiểm soát trạng thái miễn trừ hệ thống ngủ đông tổng thể của ứ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 theo 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 đó, các đố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à họ tuân thủ các yêu cầu của CDD.
Chế độ ngủ đông ứng dụng phải được BẬT theo mặc định cho tất cả ứng dụng nhắm đến Android 11 trở lên. Điều này cũng giống như tính năng tự động thu hồi quyền. Mặc dù chế độ cài đặt này 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 so với Android 12. Cụ thể hơn, tính năng tạm ngưng ứ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, tính năng này chỉ là tự động thu hồi đối với các ứng dụng nhắm đến Android 12.
Ngoài ra, các nhà sản xuất thiết bị gốc (OEM) có thể đang triển khai một tính năng tương tự. Tuy nhiên, những tính năng đó nhắm đến một khoảng thời gian ngắn hơn nhiều để tối ưu hoá pin, có thể dành riêng cho OEM. Mọi tính năng hạn chế ứng dụng tương tự do OEM phát triển đều có thể cùng tồn tại với hệ thống chuyển ứng dụng sang trạng thái ngủ đông, miễn là các tính năng đó đáp ứng các tiêu chí hiện có được xác định trong CDD.
Thử nghiệm
Tính năng ngủ đông của ứng dụng có CTS và các bài kiểm thử đơn vị để đảm bảo tính năng này hoạt động đúng cách.
AutoRevokeTest
AppHibernationIntegrationTest