วิธีจัดการกับ WakeLocks (กำพร้า)?


40

ผมคิดว่าส่วนใหญ่ของคุณอย่างน้อยได้ได้ยินเกี่ยวกับWakeLocks พวกคุณหลายคนจะเคยประสบกับพวกเขามาแล้ว - รู้เท่าทันหรือไม่ บางคนอาจรู้วิธีจัดการกับพวกเขาโดยทั่วไป แต่มีเพียงไม่กี่คนที่รู้วิธีรับมือกับ "ผู้สมัครที่มีความซับซ้อนมากขึ้น"

สำหรับผู้ที่ไม่ทราบแม้ว่าลิงก์ด้านบนจะนำไปสู่คำอธิบายสรุปโดยย่อ: แอปอาจขอให้WAKE_LOCKเพื่อป้องกันไม่ให้ส่วนประกอบของอุปกรณ์ "หยุดทำงาน" เพื่อให้พวกเขาสามารถทำงานได้แม้จะปิดจอแสดงผล สิ่งนี้มีประโยชน์มากในกรณีส่วนใหญ่ (เช่นเปิดหน้าจอขณะนำทางนำทางใช้งาน WiFi เพื่อสตรีมเพลง) - แต่ใช้ผิดวิธีทำให้แบตเตอรี่ของคุณหมดภายในระยะสั้น (สูงถึง 25% ต่อชั่วโมง) .

เวลาส่วนใหญ่มันง่ายต่อการระบุแหล่งที่มา (มักจะเป็นแอพที่มีพฤติกรรมไม่ดี) - ฉันจะแสดงสิ่งนี้ในคำตอบด้านล่างเนื่องจากอาจพิสูจน์ได้ว่าเป็นประโยชน์ต่อผู้ใช้หลายคน แต่จะต้องทำอย่างไรถ้าแอพที่ขอให้ออกจาก WakeLock โดยไม่ปล่อยมือ? ระบบ Android จะไม่ดูแลมัน แน่นอนว่าการรีบูตจะช่วยแก้ปัญหาได้ - แต่ไม่ใช่ตัวเลือก (ที่ต้องการ) เสมอ

ดังนั้นจากมุมมองของผู้ใช้ (ฉันไม่ได้ถามเกี่ยวกับโซลูชันการพัฒนา แต่ผู้ใช้สามารถจัดการกับสิ่งต่าง ๆ ได้อย่างไร):

ผู้ใช้ *สามารถทำอะไรได้บ้างเพื่อแก้ไขปัญหาและหลีกเลี่ยงการสิ้นเปลืองแบตเตอรี่เพิ่มเติม

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


2
ฉันรู้สึกว่านี่เป็นเรื่องจริงถ้าคุณสร้าง wakelock ในแบบ "ผิด" โดยใช้/sys/power/wake_lockแต่ถ้าคุณทำแบบ "ถูกต้อง" โดยใช้ PowerManager และ PowerManager.WakeLock บริการทั้งสองจะถือ wakelock จริง และปล่อยให้มันแม้ว่ากระบวนการของคุณจะถูกฆ่า ...
Izkata

1
จากข้อมูลที่ฉันเชื่อมโยงนั่นไม่ใช่กรณี มีคนรายงานว่ามีการตรวจสอบที่มาของเคอร์เนลและไม่พบคำใบ้ใด ๆ คำแนะนำสำหรับนักพัฒนา: ดูเหมือนว่าสามารถขอเวลา "บางส่วน wakelocks" ได้ดังนั้นพวกเขาจึงจะหมดอายุโดยอัตโนมัติเมื่อตัวจับเวลาขึ้นมา นั่นจะต้องเป็น "วิธีที่ปลอดภัย" ที่คุณอ้างถึง
Izzy

คำตอบ:


37

ฉันจะบอกได้อย่างไรว่าฉันได้รับผลกระทบ

นี่อาจเป็นคำถามแรกสำหรับผู้ที่ไม่คุ้นเคยกับหัวข้อนี้ ด้วย Gingerbread (Android 2.3) ขึ้นไปคุณจะได้รับบริการต่าง ๆ เพื่อช่วยให้คุณเข้าใจ: สถิติแบตเตอรี่ แม้ว่าผู้ผลิตมักจะวางไว้ที่จุดที่แตกต่างกัน แต่ส่วนใหญ่จะพบในการตั้งค่า→เกี่ยวกับโทรศัพท์→แบตเตอรี่หรือที่คล้ายกันและแสดงรายการแอพที่ใช้แบตเตอรี่ส่วนใหญ่ของคุณ ด้านบนของที่เป็นกราฟขนาดเล็ก แตะที่และมันจะนำคุณไปสู่หน้าจอที่คล้ายกับหน้าจอนี้:

