Xác định khoá chế độ thức do các API khác tạo

Một số thư viện và API hệ thống có thể thu được khoá đánh thức có thể quy cho ứng dụng của bạn. Điều này có thể gây khó khăn cho việc xác định khoá đánh thức trong ứng dụng có thể gây ra vấn đề. Nếu bạn sử dụng sai một API, điều đó có thể khiến ứng dụng của bạn giữ khoá đánh thức quá lâu, ngay cả khi bạn không gọi trực tiếp các API khoá đánh thức.

Trong trường hợp các API khác thu được khoá đánh thức, bạn nên tránh thu thập khoá đánh thức theo cách thủ công.

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ông cụ gỡ lỗi khoá chế độ thức. Bạn cũng có thể thấy những tên này trong báo cáo từ vitals. Trong một số trường hợp, khoá đánh thức có thể do một thư viện hoặc API hệ thống tạo. Trong những trường hợp khác, có một lý do khiến công cụ này làm rối tên khoá đánh thức mà bạn dùng trong ứng dụng. Bạn có thể dùng các công cụ gỡ lỗi để xác định khoá đánh thức hoạt động không đúng cách, sau đó tìm tên khoá đánh thức trong tài liệu này để xác định API nào có thể gây ra vấn đề và cách giải quyết vấn đề đó.

Tài liệu này đề cập đến các trường hợp có thể tạo khoá đánh thức. Trong mỗi trường hợp, mặc dù khoá đánh thức có thể được tạo bởi một thư viện hoặc API khác, nhưng khoá này được gán cho ứng dụng đã gọi API đó.

AlarmManager

AlarmManager thu thập khoá đánh thức và gán các khoá đó cho ứng dụng gọi. AlarmManager thu thập khoá đánh thức khi chuông báo tắt và giải phóng khoá khi phương thức onReceive() của thông báo chuông báo phát hoàn tất việc thực thi.

Tên khoá chế độ thức

AlarmManager tạo khoá đánh thức có tên là *alarm*. (Dấu hoa thị là một phần của tên khoá chế độ thức, không đại diện cho ký tự đại diện.)

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 báo thức.
  • Chỉ sử dụng chuông báo loại RTC_WAKEUP (đánh thức thiết bị) khi cần thiết.
  • Giảm thiểu việc sử dụng các chuông báo và tránh thực hiện những công việc kéo dài trong phương thức onReceive().

Âm thanh và nội dung nghe nhìn

Media API có thể nhận được khoá đánh thức khi ghi âm hoặc phát âm thanh. Khoá đánh thức được gán cho ứng dụng gọi.

Tên khoá chế độ thức

Media API thu thập các khoá chế độ thức với nhiều tên bắt đầu bằng Audio:

  • AudioBitPerfect: Dùng để phát âm thanh qua USB mà không bị mất dữ liệu.
  • AudioDirectOut: Dùng để phát âm thanh không mất dữ liệu trên TV hoặc thiết bị đặc biệt.
  • AudioDup: Dùng để phát thông báo khi kết nối bằng Bluetooth hoặc USB.
  • AudioIn: Được dùng để ghi âm thanh khi ở chế độ máy quay và micrô đang hoạt động.
  • AudioMix: Dùng để phát âm thanh trên một thiết bị thông thường.
  • AudioOffload: Dùng để phát nhạc trong thời gian dài, đối với những ứng dụng hỗ trợ chế độ này.
  • AudioSpatial: Dùng để phát âm thanh đa kênh của phim hoặc nhạc trên các thiết bị hỗ trợ âm thanh không gian.
  • AudioUnknown: Được dùng khi các trường hợp khác không áp dụng.
  • MmapCapture: Dùng để ghi âm thanh có độ trễ thấp.
  • MmapPlayback: Dùng để phát lại có độ trễ thấp, chẳng hạn như để chơi trò chơi hoặc cho các ứng dụng âm thanh chuyên nghiệp.

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 các API đa phương tiện, bạn không cần trực tiếp lấy khoá đánh thức; bạn có thể dựa vào các API để lấy khoá đánh thức cần thiết cho bạn.
  • Khi sử dụng các API đa phương tiện, hãy kết thúc phiên đa phương tiện khi bạn không cần dùng nữa.

