ระบุการล็อกที่ปลุกซึ่ง API อื่นๆ สร้างขึ้น

ไลบรารีและ API ของระบบหลายรายการสามารถรับ Wake Lock ที่ระบุแหล่งที่มาได้ ในแอปของคุณ ซึ่งอาจทำให้ระบุ Wake Lock ในแอปที่ อาจก่อให้เกิดปัญหาได้ยาก หากคุณใช้ API ในทางที่ผิด แอปอาจ ถือ Wake Lock นานเกินไป แม้ว่าคุณจะไม่ได้เรียกใช้ API ของ Wake Lock โดยตรงก็ตาม

ในสถานการณ์ที่ API อื่นๆ ได้รับ Wake Lock คุณควรหลีกเลี่ยงการรับ Wake Lock ด้วยตนเอง

เอกสารนี้แสดงชื่อการทำงานขณะล็อกที่พบบ่อยบางส่วนที่คุณอาจเห็นเมื่อใช้ เครื่องมือแก้ไขข้อบกพร่องของการทำงานขณะล็อก คุณอาจเห็นชื่อเหล่านี้ในรายงานจาก vitals ด้วย ในบางกรณี ไลบรารีหรือระบบ API อาจสร้าง Wake Lock ในกรณีอื่นๆ มีเหตุผลที่เครื่องมือ ทำให้ชื่อ Wake Lock ที่คุณใช้ในแอปไม่ชัดเจน คุณสามารถใช้ เครื่องมือแก้ไขข้อบกพร่องเพื่อระบุ Wake Lock ที่ทำงานผิดปกติ จากนั้นค้นหาชื่อ Wake Lock ในเอกสารนี้เพื่อระบุว่า API ใดอาจทำให้เกิดปัญหาและ วิธีแก้ปัญหา

เอกสารนี้ครอบคลุมสถานการณ์ที่อาจมีการสร้าง Wake Lock ในแต่ละกรณี แม้ว่าไลบรารีหรือ API อื่นๆ อาจสร้าง Wake lock แต่ระบบจะถือว่าแอปที่เรียกใช้ API นั้นเป็นผู้สร้างล็อก

AlarmManager

AlarmManager จะรับ Wake Lock และเชื่อมโยงกับแอปที่เรียกใช้ AlarmManager จะรับ Wake Lock เมื่อสัญญาณเตือนดังขึ้น และปล่อย ล็อกเมื่อเมธอด onReceive() ของการออกอากาศสัญญาณเตือน ทำงานเสร็จ

ชื่อ Wake Lock

AlarmManager สร้างการทำงานขณะล็อกที่มีชื่อว่า *alarm* (เครื่องหมายดอกจันเป็นส่วนหนึ่งของชื่อ Wake Lock ไม่ได้แสดงถึงไวลด์การ์ด)

คำแนะนำ

เราขอแนะนำให้ปฏิบัติตามแนวทางต่อไปนี้เพื่อเพิ่มประสิทธิภาพการทำงานของสัญญาณเตือน

  • ใช้ AlarmManager เพื่อเพิ่มประสิทธิภาพความถี่ในการตั้งเวลาปลุก
  • ใช้การปลุกประเภท RTC_WAKEUP เท่านั้น (ซึ่งจะปลุกอุปกรณ์) เมื่อจำเป็น
  • ลดการใช้อาลามและหลีกเลี่ยงการทำงานที่ยาวนานในเมธอด onReceive()

เสียงและสื่อ

Media API สามารถรับ Wake Lock เมื่อบันทึกหรือเล่นเสียง ระบบจะระบุว่าแอปการโทรเป็นผู้ใช้ Wake Lock

ชื่อ Wake Lock

