Ngăn đóng băng cho ứng dụng được lưu vào bộ nhớ đệm

Android 11 QPR3 trở lên hỗ trợ trình đóng băng ứng dụng được lưu vào bộ nhớ đệm. Tính năng này sẽ dừng thực thi các quy trình được lưu vào bộ nhớ đệm và giảm mức sử dụng tài nguyên của các ứng dụng hoạt động không đúng cách có thể cố gắng hoạt động trong khi được lưu vào bộ nhớ đệm. Khung này đóng băng các ứng dụng được lưu vào bộ nhớ đệm bằng cách di chuyển các quy trình của ứng dụng vào một cgroup đã đóng băng; điều này làm giảm mức tiêu thụ CPU đang hoạt động và ở trạng thái rảnh khi có các ứng dụng đang hoạt động được lưu vào bộ nhớ đệm. Bạn có thể bật trình đóng băng ứng dụng bằng cách sử dụng cờ cấu hình hệ thống hoặc tuỳ chọn cho nhà phát triển.

Triển khai trình đóng băng ứng dụng

Trình lưu trữ ứng dụng vào bộ nhớ đệm tận dụng trình lưu trữ cgroup v2 của hạt nhân. Các thiết bị vận chuyển với hạt nhân tương thích có thể bật tính năng này (không bắt buộc). Để làm như vậy, hãy bật tuỳ chọn dành cho nhà phát triển "Tạm ngưng thực thi cho các ứng dụng được lưu vào bộ nhớ đệm" hoặc đặt cờ cấu hình thiết bị activity_manager_native_boot use_freezer thành true. Ví dụ:

adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot

Trình lưu trữ sẽ bị tắt khi cờ use_freezer được đặt thành false hoặc tuỳ chọn cho nhà phát triển bị tắt. Bạn có thể bật/tắt chế độ cài đặt này bằng cách thay đổi cấu hình thiết bị trong bản phát hành hoặc bản cập nhật phần mềm.

Trình đóng băng ứng dụng không hiển thị các API chính thức (và không có ứng dụng triển khai tham chiếu), nhưng sử dụng các API hệ thống ẩn setProcessFrozenenableFreezer. Để biết thông tin chi tiết về các API này, hãy tham khảo Process.java của ActivityManager và API ActivityManagerService. Nhà phát triển cũng có thể tham khảo mã ứng dụng trong ActivityManager để thử nghiệm.

Xử lý các tính năng tuỳ chỉnh

Thông thường, các quy trình không được dự kiến sẽ thực hiện bất kỳ công việc nào khi được lưu vào bộ nhớ đệm, nhưng một số ứng dụng có thể có các tính năng tuỳ chỉnh được hỗ trợ bởi các quy trình dự kiến sẽ chạy trong khi được lưu vào bộ nhớ đệm. Khi bạn bật tủ đông của ứng dụng trên thiết bị chạy một ứng dụng như vậy, các quy trình đã lưu vào bộ nhớ đệm sẽ bị treo và có thể ngăn các tính năng tuỳ chỉnh hoạt động.

Để khắc phục, nếu một ứng dụng có quy trình cần thực hiện các hoạt động trong khi lưu vào bộ nhớ đệm, hãy thay đổi trạng thái quy trình thành không lưu vào bộ nhớ đệm (chẳng hạn như Dịch vụ ForeGround ràng buộc (BFGS) hoặc nền trước) trước khi quy trình cần thực hiện bất kỳ công việc nào để cho phép ứng dụng vẫn hoạt động.

Kiểm thử trình lưu trữ ứng dụng

Để xác minh trình đóng băng ứng dụng đang hoạt động như dự kiến, hãy sử dụng các tài nguyên sau:

  • Kiểm tra danh sách các quy trình bị treo bằng lệnh adb shell dumpsys activity và grep cho Apps frozen:.

  • Hãy kiểm tra xem tệp /sys/fs/cgroup/uid_0/cgroup.freeze có hiện diện hay không.

  • Xem logcat, cho thấy các mục nhập đã đóng băng và chưa đóng băng mỗi khi một quy trình di chuyển vào hoặc ra khỏi trình đóng băng. Ví dụ:

    adb logcat | grep -i "\(freezing\|froze\)"