Làm thế nào để đối phó với WakeLocks (mồ côi)?


40

Tôi đoán hầu hết các bạn ít nhất đã nghe về WakeLocks . Nhiều người trong số các bạn sẽ trải nghiệm chúng - có biết hay không. Một số người có thể biết cách đối phó với họ nói chung - nhưng chỉ có vài người biết cách đối phó với "những ứng cử viên phức tạp hơn".

Đối với những người không biết, mặc dù liên kết ở trên dẫn đến một lời giải thích, một tóm tắt ngắn gọn: Ứng dụng có thể yêu cầu WAKE_LOCKgiữ cho một thành phần thiết bị không "ngủ", để chúng có thể thực hiện một tác vụ ngay cả khi màn hình tắt. Điều này rất hữu ích trong hầu hết các trường hợp (ví dụ: giữ màn hình trong khi điều hướng, giữ WiFi hoạt động để phát nhạc) - nhưng được sử dụng sai cách, nó khiến pin của bạn bị cạn kiệt trong thời gian ngắn (lên tới 25% mỗi giờ) .

Hầu hết các lần đều dễ dàng xác định nguồn (thường là ứng dụng có hành vi xấu) - Tôi sẽ trình bày điều này trong câu trả lời dưới đây, vì nó có thể chứng minh hữu ích cho nhiều người dùng. Nhưng phải làm gì nếu ứng dụng yêu cầu WakeLock thoát mà không giải phóng nó? Hệ thống Android sẽ không chăm sóc nó . Chắc chắn, khởi động lại sẽ giải quyết vấn đề - nhưng nó không phải luôn luôn là một tùy chọn (mong muốn).

Vì vậy, từ góc độ người dùng (tôi không hỏi về các giải pháp phát triển, nhưng làm thế nào người dùng có thể xử lý mọi việc):

Người dùng có thể làm gì * để giải quyết vấn đề và tránh hao pin thêm?

Tôi thích câu trả lời không liên quan đến root (vì vậy tất cả người dùng có thể hưởng lợi từ nó). Tuy nhiên, "giải pháp gốc" là hoàn toàn hợp lệ và cũng được hoan nghênh.


2
Tôi có ấn tượng rằng điều này chỉ đúng nếu bạn tạo wakelock theo cách "sai", bằng cách sử dụng /sys/power/wake_lock, nhưng nếu bạn đã làm theo cách "đúng" bằng PowerManager và PowerManager.WakeLock, dịch vụ sẽ giữ cả wakelock thực và giải phóng nó ngay cả khi quy trình của bạn bị giết ...
Izkata

1
Theo thông tin tôi liên kết, rõ ràng không phải vậy. Ai đó báo cáo rằng đã kiểm tra các nguồn kernel và không tìm thấy bất kỳ gợi ý nào cho điều đó. Gợi ý cho các nhà phát triển: có vẻ như "wakelocks một phần" có thể được yêu cầu tính thời gian , do đó, chúng sẽ tự động hết hạn khi bộ đếm thời gian và hồ thủy sinh không được làm mới. Đó phải là "cách an toàn" mà bạn đề cập đến.
Izzy

Câu trả lời:


37

Làm thế nào tôi có thể nói tôi bị ảnh hưởng?

Đây có lẽ là câu hỏi đầu tiên cho những người không quen thuộc với chủ đề này. Với Gingerbread (Android 2.3) trở lên, bạn đã có một dịch vụ trên tàu giúp bạn tìm ra: thống kê pin. Mặc dù các nhà sản xuất có xu hướng đặt nó ở các điểm khác nhau, nhưng nó chủ yếu được tìm thấy trong Cài đặt → Giới thiệu về điện thoại → Pin hoặc tương tự và hiển thị danh sách các ứng dụng đã sử dụng hầu hết pin của bạn. Trên đó là một biểu đồ nhỏ. Nhấn vào đó và nó đưa bạn đến một màn hình tương tự như màn hình này:

số liệu thống kê pin
Ảnh chụp màn hình thống kê pin trên Android 2.3

Tôi đã chọn một ảnh chụp màn hình từ một trong các thiết bị của mình để minh họa vấn đề này. Nhìn vào hai thanh màu xanh lam thấp hơn ("Ak kích hoạt" = Thiết bị được giữ tỉnh táo (hoạt động), "Bildsch xác nhận" = "Màn hình bật"), thanh màu xanh lam bên phải nhất trên "Ak kích hoạt" biểu thị WakeLock: Thiết bị vẫn được giữ mặc dù thực tế màn hình đã bị tắt Vì vậy, bằng cách này, chúng tôi có thể khá chắc chắn rằng chúng tôi đã có WakeLock - nhưng chúng tôi không thể biết ai đã gây ra nó.