API สื่อจะรับ Wake Lock ที่มีชื่อต่างๆ ซึ่งขึ้นต้นด้วย Audio ดังนี้

  • AudioBitPerfect: ใช้สำหรับการเล่นเสียง USB แบบไม่สูญเสียข้อมูล
  • AudioDirectOut: ใช้สำหรับการเล่นเสียงแบบไม่สูญเสียข้อมูลบนทีวีหรืออุปกรณ์พิเศษ
  • AudioDup: ใช้สำหรับการเล่นการแจ้งเตือนขณะเชื่อมต่อผ่านบลูทูธ หรือ USB
  • AudioIn: ใช้สำหรับการบันทึกเสียงเมื่ออยู่ในโหมดกล้องวิดีโอขณะที่ไมโครโฟน ทำงานอยู่
  • AudioMix: ใช้สำหรับการเล่นเสียงไปยังอุปกรณ์ทั่วไป
  • AudioOffload: ใช้สำหรับการเล่นเพลงอย่างเดียวในระยะยาว สำหรับแอปที่รองรับ โหมดนี้
  • AudioSpatial: ใช้สำหรับการเล่นเสียงภาพยนตร์หรือเพลงแบบหลายช่องบน อุปกรณ์ที่รองรับเสียงรอบทิศทาง
  • AudioUnknown: ใช้เมื่อสถานการณ์อื่นๆ ไม่เกี่ยวข้อง
  • MmapCapture: ใช้สำหรับการบันทึกเสียงที่มีเวลาในการตอบสนองต่ำ
  • MmapPlayback: ใช้สำหรับการเล่นที่มีเวลาในการตอบสนองต่ำ เช่น สำหรับการเล่นเกมหรือสำหรับ แอปพลิเคชันเสียงระดับมืออาชีพ

คำแนะนำ

เราขอแนะนำให้ปฏิบัติดังนี้

  • อย่าใช้ชื่อการทำงานขณะล็อกที่ขึ้นต้นด้วย Audio
  • หากใช้ Media API คุณไม่จำเป็นต้องขอ Wake Lock โดยตรง แต่สามารถใช้ API เพื่อขอ Wake Lock ที่จำเป็นให้คุณได้
  • เมื่อใช้ Media API ให้สิ้นสุดเซสชันสื่อเมื่อไม่ต้องการใช้แล้ว

บลูทูธ

API บลูทูธของแพลตฟอร์มจะไม่มีการล็อกการปลุกที่เกิดจาก แอปพลิเคชันในขณะที่เกิดการดำเนินการผ่านบลูทูธ หากต้องการช่วยยืนยันว่าการรับส่งผ่านบลูทูธเกิดขึ้นในเบื้องหลัง ให้ กำหนดเวลางานโดยใช้ WorkManager

คำแนะนำ

  • ใช้การจับคู่อุปกรณ์เสริมเพื่อจับคู่อุปกรณ์บลูทูธเพื่อหลีกเลี่ยง การรับ Wake Lock ด้วยตนเองในระหว่างการจับคู่บลูทูธ
  • โปรดดูคำแนะนำสื่อสารในเบื้องหลังเพื่อทำความเข้าใจวิธีสื่อสารผ่านบลูทูธในเบื้องหลัง
  • หากเห็นว่าจำเป็นต้องใช้ Wake Lock ด้วยตนเอง ให้ใช้ Wake Lock เฉพาะในระยะเวลาของ การดำเนินการผ่านบลูทูธ

เซ็นเซอร์ของอุปกรณ์

การติดตามข้อมูลเซ็นเซอร์ของอุปกรณ์ เช่น จำนวนก้าว ข้อมูลตัวตรวจวัดความเร่งหรือเครื่องวัดการหมุน ทำได้หลายวิธี

ใน Wear OS ให้ใช้ Wear Health Services เพื่อดึงข้อมูลอุปกรณ์ เช่น ระดับความสูง อัตราการเต้นของหัวใจ และระยะทางที่เดินทาง

หากแอปพลิเคชันอื่นๆ รวบรวมข้อมูล คุณสามารถใช้ Health Connect ร่วมกับ WorkManager เพื่อดึงข้อมูลได้

สำหรับสถานการณ์ต่างๆ เช่น การติดตามส่วนต่างของจำนวนก้าวหรือระยะทางที่เดิน คุณสามารถใช้ Recording API บนอุปกรณ์เคลื่อนที่ร่วมกับ WorkManager เพื่อดึงข้อมูลได้