Bluetooth

Các API Bluetooth của nền tảng không giữ bất kỳ khoá đánh thức nào có thể quy cho ứng dụng trong khi các thao tác Bluetooth diễn ra. Để giúp xác minh quá trình truyền dữ liệu qua Bluetooth diễn ra ở chế độ nền, hãy lên lịch một tác vụ bằng WorkManager.

Nội dung đề xuất

  • Sử dụng tính năng ghép nối Thiết bị đồng hành để ghép nối các thiết bị Bluetooth nhằm tránh nhận được khoá đánh thức thủ công trong quá trình ghép nối Bluetooth.
  • Tham khảo hướng dẫn giao tiếp ở chế độ nền để hiểu cách thực hiện giao tiếp Bluetooth ở chế độ nền.
  • Nếu cần khoá đánh thức thủ công, chỉ giữ khoá đánh thức trong thời gian thực hiện thao tác Bluetooth.

Cảm biến thiết bị

Có một số phương thức để theo dõi dữ liệu cảm biến của thiết bị, chẳng hạn như số bước, dữ liệu gia tốc kế hoặc con quay hồi chuyển.

Trên Wear OS, hãy dùng Wear Health Services để lấy dữ liệu thiết bị, chẳng hạn như độ cao, nhịp tim và quãng đường đã đi.

Nếu dữ liệu được thu thập bởi các ứng dụng khác, bạn có thể sử dụng Health Connect kết hợp với WorkManager để truy xuất dữ liệu.

Đối với các trường hợp như theo dõi mức chênh lệch về số bước hoặc quãng đường đã đi, bạn có thể sử dụng Recording API trên thiết bị di động kết hợp với WorkManager để truy xuất dữ liệu.

Trong một số trường hợp, bạn có thể cần sử dụng tính năng theo dõi cảm biến thiết bị tuỳ chỉnh bằng SensorManager. SensorManager không nhận khoá đánh thức thay cho ứng dụng, trừ phi cảm biến là cảm biến đánh thức. Bạn có thể xác định cảm biến này bằng API isWakeUpSensor.

Nội dung đề xuất

Việc sử dụng cảm biến để ghi ở tốc độ lấy mẫu cao có thể làm tiêu hao đáng kể pin. Dưới đây là các đề xuất để giảm mức tiêu hao pin và mức sử dụng khoá đánh thức:

  • Nếu bạn đang theo dõi số bước hoặc quãng đường đã đi, hãy sử dụng Recording API để ghi lại dữ liệu theo cách tiết kiệm pin.
  • Để theo dõi cảm biến thụ động trên Wear OS, hãy sử dụng Dịch vụ sức khoẻ trên Wear để tối ưu hoá mức sử dụng pin.
  • Giảm tần số cảm biến xuống dưới 200 Hz.
  • Khi đăng ký một cảm biến bằng SensorManager, hãy xác định maxReportLatencyUs dài hơn 30 giây để sử dụng logic kết hợp cảm biến và giảm số lượng gián đoạn mà ứng dụng nhận được.
  • Tránh giữ khoá đánh thức trong thời gian dài trong suốt quá trình theo dõi cảm biến, thay vào đó, hãy lên lịch báo thức bằng AlarmManager để thăm dò dữ liệu cảm biến sau mỗi 30 giây.

Giải pháp gửi thông báo qua đám mây của Firebase (FCM)

Khoá đánh thức được thu nạp trong khi truyền tin thông báo qua đám mây của Firebase (FCM) đến ứng dụng. Khoá đánh thức sẽ được giải phóng sau khi phương thức truyền tin onMessageReceived() của FCM thực thi xong.

Tên khoá chế độ thức

Một khoá đánh thức được lấy với tên GOOGLE_C2DM.

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 gửi 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() càng nhanh càng tốt. Hãy xem hướng dẫn của firebase để biết thêm thông tin.

JobScheduler

Các lệnh JobScheduler sẽ nhận được khoá đánh thức trong khi thực thi các tác vụ ở chế độ nền. Khoá đánh thức được quy cho ứng dụng đã tạo các worker.

