Bagaimana cara menangani WakeLocks (yatim)?

40

Saya kira sebagian besar dari Anda setidaknya pernah mendengar tentang WakeLocks . Banyak dari Anda sudah mengalaminya - apakah dengan sadar atau tidak. Beberapa orang mungkin tahu bagaimana menghadapinya secara umum - tetapi hanya sedikit yang tahu bagaimana menghadapi "kandidat yang lebih rumit".

Bagi mereka yang tidak tahu, meskipun tautan di atas mengarah ke penjelasan, ringkasan singkat: Aplikasi dapat meminta WAKE_LOCKuntuk menjaga komponen perangkat dari "tidur", sehingga mereka dapat melakukan tugas bahkan ketika layar dimatikan. Ini sangat berguna dalam banyak kasus (mis. Menjaga layar menyala saat bernavigasi, menjaga WiFi aktif untuk mengalirkan musik) - tetapi digunakan dengan cara yang salah, ini menyebabkan baterai Anda terkuras dalam jangka pendek (hingga 25% per jam) .

Sering kali mudah untuk mengidentifikasi sumbernya (biasanya aplikasi berperilaku buruk) - Saya akan menunjukkan ini dalam jawaban di bawah, karena mungkin terbukti bermanfaat bagi banyak pengguna. Tapi apa yang harus dilakukan jika aplikasi yang meminta WakeLock keluar tanpa melepaskannya? Sistem Android tidak akan menanganinya . Tentu, reboot akan menyelesaikan masalah - tetapi ini tidak selalu merupakan opsi (yang diinginkan).

Jadi, dari perspektif pengguna (saya tidak bertanya tentang solusi pengembangan, tetapi bagaimana pengguna dapat menangani hal-hal):

Apa yang bisa dilakukan * oleh pengguna * untuk menyelesaikan masalah dan menghindari pengurasan baterai lebih lanjut?

Saya lebih suka jawaban yang tidak melibatkan root (sehingga semua pengguna dapat memperoleh manfaat darinya). Namun, "solusi yang di-rooting" sepenuhnya valid dan selamat datang.

Izzy
sumber
2
Saya mendapat kesan bahwa ini hanya benar jika Anda membuat wakelock dengan cara "salah", dengan menggunakan /sys/power/wake_lock, tetapi bahwa jika Anda melakukannya dengan cara "benar" menggunakan PowerManager dan PowerManager.WakeLock, layanan keduanya akan memegang wakelock asli dan lepaskan bahkan jika proses Anda terbunuh ...
Izkata
1
Menurut informasi yang saya tautkan, itu jelas bukan masalahnya. Seseorang melaporkan di sana setelah memeriksa sumber kernel, dan tidak menemukan petunjuk apa pun untuk itu. Petunjuk untuk pengembang: sepertinya "wakelocks parsial" dapat diminta dengan batas waktu , sehingga mereka akan kedaluwarsa secara otomatis ketika timer menyala dan wakelock yang diminta tidak disegarkan. Itu pasti "cara aman" yang Anda rujuk.
Izzy

Jawaban:

37

Bagaimana saya bisa tahu saya terpengaruh?

Ini mungkin pertanyaan pertama bagi mereka yang tidak terbiasa dengan topik ini. Dengan Gingerbread (Android 2.3) dan di atasnya, Anda memiliki layanan yang membantu Anda mengetahui: statistik baterai. Meskipun produsen cenderung menempatkannya di titik yang berbeda, sebagian besar ditemukan di Pengaturan → Tentang telepon → Baterai atau yang serupa, dan menunjukkan daftar aplikasi yang telah menggunakan sebagian besar baterai Anda. Di atas itu adalah grafik kecil. Ketuk itu, dan itu membawa Anda ke layar yang mirip dengan ini:

statistik baterai
Tangkapan layar statistik baterai di Android 2.3

Saya memilih tangkapan layar dari salah satu perangkat saya yang menggambarkan masalah ini. Melihat dua bilah biru bawah ("Aktiv" = Perangkat tetap terjaga (aktif), "Bildschirm an" = "Layar menyala"), bilah biru paling kanan pada "Aktiv" menunjukkan WakeLock: Perangkat tetap sibuk meskipun fakta layar dimatikan. Jadi dengan ini kita bisa sangat yakin kita punya WakeLock - tetapi kita tidak tahu siapa yang menyebabkannya.