สถิติแบตเตอรี่
สกรีนช็อตของสถิติแบตเตอรี่บน Android 2.3

ฉันเลือกภาพหน้าจอจากหนึ่งในอุปกรณ์ของฉันซึ่งแสดงให้เห็นถึงปัญหา ดูที่แถบสีฟ้าสองแถบด้านล่าง ("Aktiv" = อุปกรณ์ยังคงทำงานอยู่ (ใช้งานอยู่) "Bildschirm an" = "Screen on") แถบสีน้ำเงินด้านขวาสุดที่ "Aktiv" หมายถึง WakeLock: อุปกรณ์ยังคงไม่ว่าง ความจริงที่หน้าจอถูกปิด ดังนั้นเราจึงมั่นใจได้เลยว่าเรามี WakeLock - แต่เราไม่สามารถบอกได้ว่าใครเป็นสาเหตุ

หากอุปกรณ์ของคุณไม่มีหน้าจอนี้ (หรือแถบด้านล่าง: ฉันเพิ่งค้นพบเช่นLG Optimus 4X ที่ใช้ Android 4.0.3 ได้ตัดแถบเหล่านี้ออก) คุณสามารถค้นหาได้เช่นใช้GSam Battery Monitor :

การตรวจสอบแบตเตอรี่ GSam
ข้อมูลที่คล้ายกันจากGSam Battery Monitor - นี่คือ "แถบสีฟ้า" ที่กล่าวถึงเป็นสีเหลือง / ส้ม

อะไรเป็นสาเหตุของ WakeLock

น่าเสียดายที่คำถามนี้ไม่สามารถตอบได้ด้วยแอพที่ติดตั้งไว้ล่วงหน้า (ยกเว้นอาจจะเป็น Custom ROM บางอัน) แต่มีเครื่องมือที่สามารถใช้ได้ ผู้สมัครที่รู้จักกันดีที่สุดสำหรับเรื่องนี้คือBetterBatteryStatsและแสดงให้เราเห็นสาเหตุในส่วน wakelocks บางส่วน:

BetterBatteryStats BetterBatteryStats2
ภาพหน้าจอจาก BetterBatteryStats

ในตัวอย่างแรก2 (นำมาจากหน้า playstore ของแอพ) เหตุการณ์ที่ทำให้ WakeLocks ส่วนใหญ่เป็นสิ่งที่ต้องการ: เราไม่ต้องการให้การเล่นหยุดลงขณะฟังเพลง ดังนั้นตัวอย่างที่สอง3 (นำมาจากกรณีจริงในหนึ่งในอุปกรณ์ของฉัน) อาจพิสูจน์ได้ดีกว่า: เหตุการณ์ 3 อันดับสูงสุดเกิดจากแอปเดียวกันซึ่งต้องการ WakeLock เพื่อให้บริการ IMAP เปิดใช้งานอยู่

สำหรับทางเลือกในBetterBatteryStatsลองใช้แอพWakelock Detector ที่ระบุไว้ในคำตอบของ UzumAppsซึ่งดูเหมือนง่ายต่อการจัดการโดยเฉพาะอย่างยิ่งสำหรับผู้ที่ไม่ได้ใช้เทคโนโลยี:

Wakelock Detector: รายละเอียดแอพ Wakelock Detector: เลือกกระบวนการ
Wakelock Detector - คลิกที่ภาพเพื่อขยาย (ที่มา: Google Play )

สิ่งที่สามารถทำได้

หากกรณีมีความชัดเจนเช่นเดียวกับในตัวอย่างที่สองในส่วนก่อนหน้าการดำเนินการค่อนข้างชัดเจน - อย่างน้อยในกรณีของฉัน: ฉันไม่จำเป็นต้องได้รับแจ้งทันทีเมื่อมีจดหมายมาถึง ความล่าช้า 30 นาทีเป็นที่ยอมรับอย่างแน่นอน ดังนั้นฉันจึงเข้าไปในแอปอีเมลปิดการใช้งานIMAP Push (ดูเพิ่มเติมที่: พุชอีเมล ) และเปลี่ยนเป็นช่วงเวลาโพล 30 นาทีแทน WakeLocks ไม่ได้หายไปทั้งหมด แต่ลดลงอย่างเห็นได้ชัด - อายุการใช้งานแบตเตอรี่ดีขึ้นอย่างเห็นได้ชัด