ในบางสถานการณ์ คุณอาจต้องใช้การติดตามเซ็นเซอร์อุปกรณ์ที่กำหนดเองโดยใช้ SensorManager SensorManager ไม่ได้ขอ Wake Lock ในนามของแอป เว้นแต่เซ็นเซอร์จะเป็นเซ็นเซอร์ปลุก ซึ่งระบุได้โดยใช้ API isWakeUpSensor

คำแนะนำ

การใช้เซ็นเซอร์เพื่อบันทึกที่อัตราการสุ่มตัวอย่างสูงอาจทำให้แบตเตอรี่หมดเร็วมาก ต่อไปนี้คือคำแนะนำในการลดการใช้แบตเตอรี่และลดการใช้ Wake Lock

  • หากติดตามจำนวนก้าวหรือระยะทางที่เดิน ให้ใช้ Recording API เพื่อบันทึกข้อมูลในลักษณะที่ประหยัดแบตเตอรี่
  • สําหรับการติดตามเซ็นเซอร์แบบพาสซีฟใน Wear OS ให้ใช้ Wear Health Services เพื่อ เพิ่มประสิทธิภาพการใช้งานแบตเตอรี่
  • ลดความถี่ของเซ็นเซอร์ให้น้อยกว่า 200 Hz
  • เมื่อลงทะเบียนเซ็นเซอร์กับ SensorManager ให้กำหนด maxReportLatencyUs มากกว่า 30 วินาทีเพื่อใช้ ตรรกะการจัดกลุ่มเซ็นเซอร์และลดจำนวน การขัดจังหวะที่แอปพลิเคชันได้รับ
  • หลีกเลี่ยงการใช้ Wake Lock เป็นเวลานานตลอดระยะเวลาการติดตามเซ็นเซอร์ แต่ให้ตั้งเวลาปลุกโดยใช้ AlarmManager เพื่อสำรวจข้อมูลเซ็นเซอร์ทุกๆ 30 วินาทีขึ้นไปแทน

ข้อความ Firebase Cloud (FCM)

ระบบจะรับ Wake Lock ขณะส่งข้อความที่ออกอากาศของ Firebase Cloud Messaging (FCM) ไปยังแอป ระบบจะปล่อย Wake Lock เมื่อวิธีการ onMessageReceived() ของการออกอากาศ FCM ทำงานเสร็จ

ชื่อ Wake Lock

ระบบจะรับ Wake Lock ที่มีชื่อ GOOGLE_C2DM

คำแนะนำ

เราขอแนะนำให้ปฏิบัติตามแนวทางต่อไปนี้เพื่อเพิ่มประสิทธิภาพลักษณะการทำงานของ FCM

JobScheduler

งาน JobScheduler จะได้ล็อกการปลุกระบบขณะดำเนินงานใน เบื้องหลัง ระบบจะระบุการล็อกการปลุกให้กับแอปที่สร้าง Worker

ชื่อ Wake Lock

ชื่อ Wake Lock ที่ JobScheduler ได้รับจะขึ้นอยู่กับเวอร์ชันของระบบ Android ที่ทำงานอยู่และวัตถุประสงค์ของงาน

รายการที่อยู่ในวงเล็บเหลี่ยมคือตัวแปร เช่น "<package_name>" คือชื่อแพ็กเกจของแอป ไม่ใช่ข้อความตามตัวอักษร <package name> อย่างไรก็ตาม *job* คือลำดับอักขระ *job* ที่มีเครื่องหมายดอกจัน โดยเครื่องหมายดอกจันไม่ได้ใช้เป็นไวลด์การ์ด

Android 15 และต่ำกว่า

งานที่ผู้ใช้เริ่มจะสร้างการล็อกการปลุกที่มีชื่อตามรูปแบบต่อไปนี้

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

งานอื่นๆ ที่ใช้รูปแบบนี้

*job*/@<name_space>@/<package_name>/<classname>
Android 16 ขึ้นไป

งานที่ผู้ใช้เริ่มจะสร้างการล็อกการปลุกที่มีชื่อตามรูปแบบต่อไปนี้

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

งานด่วนใช้รูปแบบต่อไปนี้

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

งานปกติใช้รูปแบบนี้

*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
ตัวอย่าง