Jika perangkat Anda tidak menawarkan layar ini (atau bilah di bagian bawah: Saya baru saja menemukan misalnya LG Optimus 4X yang menjalankan Android 4.0.3 telah memotong bilah ini), Anda dapat menemukannya misalnya menggunakan Monitor Baterai GSam :

Monitor Baterai GSam
Informasi serupa dari Monitor Baterai GSam - di sini "bilah biru" berwarna kuning / oranye

Apa yang menyebabkan WakeLock?

Sayangnya, pertanyaan ini tidak dapat dijawab dengan menggunakan aplikasi yang sudah diinstal sebelumnya (kecuali, mungkin, beberapa ROM Kustom). Tetapi ada alat yang tersedia yang bisa. Kandidat yang paling dikenal untuk hal ini adalah BetterBatteryStats , dan menunjukkan penyebabnya di bagian wakelocks parsial :

BetterBatteryStats BetterBatteryStats2
Screenshot dari BetterBatteryStats

Pada contoh pertama 2 (diambil dari halaman playstore aplikasi), acara yang menyebabkan sebagian besar WakeLock adalah yang diinginkan: Kami tidak ingin pemutaran dihentikan saat mendengarkan musik. Jadi contoh kedua 3 (diambil dari kasing nyata di salah satu perangkat saya) mungkin terbukti lebih baik: 3 peristiwa teratas disebabkan oleh aplikasi yang sama, yang membutuhkan WakeLock untuk menjaga layanan push IMAP aktif.

Untuk alternatif dari BetterBatteryStats , periksa aplikasi Wakelock Detector yang disebutkan dalam jawaban UzumApps ' - yang tampaknya lebih mudah ditangani terutama untuk non-teknisi:

Wakelock Detector: Detail aplikasi Detektor Wakelock: Pilih proses
Wakelock Detector - Klik gambar untuk memperbesar. (Sumber: Google Play )

Apa yang bisa dilakukan?

Jika kasusnya sejelas pada contoh kedua di bagian sebelumnya, tindakannya cukup jelas - setidaknya dalam kasus saya: Saya tidak perlu segera diberitahu ketika email datang; keterlambatan 30 menit benar-benar dapat diterima. Jadi saya masuk ke aplikasi email, menonaktifkan IMAP Push (lihat juga: Push Email ), dan sebagai gantinya beralih ke interval jajak pendapat 30 menit. WakeLocks tidak sepenuhnya hilang, tetapi turun drastis - daya tahan baterai meningkat secara nyata.

Lalu ada kasus yang disebutkan dalam pertanyaan itu sendiri: Aplikasi berperilaku buruk tidak melepaskan WakeLock-nya. Hadapi dev dengan temuan Anda dan minta diperbaiki. Jika dia memberikan: masalah terpecahkan. Jika tidak: Hampir selalu ada aplikasi alternatif yang tersedia.

Bagaimana jika itu adalah Sistem Android itu sendiri?

Ya, terkadang hanya seperti itu: 98% atau lebih dikonsumsi oleh beberapa layanan Android. Oh, jika 98%, dalam banyak kasus kandidat dinamai LocationManagerService . Orang jahat memata-matai kita? Belum tentu. Dalam kasus khusus ini, "orang jahat" yang terdaftar bahkan tidak bersalah - setidaknya tidak secara langsung. Ini dia aplikasi lain yang terlalu sering meminta lokasi saat ini. Ada artikel yang bagus di Setera.org tentang ini: Menentukan lokasi LocationManagerService baterai Android dengan tepat . Untuk memberikan abstrak: Ini menggunakan Androiddumpsysfitur (memerlukan root!) untuk membuang status sistem, dan memungkinkan Anda menyelidiki pendengar yang dibuat untuk LocationManagerService. Melihat lebih dekat pada konfigurasi mereka menunjukkan yang terus-menerus "memalu" untuk info lokasi (beberapa melakukannya secara permanen, yaitu tanpa istirahat). Ketika ID aplikasi terdaftar, dan di tempat lain di tempat sampah bahkan bersama dengan nama teknis aplikasi, Anda masih dapat mengidentifikasi dan mengambil tindakan yang sesuai.

Dan bagaimana dengan UFO?

Sayangnya, ada seperti: Aplikasi yang mendaftarkan WakeLock - dan kemudian keluar tanpa melepaskannya. Apa yang tersisa adalah * Obliolet yang Tidak Digunakan * - WakeLock tidak digunakan. Jadi tidak ada cara untuk hanya membawa aplikasi ke latar depan dan mengkonfigurasi ulang, atau membuatnya melepaskan WakeLocks-nya.