Nếu thiết bị của bạn không cung cấp màn hình này (hoặc các thanh ở phía dưới: Tôi mới phát hiện ra, ví dụ như LG Optimus 4X chạy Android 4.0.3 đã cắt các thanh này), bạn có thể tìm thấy chúng, ví dụ như sử dụng Trình theo dõi pin của GSam :

Màn hình pin GSam
Thông tin tương tự từ GSam Battery Monitor - ở đây các "thanh màu xanh" được đề cập có màu vàng / cam

Điều gì gây ra WakeLock?

Thật không may, câu hỏi này không thể được trả lời bằng các ứng dụng được cài đặt sẵn (ngoại trừ, có thể, một số ROM tùy chỉnh). Nhưng có những công cụ có sẵn. Ứng cử viên nổi tiếng nhất cho điều này là BetterBatteryStats và cho chúng ta thấy nguyên nhân trong phần wakelocks một phần của nó :

BetterBatteryStats BetterBatteryStats2
Ảnh chụp màn hình từ BetterBatteryStats

Trong ví dụ đầu tiên 2 (được lấy từ trang playstore của ứng dụng), sự kiện gây ra hầu hết WakeLocks là một điều mong muốn: Chúng tôi không muốn phát lại bị dừng khi nghe nhạc. Vì vậy, ví dụ thứ hai 3 (được lấy từ một trường hợp thực tế trên một trong các thiết bị của tôi) có thể chứng minh rõ hơn: 3 sự kiện trên cùng được gây ra bởi cùng một ứng dụng, cần WakeLock để duy trì dịch vụ đẩy IMAP.

Để thay thế cho BetterBatteryStats , hãy xem ứng dụng Wakelock dò được đề cập trong câu trả lời của UzumApps - có vẻ dễ xử lý hơn, đặc biệt là đối với những người không chuyên về công nghệ:

Wakelock dò: Chi tiết ứng dụng Máy dò Wakelock: Chọn quy trình
Máy dò Wakelock - Bấm vào hình ảnh để phóng to. (Nguồn: Google Play )

Những gì có thể được thực hiện?

Nếu trường hợp rõ ràng như trong ví dụ thứ hai trong phần trước, thì hành động này khá rõ ràng - ít nhất là trong trường hợp của tôi: Tôi không cần phải được thông báo ngay lập tức khi có thư đến; độ trễ 30 phút là hoàn toàn chấp nhận được. Vì vậy, tôi đã truy cập vào ứng dụng thư, đã vô hiệu hóa IMAP Push (xem thêm: Email đẩy ) và thay vào đó chuyển sang khoảng thời gian thăm dò 30 phút. WakeLocks không hoàn toàn biến mất, nhưng giảm đáng kể - thời lượng pin được cải thiện rõ rệt.

Sau đó, có trường hợp được đề cập trong chính câu hỏi: Một ứng dụng có hành vi xấu không phát hành WakeLock. Đối đầu với nhà phát triển với những phát hiện của bạn và yêu cầu sửa chữa. Nếu anh ấy giao hàng: vấn đề được giải quyết. Nếu không: Hầu như luôn có sẵn một ứng dụng thay thế.

Nếu đó là Hệ thống Android thì sao?

Vâng, đôi khi có vẻ như vậy: 98% trở lên được tiêu thụ bởi một số dịch vụ Android. Ồ, nếu nó là 98%, trong hầu hết các trường hợp, ứng cử viên được đặt tên là LocationManagerService . Kẻ xấu làm gián điệp cho chúng tôi? Không cần thiết. Trong trường hợp đặc biệt này, "kẻ xấu" được liệt kê thậm chí không có tội - ít nhất là không trực tiếp. Đây là một ứng dụng khác yêu cầu vị trí hiện tại quá thường xuyên. Có một bài viết tuyệt vời trên Setera.org về điều này: Xác định mức tiêu hao pin của Android LocationManagerService . Để đưa ra một bản tóm tắt: Nó sử dụng Androiddumpsystính năng (yêu cầu root!) để kết xuất trạng thái hệ thống và cho phép bạn điều tra các trình nghe được thiết lập cho LocationManagerService. Nhìn kỹ hơn vào cấu hình của chúng cho thấy liên tục "đánh võng" nó để biết thông tin vị trí (một số làm như vậy vĩnh viễn, tức là không nghỉ). Vì ID của ứng dụng được liệt kê cùng và tại một nơi khác trong bãi chứa thậm chí cùng với tên kỹ thuật của ứng dụng, bạn vẫn có thể xác định nó và thực hiện các hành động thích hợp.

Còn UFO thì sao?