สมมติว่ามีงานเร่งด่วนที่มีเนมสเปซ backup และแท็กการติดตาม started ชื่อแพ็กเกจคือ com.example.app และคลาสที่สร้างงานคือ com.backup.BackupFileService

ในอุปกรณ์ที่ใช้ Android 15 หรือต่ำกว่า การล็อกการปลุกจะมีชื่อดังนี้

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

ในอุปกรณ์ที่ใช้ Android 16 ขึ้นไป การล็อกการปลุกจะมีชื่อดังนี้

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

คำแนะนำ

ตรวจสอบการใช้งานงาน JobScheduler โดยเฉพาะอย่างยิ่ง ให้ทำตามคำแนะนำของเราสำหรับการเพิ่มประสิทธิภาพการใช้แบตเตอรี่สำหรับ API การตั้งเวลางาน

ตำแหน่ง

LocationManager และ FusedLocationProviderClient ใช้ การล็อกการปลุกเพื่อรับและส่งตำแหน่งของอุปกรณ์ ระบบจะระบุแหล่งที่มาของ Wake Lock ไปยังแอปที่เรียก API เหล่านั้น

ชื่อ Wake Lock

บริการตำแหน่งใช้ชื่อต่อไปนี้

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

คำแนะนำ

  • เพิ่มประสิทธิภาพการใช้ตำแหน่ง เช่น ตั้งค่าการหมดเวลา คำขอตำแหน่งแบบกลุ่ม หรือใช้การอัปเดตตำแหน่งแบบพาสซีฟ
  • หากใช้ Location API คุณไม่จำเป็นต้องรับ Wake Lock โดยตรง แต่สามารถใช้ API เพื่อรับ Wake Lock ที่จำเป็นสำหรับคุณได้

WorkManager

Worker ของ WorkManager จะได้รับล็อกการปลุกระบบขณะดำเนินการในเบื้องหลัง ระบบจะระบุการล็อกการปลุกให้กับแอปที่สร้าง Worker

ชื่อ Wake Lock

ชื่อ Wake Lock ที่ WorkManager ได้รับจะขึ้นอยู่กับเวอร์ชันของระบบ Android ที่ทำงานอยู่

Android 15 และต่ำกว่า

งาน WorkManager จะสร้างการทำงานขณะล็อกที่มีชื่อตามรูปแบบต่อไปนี้

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16 ขึ้นไป

งานที่เร่งด่วนจะสร้าง Wake Lock ที่มีชื่อตามรูปแบบต่อไปนี้

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

งานปกติจะมีรูปแบบดังนี้

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

โดยค่าเริ่มต้น <trace_tag> คือชื่อผู้ปฏิบัติงาน

ตัวอย่าง

สมมติว่ามีผู้ปฏิบัติงานที่เร่งด่วนชื่อ BackupFileWorker ชื่อแพ็กเกจ คือ com.example.app

ในอุปกรณ์ที่ใช้ Android 15 หรือต่ำกว่า การล็อกการปลุกจะมีชื่อดังนี้

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

ในอุปกรณ์ที่ใช้ Android 16 ขึ้นไปและใช้ WorkManager 2.10.0+ ระบบจะตั้งชื่อ Wake Lock ดังนี้

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

คำแนะนำ

_UNKNOWN

หากเครื่องมือแก้ไขข้อบกพร่องคิดว่าชื่อ Wake Lock มีข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ (PII) เครื่องมือจะไม่แสดงชื่อ Wake Lock จริง แต่จะ ติดป้ายกำกับการล็อกปลุกเป็น _UNKNOWN แทน เช่น เครื่องมืออาจทำเช่นนี้หากชื่อ Wake lock มีอีเมล

คำแนะนำ

ทําตามแนวทางปฏิบัติแนะนําในการตั้งชื่อการทํางานขณะล็อก และหลีกเลี่ยงการใช้ PII ในชื่อการทํางานขณะล็อก หากพบ Wake Lock ที่ชื่อ _UNKNOWN ซึ่งเชื่อมโยงกับแอปของคุณ ให้ลอง ระบุว่า Wake Lock นั้นคืออะไร แล้วตั้งชื่ออื่น