Di sini satu-satunya solusi yang saya kenal adalah reboot - dan saya ingin memiliki solusi yang lebih baik. Tentu saja, jika Anda mengetahui aplikasi yang bersalah, langkah-langkahnya sama seperti di atas: beri tahu dev, dapatkan perbaikan - atau ganti aplikasi. Tetapi tentang menyingkirkan WakeLock saat ini ? Mungkin orang lain bisa memberikan alternatif yang lebih baik untuk reboot?

Apakah ada beberapa bacaan lanjutan yang disarankan?

Yakin. Satu untuk saat ini, saya dapat menambahkan lebih banyak nanti:

Izzy
sumber
2
Pendidikan yang lebih baik bagi pengembang untuk mengatakan ... "Lepaskan wakelocks ketika Anda selesai dengan mereka dan bersihkan diri Anda sendiri"?
t0mm13b
3
Suara positif dari saya untuk jawaban Anda yang selalu menakjubkan !!! Anda tidak pernah bosan dengan ini kan? : D
t0mm13b
2
Tentu - tetapi lihat pertanyaan saya: Saya secara eksplisit TIDAK bertanya tentang sisi pengembang, tetapi dari perspektif pengguna . Mungkin aku harus membuatnya lebih jelas;)
Izzy
1
Bosan? Bisakah seseorang menjelaskan seperti apa itu? XD Tidak, saya selalu memiliki sesuatu di pikiran saya. Jika saya merasa sudah cukup baik, saya bahkan bertanya di sini (lihat profil saya: Saya tidak sering bertanya), meskipun saya mungkin punya jawaban (sebagian). Umpan balik di sini selalu menyegarkan jika pertanyaannya sepadan :)
Izzy
1
Silakan lakukan! Dan laporkan temuan Anda! Saya baru saja mengalami masalah yang dijelaskan dengan WakeLocks "yatim". Mengaduk-aduk selama satu jam, saya tidak mendapatkan lebih jauh daripada melihat itu adalah LocationManagerService . Terdaftar untuk pembaruan, semua 0sec (sic!) Adalah Pengaturan Android (=: - 0). Saya keluar, menghentikannya, membunuhnya di baris perintah ... tidak ada cara untuk menghilangkan kunci. WTF melakukan Pengaturan di sana? Tentu saja reboot dimulai - tetapi apakah ini WindowsPhone yang harus kita reboot dua kali sehari?
Izzy
6

Singkatnya, ini adalah pertanyaan yang sangat bagus tetapi saya khawatir, ini menjamin lebih dari sekedar membuat pengguna akhir sadar!

Mendesain ulang kernel untuk menghilangkan wake-lock dan menggunakan cara efisien yang lebih teliti dalam mengelola prinsip dengan lebih baik sehingga memperpanjang usia baterai.

Sayangnya, itu telah diterima sebagai solusi de-facto untuk memungkinkan "manajemen daya" meskipun tidak tepat efisien juga! Ada diskusi yang luas tentang wakelocks (dengan Gregh Kroah Hartman - guru Linux untuk pengembangan driver - saya googling untuk linky yang tepat), situs lain seperti LWN.net dan artikel lain dijelaskan di situs yang sama di sini . Ini adalah artikel yang disebutkan oleh Gregh Kroah Hartman di blog ini , di mana ia tampaknya setuju dengan solusi alternatif yang diusulkan oleh Rafael J. Wysocki telah banyak mendokumentasikan tentang alternatif potensial. Tidak yakin apakah itu benar-benar ada di kernel v3.xx yang lebih modern

Aplikasi yang dirancang dengan buruk dapat dan sering meminta wakelocks seperti menjaga layar tetap menyala, tetapi pada kenyataannya, dalam skenario ini untuk menjaga layar tetap menyala, sebenarnya ada cara yang lebih efisien untuk melakukan ini:

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

Sementara itu, berusaha untuk menjaga jargon dll untuk pengguna akhir, benar-benar inti masalah bermuara pada kode kernel dalam bagaimana wakelocks dikelola.

Berikut ini adalah ringkasan singkat tentang XDA tentang apa yang wakelocks untuk yang belum tahu. Dengan menggunakan BetterBatteryStats , orang dapat melihat proses mana yang menghabiskan baterai, wiki di-host di github, dan tersedia di pasaran di sini .