Thật không may, có những thứ như vậy: Các ứng dụng đã đăng ký WakeLock - và sau đó thoát ra mà không phát hành nó. Những gì còn lại là * Không sử dụng F *** ing Obsoletes * - WakeLocks bị giữ không sử dụng. Vì vậy, không có cách nào đơn giản là đưa ứng dụng lên nền trước và định cấu hình lại hoặc làm cho nó phát hành WakeLocks.

Ở đây, giải pháp duy nhất được biết đến với tôi là khởi động lại - và tôi muốn có một giải pháp tốt hơn. Tất nhiên, nếu bạn biết ứng dụng có tội, các bước liên quan đến nó cũng giống như trên: thông báo cho nhà phát triển, nhận sửa chữa - hoặc thay thế ứng dụng. Nhưng về việc thoát khỏi WakeLock hiện tại ? Có lẽ ai đó khác có thể cung cấp một sự thay thế tốt hơn để khởi động lại?

Có một số bài đọc thêm đề nghị?

Chắc chắn rồi. Một cho bây giờ, tôi có thể thêm sau:


2
Giáo dục tốt hơn cho các nhà phát triển để nói ... "Giải phóng wakelocks khi bạn hoàn thành với chúng và tự dọn dẹp"?
t0mm13b

3
Upvote từ tôi cho câu trả lời luôn luôn tuyệt đẹp của bạn !!! Bạn không bao giờ chán việc này phải không? : D
t0mm13b

2
Chắc chắn - nhưng hãy xem câu hỏi của tôi: Tôi rõ ràng KHÔNG hỏi về phía nhà phát triển, nhưng từ góc độ người dùng . Có lẽ tôi cần phải làm cho điều đó rõ ràng hơn;)
Izzy

1
Chán? Ai đó có thể vui lòng giải thích điều đó là như thế nào? XD Không, tôi luôn có một cái gì đó trong tâm trí của tôi. Nếu tôi cảm thấy nó đủ tốt, tôi thậm chí hỏi về nó ở đây (xem hồ sơ của tôi: tôi không hỏi thường xuyên), mặc dù tôi có thể có câu trả lời (một phần). Phản hồi ở đây luôn được làm mới nếu câu hỏi có giá trị :)
Izzy

1
Vui lòng làm! Và báo cáo kết quả của bạn! Tôi chỉ có vấn đề được mô tả với WakeLocks "mồ côi". Trêu chọc trong một giờ, tôi đã không nhận được nhiều hơn là thấy đó là LocationManagerService . Đã đăng ký để cập nhật tất cả 0 giây (sic!) Là Cài đặt Android (=: - 0). Tôi đã thoát ra, ngăn chặn nó, giết nó tại dòng lệnh ... không cách nào thoát khỏi ổ khóa. WTF đã làm Cài đặt ở đó? Một khởi động lại đã giải quyết nó, tất nhiên - nhưng đây có phải là WindowsPhone chúng ta phải khởi động lại hai lần một ngày?
Izzy

6

Nói tóm lại, đây là một câu hỏi rất hay nhưng tôi sợ, nó đảm bảo nhiều hơn là chỉ khiến người dùng cuối nhận thức được!

Thiết kế lại kernel để loại bỏ khóa thức và sử dụng cách hiệu quả triệt để hơn để quản lý nguyên tắc tốt hơn do đó kéo dài tuổi thọ pin.

Thật không may, nó đã được chấp nhận như một giải pháp thực tế để cho phép "quản lý năng lượng" mặc dù nó cũng không thực sự hiệu quả! Đã có một cuộc thảo luận rộng rãi về wakelocks (với Gregh Kroah Hartman - chuyên gia phát triển trình điều khiển Linux - đang tìm kiếm sự liên kết chính xác), các trang web khác như LWN.net và một bài viết khác được giải thích trên cùng một trang web ở đây . Đây là bài báo Gregh Kroah Hartman đã đề cập đến blog này , trong đó ông dường như đồng ý với giải pháp thay thế được đề xuất bởi Rafael J. Wysocki đã ghi lại rất nhiều về giải pháp thay thế tiềm năng. Tôi không chắc chắn nếu điều đó thực sự được đặt ra trong kernel v3.xx hiện đại hơn

Các ứng dụng được thiết kế xấu có thể và thường yêu cầu các wakelocks như giữ màn hình, nhưng trên thực tế, trong trường hợp này để giữ màn hình, trên thực tế, có một cách hiệu quả hơn để làm điều này:

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

Trong khi, cố gắng để loại bỏ biệt ngữ này, v.v. cho người dùng cuối, thực sự cốt lõi của vấn đề sẽ giải quyết mã hạt nhân trong cách quản lý wakelocks.