จากนั้นมีกรณีที่กล่าวถึงในคำถามนี้: แอปที่มีพฤติกรรมไม่ดีไม่ปล่อย WakeLock เผชิญหน้ากับสิ่งที่คุณค้นพบและขอการแก้ไข หากเขาส่งมอบ: แก้ไขปัญหาได้ ถ้าไม่: มีแอพสำรองเกือบทุกตัว

เกิดอะไรขึ้นถ้ามันเป็นระบบ Android ตัวเอง?

ใช่บางครั้งดูเหมือนว่า: 98% หรือมากกว่านั้นถูกใช้โดยบริการ Android บางอย่าง โอ้ถ้ามันเป็น 98% ในกรณีส่วนใหญ่ผู้สมัครที่เป็นชื่อLocationManagerService คนเลวสอดแนมเรา? ไม่จำเป็น. ในกรณีพิเศษนี้รายการ "คนเลว" ที่ปรากฏนั้นไม่ได้มีความผิดแม้แต่น้อยก็ไม่ได้โดยตรง นี่คือแอพอื่นที่ขอตำแหน่งปัจจุบันบ่อยเกินไป : มีบทความที่ดีใน Setera.org เกี่ยวกับเรื่องนี้คือหาตำแหน่ง Android LocationManagerService ท่อระบายน้ำแบตเตอรี่ เพื่อให้เป็นนามธรรม: มันใช้ Androiddumpsysคุณสมบัติ (ต้องใช้ root!) เพื่อถ่ายโอนข้อมูลสถานะระบบและให้คุณตรวจสอบ Listeners ที่สร้างขึ้นสำหรับ LocationManagerService ดูการกำหนดค่าของพวกเขาอย่างใกล้ชิดซึ่งแสดงให้เห็นว่า "ตอก" อย่างต่อเนื่องเพื่อหาข้อมูลตำแหน่ง (บางคนทำอย่างถาวร เมื่อ ID ของแอปปรากฏในรายการและที่อื่นในการถ่ายโอนข้อมูลรวมถึงชื่อทางเทคนิคของแอพคุณยังสามารถระบุและดำเนินการที่เหมาะสมได้

แล้วยูเอฟโอล่ะ

น่าเสียดายที่มีเช่น: แอปที่ลงทะเบียน WakeLock - แล้วออกโดยไม่ปล่อยออกมา สิ่งที่เหลืออยู่คือ * ไม่ได้ใช้ F *** ไอเท็มล้าสมัย * - WakeLocks ถูกระงับไว้โดยไม่ใช้งาน ดังนั้นจึงไม่มีวิธีที่จะนำแอปไปเบื้องหน้าและกำหนดค่าใหม่อีกครั้งหรือทำให้แอปปล่อย WakeLocks

นี่เป็นทางออกเดียวที่ฉันรู้จักคือรีบูต - และฉันต้องการมีทางออกที่ดีกว่า แน่นอนถ้าคุณรู้ว่าแอปผิดขั้นตอนที่เกี่ยวข้องนั้นเหมือนกับขั้นตอนข้างต้น: แจ้ง dev รับการแก้ไข - หรือแทนที่แอป แต่เกี่ยวกับการกำจัดWakeLock ปัจจุบัน บางทีคนอื่นอาจเป็นทางเลือกที่ดีกว่าในการรีบูต

มีคำแนะนำเพิ่มเติมให้อ่านอีกหรือไม่?

แน่ใจ หนึ่งอันตอนนี้ฉันอาจเพิ่มอีกทีในภายหลัง:


2
การศึกษาที่ดีขึ้นสำหรับนักพัฒนาที่จะพูดว่า ... "ปล่อย wakelocks เมื่อคุณทำเสร็จแล้วล้างข้อมูลด้วยตัวเอง"?
t0mm13b

3
โหวตขึ้นจากฉันสำหรับคำตอบของคุณเสมอที่น่าทึ่ง !!! คุณไม่เคยเบื่อสิ่งนี้ใช่ไหม : D
t0mm13b

2
แน่นอน - แต่เห็นคำถามของฉัน: ฉันอย่างชัดเจนไม่ได้ถามเกี่ยวกับการพัฒนาด้านการ แต่จากมุมมองของผู้ใช้ บางทีฉันต้องทำให้ชัดเจนยิ่งขึ้น;)
Izzy

1
เบื่อ? ใครช่วยกรุณาอธิบายสิ่งที่เป็นเช่นนั้น? XD ไม่ฉันมีบางสิ่งในใจเสมอ ถ้าฉันรู้สึกว่ามันดีพอฉันจะถามเรื่องนี้ที่นี่ (ดูโปรไฟล์ของฉัน: ฉันไม่ได้ถามบ่อย) แม้ว่าฉันอาจมีคำตอบ (บางส่วน) ข้อเสนอแนะที่นี่มีการรีเฟรชอยู่เสมอหากคำถามมีค่า :)
อิซซี่