t0mm13b
sumber
1
Lucu Anda menunjuk ke thread XDA yang sama yang saya sebutkan. Saya setuju dengan Anda bahwa sistem harus lebih berhati-hati (misalnya dengan merilis WakeLocks yang diminta oleh aplikasi yang tidak lagi berjalan). Dan bahwa pengembang harus lebih berhati-hati dalam pengkodean (dengan secara eksplisit melepaskan mereka pada status yang sesuai dari LifeCycle). Tapi itu tidak membantu kami pengguna tahu . Saya harap jawaban saya memberikan beberapa wawasan tentang apa yang dapat dilakukan pengguna - dan bahwa salah satu dari Anda "teknisi" dapat mengisi kekosongan yang tersisa!
Izzy
3

Lihat Wakelock Detector: XDA-Developers / Google Play :

Detektor Wakelock mengelompokkan wakelocks aplikasi menjadi satu tampilan yang dapat diperluas untuk tampilan yang lebih baik. Dan itu menunjukkan aplikasi mana yang sedang berjalan. Dan ada tombol bunuh hapus info dalam tampilan aplikasi yang diperluas.

Wakelock Detector: Detail aplikasi Detektor Wakelock: Pilih proses
Klik gambar untuk memperbesar. (Sumber: Google Play )

Pengungkapan: Saya adalah salah satu pengembang yang bertanggung jawab untuk aplikasi ini. Empat teman lagi bersama saya mengerjakan proyek ini sebagai hobi.

UzumApps
sumber
Terima kasih! Itu memang informasi yang berharga. Maukah Anda menambahkan beberapa detail lagi ke jawaban Anda, mis. Apa yang membuatnya begitu istimewa? Saya akan menambahkan beberapa screenshot kemudian. Sampai selesai: Ini tautan Playstore ke aplikasi ...
Izzy
Terima kasih atas detailnya! Saya menggabungkannya ke dalam jawaban Anda, saya harap Anda tidak keberatan :) Pertanyaan pemahaman: Ucapkan aplikasi menanyakan lokasi menggunakan interval "0 detik". Ini akan menyebabkan LocationService menggerakkan perangkat. Apakah Wake Lock Detector menunjukkan aplikasi yang bertanggung jawab sebagai penyebab sebenarnya - atau LocationService , karena itu bukan bagian dari paket aplikasi itu?
Izzy
Jawaban untuk pertanyaan Anda adalah 'tidak' karena kelompok pendeteksi wakelock wakelock yang termasuk dalam paket nama aplikasi yang sama. Karena Layanan Lokasi adalah milik os android, solusinya akan memeriksa izin pengguna aplikasi
UzumApps
Terima kasih banyak! Saya berharap untuk solusi mudah untuk "Bagaimana jika itu adalah Sistem Android itu sendiri?" bagian. Tampaknya tidak ada hal seperti itu - tetapi jika itu mungkin, mungkin ide yang baik untuk berintegrasi dengan WLD :)
Izzy
2
Terima kasih atas pendapat Anda, saya akan mempertimbangkannya dan mengerjakannya. WLD terlihat bagus !!! :)
UzumApps
1

Beberapa cara yang akan membantu pengguna perangkat yang tidak di-unroot

  1. Melihat bahwa @Uzumapps, salah satu pengembang aplikasi telah memposting solusi menggunakan Wakelock Detector ( WLD ), saya terkejut bahwa dia belum memperbarui tentang menggunakan aplikasi yang juga dapat digunakan tanpa root yang disebut Wakelock Detector Light ! Saya menemukan ini mencari solusi untuk perangkat baru saya (tidak dicabut).

Ini adalah perkembangan terbaru dan karenanya memposting ini untuk pengguna perangkat yang tidak di-root. Diuji bekerja di Moto X Play (Android 6.0.1)

  • Unduh WLD dari tautan Play store di atas

  • Manual untuk menggunakan WLD di sini

  • Petunjuk untuk perangkat yang tidak di-rooting di sini . Ini memiliki semua detail kecuali untuk meringkas:

    adb shell dumpsys power | grep -i partial_wake_lock

Catatan: Saya tidak bisa membuat metode kedua bekerja, akan menyambut solusi pengeditan dalam membuatnya berfungsi untuk orang yang tidak mengerti seperti saya

beeshyams
sumber