Dưới đây là một bản tóm tắt ngắn gọn về XDA về wakelocks dành cho người không quen biết. Bằng cách sử dụng BetterBatteryStats , người ta có thể thấy chính xác quá trình nào đang làm cạn kiệt pin, wiki được lưu trữ trên github và có sẵn trên thị trường ở đây .


1
Buồn cười bạn chỉ vào cùng một chủ đề XDA tôi đã đề cập. Tôi đồng ý với bạn rằng hệ thống nên chăm sóc tốt hơn (ví dụ: bằng cách phát hành WakeLocks được yêu cầu bởi các ứng dụng không còn chạy nữa). Và các nhà phát triển nên chăm sóc tốt hơn trong mã hóa (bằng cách phát hành rõ ràng chúng ở các trạng thái thích hợp của LifeCycle). Nhưng điều đó không giúp người dùng chúng ta biết . Tôi hy vọng câu trả lời của tôi cung cấp một số cái nhìn sâu sắc về những gì người dùng có thể làm - và rằng một trong những "kỹ thuật viên" của bạn có thể lấp đầy khoảng trống còn lại!
Izzy

3

Kiểm tra Trình phát hiện Wakelock: XDA-Developers / Google Play :

Máy dò Wakelock nhóm các wakelocks của ứng dụng vào một chế độ xem có thể mở rộng để nhìn rõ hơn. Và nó cho thấy ứng dụng nào đang chạy. Và có các nút thông tin gỡ cài đặt trong chế độ xem mở rộng của ứng dụng.

Wakelock dò: Chi tiết ứng dụng Máy dò Wakelock: Chọn quy trình
Nhấn vào ảnh để phóng to. (Nguồn: Google Play )

Tiết lộ: Tôi là một trong những nhà phát triển có trách nhiệm cho ứng dụng này. Bốn người bạn nữa cùng tôi làm việc trong dự án này như một sở thích.


Cảm ơn bạn! Đó thực sự là một thông tin có giá trị. Bạn có phiền để thêm một số chi tiết cho câu trả lời của bạn, ví dụ điều gì làm cho nó đặc biệt? Tôi sẽ thêm một số ảnh chụp màn hình sau đó. Cho đến khi hoàn thành: Đây là liên kết Playstore tới ứng dụng ...
Izzy

Cảm ơn về những liệt kê chi tiết của bạn! Tôi đã hợp nhất chúng vào câu trả lời của bạn, tôi hy vọng bạn không phiền :) Câu hỏi về sự hiểu biết: Nói một ứng dụng truy vấn vị trí bằng khoảng thời gian "0 giây". Điều này sẽ khiến LocationService đánh thức thiết bị. Sẽ Wake Khóa Detector hiển thị các ứng dụng có trách nhiệm sau đó là nguyên nhân thực sự - hay LocationService , vì nó không phải là một phần của ứng dụng gói?
Izzy

Câu trả lời cho câu hỏi của bạn là 'không' bởi vì nhóm phát hiện wakelock thuộc nhóm wakelocks thuộc cùng một gói ứng dụng. Vì Dịch vụ vị trí thuộc về hệ điều hành Android, giải pháp sẽ kiểm tra quyền của người dùng ứng dụng
UzumApps

Cảm ơn rất nhiều! Tôi đã hy vọng cho một giải pháp dễ dàng cho "Nếu đó là hệ thống Android thì sao?" phần. Có vẻ như không có chuyện đó - nhưng nếu có thể, có thể nên tích hợp với WLD :)
Izzy

2
Cảm ơn ý kiến ​​của bạn, tôi sẽ xem xét nó và làm việc trên đó. Có vẻ tốt !!! :)
UzumApps

1

Một vài cách có thể giúp người dùng thiết bị chưa được đăng ký

  1. Thấy rằng @Uzumapps, một trong những nhà phát triển ứng dụng đã đăng một giải pháp sử dụng Wakelock dò ( WLD ), tôi ngạc nhiên rằng anh ta đã không cập nhật về việc sử dụng ứng dụng cũng có thể được sử dụng mà không cần root có tên là Wakelock dò ánh sáng ! Tôi phát hiện ra điều này để tìm kiếm một giải pháp cho thiết bị mới của tôi (chưa được đăng ký).

Đây là một sự phát triển gần đây và do đó đăng bài này cho người dùng thiết bị chưa được đăng ký. Đã thử nghiệm khi hoạt động trên Moto X Play (Android 6.0.1)

Lưu ý: Tôi không thể làm cho phương thức thứ hai hoạt động, sẽ hoan nghênh giải pháp chỉnh sửa để làm cho nó hoạt động cho những người không hiểu biết như tôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.