1
กรุณาทำ! และรายงานสิ่งที่คุณค้นพบ! ฉันเพิ่งมีปัญหาที่อธิบายไว้กับ WakeLocks "กำพร้า" poking รอบสำหรับชั่วโมงฉันไม่ได้มากไปกว่าที่เห็นมันเป็นLocationManagerService ลงทะเบียนเพื่อรับการอัปเดตทั้งหมด 0 วินาที (sic!) คือการตั้งค่า Android (=: - 0) ฉันออกจากมันหยุดมันฆ่ามันที่บรรทัดคำสั่ง ... ไม่มีทางที่จะกำจัดล็อค การตั้งค่า WTF ทำที่นั่นหรือไม่? แน่นอนว่าการรีบูตได้แก้ไขแล้ว - แต่นี่เป็น WindowsPhone หรือไม่ที่เราต้องรีบูตสองครั้งต่อวัน?
อิซซี

6

ในระยะสั้นนี่เป็นคำถามที่ดีมาก แต่ก็กลัวมันรับประกันมากกว่าแค่การทำให้ผู้ใช้รู้ตัว!

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

น่าเสียดายที่มันได้รับการยอมรับว่าเป็นโซลูชันแบบพฤตินัยเพื่อเปิดใช้งาน "การจัดการพลังงาน" แม้ว่าจะไม่ได้มีประสิทธิภาพเหมือนกัน! มีการอภิปรายอย่างกว้างขวางเกี่ยวกับ wakelocks เป็น (- กูรูลินุกซ์สำหรับการพัฒนาไดรเวอร์ - กับ Gregh Kroah ฮาร์ทแมนกำลัง googling สำหรับสายแน่นอน) เว็บไซต์อื่น ๆ เช่นLWN.netและบทความอื่นอธิบายในเว็บไซต์เดียวกันที่นี่ นี่คือบทความ Gregh Kroah Hartman ที่อ้างถึงบล็อกนี้ซึ่งดูเหมือนว่าเขาจะเห็นด้วยกับโซลูชั่นทางเลือกที่เสนอโดยRafael J. Wysockiได้ทำเอกสารเกี่ยวกับทางเลือกที่อาจเกิดขึ้นมากมาย ไม่แน่ใจว่าสิ่งนั้นมีอยู่จริงในเคอร์เนลรุ่นใหม่กว่า v3.xx หรือไม่

แอปที่ออกแบบมาไม่ดีและมักจะร้องขอ wakelocks เช่นเปิดหน้าจอไว้ แต่ในความเป็นจริงในสถานการณ์นี้เพื่อเปิดหน้าจอในความเป็นจริงมีวิธีที่มีประสิทธิภาพมากขึ้น:

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

ในขณะที่การพยายามทำให้ชัดเจนของศัพท์แสง ฯลฯ สำหรับผู้ใช้จริง ๆ แล้วหลักของปัญหาเดือดลงรหัสเคอร์เนลในวิธีจัดการ wakelocks

นี่คือบทสรุปสั้น ๆ เกี่ยวกับXDAเกี่ยวกับสิ่งที่เกิดขึ้นสำหรับมือใหม่ โดยใช้BetterBatteryStatsใครจะเห็นว่ากระบวนการที่การระบายน้ำแบตเตอรี่, วิกิพีเดียโฮสต์บน GitHub และสามารถใช้ได้ในตลาดที่นี่


1
ตลกคุณชี้ไปที่เธรด XDA เดียวกันที่ฉันพูดถึง ฉันเห็นด้วยกับคุณว่าระบบควรใช้ความระมัดระวังมากขึ้น (เช่นโดยการปล่อย WakeLocks ที่ร้องขอโดยแอพที่ไม่ได้ทำงาน) และผู้พัฒนาควรใช้ความระมัดระวังในการเขียนโค้ด (โดยการปล่อยพวกเขาอย่างชัดเจนในสถานะที่เหมาะสมของวงจรชีวิต) แต่นั่นไม่ได้ช่วยให้เราผู้ใช้ทราบ ฉันหวังว่าคำตอบของฉันจะให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่ผู้ใช้สามารถทำได้ - และ "นักเทคโนโลยี" คนใดคนหนึ่งของคุณสามารถเติมเต็มช่องว่างได้!
Izzy

3

ลองใช้Wakelock Detector: XDA-Developers / Google Play :

