Một số thư viện và API hệ thống có thể thu nạp khoá chế độ thức có thể phân bổ cho ứng dụng của bạn. Điều này có thể khiến bạn khó xác định khoá chế độ thức trong ứng dụng có thể gây ra sự cố. Nếu bạn sử dụng sai API, thì điều đó có thể khiến ứng dụng của bạn giữ khoá chế độ thức quá lâu, ngay cả khi bạn không gọi trực tiếp các API khoá chế độ thức.
Tài liệu này liệt kê một số tên khoá chế độ thức phổ biến mà bạn có thể thấy khi sử dụng các công cụ gỡ lỗi khoá chế độ thức. Bạn cũng có thể thấy các tên này trong báo cáo của Android vitals. Trong một số trường hợp, khoá chế độ thức có thể do thư viện hoặc API hệ thống tạo. Trong các trường hợp khác, có lý do khiến công cụ làm rối mã nguồn tên khoá chế độ thức mà bạn sử dụng trong ứng dụng. Bạn có thể sử dụng các công cụ gỡ lỗi để xác định khoá chế độ thức hoạt động không đúng cách, sau đó tra cứu tên khoá chế độ thức trong tài liệu này để xác định API nào có thể gây ra sự cố và cách khắc phục sự cố đó.
Tài liệu này đề cập đến các tên khoá chế độ thức sau. Trong mỗi trường hợp, mặc dù khoá chế độ thức có thể được tạo bởi một số thư viện hoặc API khác, nhưng khoá này được phân bổ cho ứng dụng đã gọi API đó.
*alarm*
: DoAlarmManager
tạo.AudioIn
,AudioMix
: Do các API đa phương tiện tạo.GOOGLE_C2DM
: Được thu thập trong khi phân phối thông báo qua đám mây của Firebase (FCM) cho ứng dụng.*job*/<package_name>/<package_and_job_name>
: Do các công việc JobScheduler tạo.*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
: Do worker WorkManager tạo.NetworkLocationLocator
,FusedLocation
,*location*
: Do các API vị trí tạo._UNKNOWN
: Được các công cụ gỡ lỗi hiển thị nếu tên khoá chế độ thức có vẻ như sử dụng thông tin nhận dạng cá nhân (PII).
*alarm*
Khoá chế độ thức này do AlarmManager
thu nạp và được phân bổ cho ứng dụng gọi. AlarmManager
thu nạp khoá chế độ thức khi chuông báo kêu và giải phóng khoá khi phương thức onReceive()
của thông báo truyền tin chuông báo hoàn tất quá trình thực thi.
Nội dung đề xuất
Bạn nên áp dụng các phương pháp sau để tối ưu hoá hành vi của chuông báo:
- Sử dụng
AlarmManager
để tối ưu hoá tần suất lên lịch chuông báo. - Chỉ sử dụng chuông báo
RTC_WAKEUP
(để đánh thức thiết bị) khi cần thiết. - Hạn chế sử dụng chuông báo và tránh thực hiện công việc dài hạn trong phương thức
onReceive()
.
AudioIn
, AudioMix
, v.v.
Nhiều khoá chế độ thức có tên bắt đầu bằng Audio
được các API đa phương tiện thu nạp khi ghi hoặc phát âm thanh. Khoá chế độ thức được phân bổ cho ứng dụng gọi.
AudioIn
được thu thập trong quá trình chụp AudioRecord
ở chế độ máy quay video, trong khi micrô đang hoạt động. AudioMix
được thu nạp trong quá trình phát AudioTrack
tới thiết bị. Các API đa phương tiện khác có thể nhận khoá chế độ thức có tên khác bắt đầu bằng Audio
.
Nội dung đề xuất
Bạn nên áp dụng các phương pháp sau:
- Đừng sử dụng tên khoá chế độ thức bắt đầu bằng
Audio
. - Nếu đang sử dụng API đa phương tiện, bạn không cần phải trực tiếp lấy khoá chế độ thức; bạn có thể dựa vào các API để lấy khoá chế độ thức cần thiết.
- Khi bạn sử dụng API đa phương tiện, hãy kết thúc phiên phát nội dung đa phương tiện khi bạn không cần nữa.
GOOGLE_C2DM
GCM sẽ thu nạp khoá chế độ thức này trong khi phân phối thông báo truyền tin Giải pháp gửi thông báo qua đám mây của Firebase (FCM) đến ứng dụng. Khoá chế độ thức sẽ được giải phóng sau khi phương thức truyền tin FCM onMessageReceived()
thực thi xong.
Nội dung đề xuất
Bạn nên áp dụng các phương pháp sau để tối ưu hoá hành vi của FCM:
- Tối ưu hoá tần suất phân phối thông báo qua FCM.
- Đừng sử dụng FCM có mức độ ưu tiên cao trừ phi thông báo thực sự cần được gửi ngay lập tức.
- Hoàn tất phương thức
onMessageReceived()
nhanh nhất có thể. Hãy xem hướng dẫn về Firebase để biết thêm thông tin.
*job*/<package_name>/<package_and_job_name>
Các khoá chế độ thức nâng cao này được các công việc JobScheduler sử dụng trong khi thực thi các tác vụ ở chế độ nền. Khoá chế độ thức được phân bổ cho ứng dụng đã tạo worker.
"<package_name>" là tên của gói ứng dụng, chứ không phải văn bản cố định <package name>
. Tương tự, "<package_and_job_name>" là tên gói, theo sau là tên công việc. *job*
là chuỗi ký tự *job*
, có dấu hoa thị; dấu hoa thị không được dùng làm ký tự đại diện.
Dưới đây là ví dụ về tên khoá chế độ thức như vậy:
*job*/com.example.app/com.example.app.example.path.ExampleJobService
Nội dung đề xuất
Kiểm tra mức sử dụng các tác vụ JobScheduler. Cụ thể, hãy làm theo hướng dẫn của chúng tôi về cách tối ưu hoá mức sử dụng pin cho API lập lịch biểu tác vụ.
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Các khoá chế độ thức nâng cao này được trình chạy WorkManager sử dụng trong khi thực thi các tác vụ ở chế độ nền. Khoá chế độ thức được phân bổ cho ứng dụng đã tạo worker.
"<package_name>" là tên của gói ứng dụng, chứ không phải văn bản cố định <package name>
. *job*
là chuỗi ký tự *job*
, có dấu hoa thị; dấu hoa thị không được dùng làm ký tự đại diện.
Nội dung đề xuất
Kiểm tra mức sử dụng trình thực thi WorkManager. Cụ thể, hãy làm theo hướng dẫn của chúng tôi về cách tối ưu hoá mức sử dụng pin cho API lập lịch biểu tác vụ.
NetworkLocationLocator
, FusedLocation
, *location*
LocationManager
và FusedLocationProviderClient
sử dụng các tên khoá chế độ thức này để thu thập và phân phối vị trí của thiết bị. Khoá chế độ thức được phân bổ cho ứng dụng đã gọi các API đó.
Nội dung đề xuất
Tối ưu hoá việc sử dụng thông tin vị trí. Ví dụ: đặt thời gian chờ, yêu cầu vị trí hàng loạt hoặc sử dụng thông báo cập nhật vị trí thụ động.
_UNKNOWN
Nếu các công cụ gỡ lỗi cho rằng tên khoá chế độ thức chứa thông tin nhận dạng cá nhân (PII), thì các công cụ này sẽ không hiển thị tên khoá chế độ thức thực tế. Thay vào đó, các ứng dụng này sẽ gắn nhãn khoá chế độ thức là _UNKNOWN
. Ví dụ: các công cụ có thể thực hiện việc này nếu tên khoá chế độ thức chứa địa chỉ email.
Nội dung đề xuất
Làm theo các phương pháp hay nhất về việc đặt tên cho khoá chế độ thức và tránh sử dụng PII trong tên khoá chế độ thức. Nếu bạn tìm thấy một khoá chế độ thức có tên _UNKNOWN
được phân bổ cho ứng dụng của mình, hãy cố gắng xác định khoá chế độ thức đó và đặt tên khác cho khoá đó.