Tên khoá chế độ thức

Tên khoá đánh thức mà JobScheduler thu được phụ thuộc vào phiên bản hệ thống Android mà chúng đang chạy và mục đích của công việc.

Các mục được đặt trong dấu ngoặc nhọn là các biến. Ví dụ: "<package_name>" là tên gói của ứng dụng, chứ không phải văn bản chữ <package name>. Tuy nhiên, *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.

Android 15 trở xuống

Các công việc do người dùng khởi tạo sẽ tạo khoá đánh thức có tên theo mẫu sau:

*job*u/@<name_space>@/<package_name>/<classname>

Các công việc khác sử dụng mẫu này:

*job*/@<name_space>@/<package_name>/<classname>
Android 16 trở lên

Các công việc do người dùng khởi tạo sẽ tạo khoá đánh thức có tên theo mẫu sau:

*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

Các việc làm ưu tiên sử dụng mẫu sau:

*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>

Các công việc thông thường sử dụng mẫu sau:

*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
Ví dụ

Giả sử có một công việc được đẩy nhanh với không gian tên backup và thẻ theo dõi started. Tên gói là com.example.app và lớp đã tạo công việc là com.backup.BackupFileService.

Trên các thiết bị chạy Android 15 trở xuống, khoá đánh thức sẽ có tên là:

*job*/@backup@/com.example.app/com.backup.BackupFileService

Trên các thiết bị chạy Android 16 trở lên, khoá đánh thức sẽ có tên là:

*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService

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 các API lập lịch tác vụ.

Vị trí

LocationManagerFusedLocationProviderClient sử dụng khoá đánh thức để thu thập và cung cấp thông tin vị trí của thiết bị. Các khoá đánh thức được phân bổ cho ứng dụng đã gọi những API đó.

Tên khoá chế độ thức

Dịch vụ vị trí sử dụng các tên sau:

  • CollectionLib-SigCollector
  • NetworkLocationLocator
  • NetworkLocationScanner
  • NlpCollectorWakeLock
  • NlpWakeLock
  • *location*

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í theo lô hoặc sử dụng thông báo cập nhật vị trí thụ động.
  • Nếu đang sử dụng các API vị trí, bạn không cần trực tiếp lấy khoá đánh thức; bạn có thể dựa vào các API để lấy khoá đánh thức cần thiết cho bạn.

WorkManager

Các trình thực thi WorkManager thu thập khoá chế độ thức trong khi thực thi các tác vụ ở chế độ nền. Khoá đánh thức được quy cho ứng dụng đã tạo các worker.

Tên khoá chế độ thức

Tên khoá đánh thức mà WorkManager thu được tuỳ thuộc vào phiên bản hệ thống Android mà chúng đang chạy.

Android 15 trở xuống

Các tác vụ WorkManager tạo khoá đánh thức có tên theo mẫu sau:

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16 trở lên

Các tác vụ ưu tiên tạo khoá đánh thức có tên theo mẫu sau:

*job*e/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

Các nhiệm vụ thường xuyên tuân theo mẫu sau:

*job*r/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

Theo mặc định, <trace_tag> là tên của worker.

Ví dụ

Giả sử có một worker được tăng tốc có tên là BackupFileWorker. Tên gói là com.example.app.

Trên các thiết bị chạy Android 15 trở xuống, khoá đánh thức sẽ có tên là:

*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

Trên các thiết bị chạy Android 16 trở lên và sử dụng WorkManager 2.10.0+, khoá đánh thức sẽ có tên là:

*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService

Nội dung đề xuất

_UNKNOWN

Nếu các công cụ gỡ lỗi cho rằng tên khoá chế độ thức 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 đó, chúng sẽ gắn nhãn khoá đánh 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 wake lock chứa địa chỉ email.

Nội dung đề xuất

Làm theo các phương pháp hay nhất về đặt tên cho khoá chế độ thức và tránh sử dụng thông tin nhận dạng cá nhân trong tên khoá chế độ thức. Nếu bạn thấy một khoá đánh thức có tên _UNKNOWN được gán cho ứng dụng của mình, hãy thử xác định khoá đánh thức đó và đặt cho khoá đó một tên khác.