เครื่องตรวจจับ Wakelock จัดกลุ่มแอปพลิเคชัน wakelocks ไว้ในมุมมองเดียวที่ขยายได้เพื่อให้ดูดีขึ้น และมันแสดงว่าแอพใดกำลังทำงานอยู่ และมีปุ่มข้อมูลยกเลิกการติดตั้งในมุมมองที่กว้างขึ้นของแอพ

Wakelock Detector: รายละเอียดแอพ Wakelock Detector: เลือกกระบวนการ
คลิกที่ภาพเพื่อขยาย (ที่มา: Google Play )

การเปิดเผยข้อมูล: ฉันเป็นหนึ่งในนักพัฒนาที่รับผิดชอบสำหรับแอพนี้ มีเพื่อนอีกสี่คนที่ทำงานโครงการนี้เป็นงานอดิเรก


ขอขอบคุณ! นั่นเป็นข้อมูลที่มีค่าอย่างแน่นอน คุณคิดจะเพิ่มรายละเอียดเพิ่มเติมในคำตอบของคุณเช่นอะไรทำให้เป็นพิเศษ? ฉันจะเพิ่มภาพหน้าจอบางส่วนแล้ว จนกว่าจะเสร็จสิ้น: นี่คือลิงก์ Playstore ไปยังแอป ...
Izzy

ขอบคุณสำหรับรายละเอียด! ฉันรวมพวกมันเข้ากับคำตอบของคุณฉันหวังว่าคุณจะไม่รังเกียจ :) คำถามที่เข้าใจ: พูดแอปสอบถามตำแหน่งโดยใช้ช่วงเวลา "0 วินาที" สิ่งนี้จะทำให้LocationServiceทำการปลุกอุปกรณ์ จะล็อคปลุกตรวจจับการแสดงแอปพลิเครับผิดชอบแล้วเป็นสาเหตุที่แท้จริง - หรือLocationServiceเป็นมันไม่เป็นส่วนหนึ่งของแพคเกจปพลิเคชันที่?
Izzy

คำตอบสำหรับคำถามของคุณคือ 'ไม่' เนื่องจากกลุ่มตัวตรวจจับ wakelock เป็นกลุ่มที่อยู่ในแอพพลิเคชั่นเดียวกัน เนื่องจากบริการระบุตำแหน่งเป็นของระบบปฏิบัติการ Android โซลูชันจะตรวจสอบสิทธิ์ผู้ใช้ของแอป
UzumApps

ขอบคุณมาก! ฉันหวังว่าจะเป็นทางออกที่ง่ายสำหรับ "จะเกิดอะไรขึ้นถ้ามันเป็นระบบ Android เอง" ส่วนหนึ่ง ดูเหมือนจะไม่มีสิ่งนั้น - แต่ถ้าเป็นไปได้มันอาจจะเป็นความคิดที่ดีที่จะรวมเข้ากับ WLD :)
อิซซี

2
ขอบคุณสำหรับความคิดเห็นของคุณฉันจะพิจารณาและดำเนินการต่อไป WLD ดูดี !!! :)
UzumApps

1

สองสามวิธีที่จะช่วยผู้ใช้อุปกรณ์ที่ไม่ได้รูท

  1. เมื่อเห็นว่า @Uzumapps หนึ่งในผู้พัฒนาแอปได้โพสต์โซลูชันโดยใช้เครื่องตรวจจับ Wakelock ( WLD ) ฉันประหลาดใจที่เขาไม่ได้อัปเดตเกี่ยวกับการใช้งานแอปซึ่งสามารถใช้งานได้โดยไม่ต้องใช้รากที่เรียกว่า Wakelock Detector Light ! ฉันค้นพบสิ่งนี้เพื่อค้นหาวิธีแก้ปัญหาสำหรับอุปกรณ์ใหม่ของฉัน

นี่คือการพัฒนาเมื่อเร็ว ๆ นี้และโพสต์สิ่งนี้สำหรับผู้ใช้อุปกรณ์ที่ไม่ได้หยั่งราก ผ่านการทดสอบว่าทำงานกับ Moto X Play (Android 6.0.1)

  • ดาวน์โหลด WLD จากลิงก์ Play store ด้านบน

  • คู่มือการใช้งาน WLD ที่นี่

  • คำแนะนำสำหรับอุปกรณ์ที่ไม่ได้รูทที่นี่ มันมีรายละเอียดทั้งหมด แต่เพื่อสรุป:

    adb shell dumpsys power | grep -i partial_wake_lock

หมายเหตุ:ฉันไม่สามารถใช้วิธีที่สองทำงานได้ยินดีต้อนรับวิธีแก้ไขในการทำให้มันใช้ได้สำหรับคนที่ไม่เข้าใจอย่างฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.