(孤立した)WakeLocksに対処する方法は?


40

少なくともほとんどの人はWakeLocksについて聞いたことがあると思います。あなたの多くはすでにそれらを経験しているでしょう-知っているかどうかにかかわらず。一般的にそれらに対処する方法を知っている人もいますが、「より複雑な候補」に対処する方法を知っている人はほとんどいません。

知らない人のために、上記のリンクは説明につながっていますが、簡単な要約:アプリはWAKE_LOCK、デバイスコンポーネントが「スリープ」しないように要求できるため、ディスプレイがオフになっていてもタスクを実行できます。これはほとんどの場合に非常に便利です(たとえば、ナビゲート中に画面をオンにしたまま、音楽をストリーミングするためにWiFiをアクティブにしたままにします)-間違った方法で使用すると、バッテリーが短時間(最大25%/時間)で消耗します。

ほとんどの場合、ソース(通常は動作の悪いアプリ)を特定するのは簡単です。多くのユーザーにとって役立つことがわかるため、以下の回答でこれを示します。しかし、WakeLockを要求したアプリがリリースせずに終了した場合はどうすればよいでしょうか?Androidシステムはそれを処理しません。もちろん、再起動することで問題は解決しますが、常に(望ましい)オプションとは限りません。

したがって、ユーザーの観点からは(開発ソリューションについてではなく、ユーザーがどのように物事を処理できるかを尋ねています):

この問題を解決し、バッテリーの消耗を防ぐために、ユーザーができることは何ですか?

私はルートを含まない回答を好みます(したがって、すべてのユーザーがそれから利益を得ることができます)。ただし、「ルート化ソリューション」も完全に有効であり、歓迎されています。


2
これは、を使用してウェイクロックを「間違った」方法で作成した場合にのみ当てはまるという印象を受けました/sys/power/wake_lockが、PowerManagerとPowerManager.WakeLockを使用して「正しい」方法で作成した場合、サービスは両方とも実際のウェイクロックを保持しますプロセスが
強制終了

1
私がリンクした情報によると、明らかにそうではありません。誰かがカーネルソースをチェックしたと報告しており、それについてのヒントは見つかりませんでした。開発者向けのヒント:「部分的なウェイクロック」はtimedでリクエストできるように思えるので、タイマーがアップし、ウェイクロックの取得が更新されなかったときに自動的に期限切れになります。それはあなたが参照する「安全な方法」でなければなりません。
イジー

回答:


37

どうすれば影響を受けているかわかりますか?

これはおそらく、このトピックに精通していない人にとって最初の質問です。Gingerbread(Android 2.3)以上を使用すると、バッテリー統計情報を把握するのに役立つサービスを利用できます。メーカーはさまざまなポイントに配置する傾向がありますが、ほとんどの場合は[設定]→[携帯電話について]→[バッテリー]などにあり、ほとんどのバッテリーを使用したアプリのリストが表示されます。その上に小さなグラフがあります。それをタップすると、次のような画面が表示されます。

バッテリーの統計
Android 2.3のバッテリー統計のスクリーンショット

問題を示すスクリーンショットをデバイスの1つから選択しました。下の2つの青いバー(「Aktiv」=デバイスは起動状態(アクティブ)、「Bildschirm an」=「スクリーンオン」)を見ると、「Aktiv」の右端の青いバーはWakeLockを示します。画面がオフになったという事実。したがって、これにより、WakeLockを持っていることを確信できますが、誰がそれを引き起こしたのかはわかりません。

お使いのデバイスがこの画面を提供しない場合(または下部のバー:Android 4.0.3を実行しているLG Optimus 4Xがこれらのバーを切断したなど)、GSam Battery Monitorを使用して見つけることができます:

GSamバッテリーモニター
GSam Battery Monitorからの同様の情報-ここで言及された「青いバー」は黄色/オレンジ色です

WakeLockの原因は何ですか?

残念ながら、プリインストールされたアプリを使用してこの質問に答えることはできません(一部のカスタムROMを除く)。しかし、できるツールはあります。最もよく知られている候補はBetterBatteryStatsであり、その部分的なwakelocksセクションで原因を示しています。

BetterBatteryStats BetterBatteryStats2
BetterBatteryStatsのスクリーンショット

最初の例2(アプリのプレイストアページから取得)では、ほとんどのWakeLockを引き起こすイベントは望ましいものでした。音楽を聴いている間、再生を停止させたくありません。したがって、2番目の例3(私のデバイスの1つの実際のケースから取られた)の方が良いかもしれません:一番上の3つのイベントは、同じアプリによって引き起こされます。

BetterBatteryStatsの代替品については、UzumAppsの回答で言及されているWakelock Detectorアプリをチェックしてください。これは、特に技術者以外の方が扱いやすいようです。

Wakelock Detector:アプリの詳細 Wakelock Detector:プロセスの選択
Wakelock Detector-画像をクリックして拡大します。(出典:Google Play

何ができますか?

前のセクションの2番目の例のようにケースが明確な場合、アクションは非常に明白です-少なくとも私の場合:メールが到着したときにすぐに通知する必要はありません。30分の遅延は絶対に許容できます。そこで、メールアプリにアクセスし、IMAPプッシュを無効にし(「プッシュメール」も参照)、代わりに30分のポーリング間隔に切り替えました。WakeLocksは完全に消えたわけではありませんが、著しく低下しました-バッテリー寿命は著しく改善されました。

次に、質問自体で言及されているケースがあります:WakeLockをリリースしない、動作の悪いアプリです。開発者に調査結果を提示し、修正を依頼します。彼が提供する場合:問題は解決しました。そうでない場合:ほとんどの場合、代替アプリが利用可能です。

Androidシステム自体の場合はどうなりますか?

ええ、それは時々それのように見えます:98%以上がAndroidサービスによって消費されています。ああ、98%の場合、ほとんどの場合、候補の名前はLocationManagerServiceです。私たちをスパイしている悪人?必ずしも。この特別な場合、リストされている「悪者」は無罪ですらありません。少なくとも直接ではありません。これは、現在の場所を頻繁に要求する別のアプリです。これに関するSetera.orgの優れた記事があります:Android LocationManagerService battery drainの特定。要約をするには:Androidのdumpsysシステム状態をダンプする機能(rootが必要です!)を使用して、LocationManagerService用に確立されたリスナーを調査できます。構成を詳しく見ると、ロケーション情報のために常に「ハンマー」になっていることがわかります(一部は永続的に、つまり休憩なしで行われます)。アプリのIDは、アプリの技術名とともにダンプ内の別の場所に表示されるため、引き続き識別して適切なアクションを実行できます。

そしてUFOはどうですか?

残念ながら、次のようなものがあります。WakeLockを登録したアプリは、リリースせずに終了しました。残っているのは* Unused F *** ing Obsoletes *-WakeLocksが使用しないために保持されていることです。そのため、単にアプリをフォアグラウンドにして再構成したり、WakeLocksをリリースしたりすることはできません。

ここで私に知られている唯一の解決策は再起動です-そして、私はより良い解決策を持ちたいです。もちろん、有罪アプリを知っている場合、それに関連する手順は上記と同じです。開発者に通知し、修正プログラムを入手し、またはアプリを交換します。しかし、現在の WakeLock を取り除くことについてはどうでしょうか?たぶん他の誰かが再起動のより良い代替手段を提供できるでしょうか?

推奨されるさらなる参考資料はありますか?

はい。とりあえず、あとで追加します。


2
開発者へのより良い教育とは...「完了したらウェイクロックを解除し、自分の後にクリーンアップしますか?」
t0mm13b

3
あなたのいつもの素晴らしい答えに私から賛成!!! あなたはこれに飽きることはありませんか?:D
t0mm13b

2
確かに-しかし、私の質問を参照してください。私は明示していないではなく、開発者側について尋ねるユーザーの視点から。多分私はそれをもっと明らかにする必要があります;)
イジー

1
退屈?誰かがそれがどのようなものか説明してもらえますか?XDいいえ、私は常に私の心に何かを持っています。十分だと思う場合は、ここで質問することもあります(私のプロフィールを参照してください:頻繁に質問することはありません)。質問に価値がある場合、ここのフィードバックは常に
更新され

1
してください!そして、あなたの発見を報告してください!「孤立した」WakeLocksの問題について説明しました。1時間いじってみましたが、LocationManagerServiceであることに気づきました。更新のために登録されたすべて0秒(sic!)は、Android設定(=:-0)でした。私はそれを終了し、停止し、コマンドラインでそれを殺しました...ロックを取り除く方法はありません。WTFはそこで設定を行いましたか?もちろん、再起動で解決しましたが、これは1日2回再起動する必要があるWindowsPhoneですか?
イジー

6

要するに、これは非常に良い質問ですが、恐れている、それはエンドユーザーに気づかせること以上のものを保証します!

カーネルを再設計して、ウェイクロックを排除し、より徹底した効率的な方法で原理をより適切に管理することにより、バッテリー寿命を延ばします。

残念ながら、それは正確には効率的ではありませんが、「電源管理」を可能にする事実上のソリューションとして受け入れられています!ウェイクロック(ドライバー開発のLinuxの第一人者であるGregh Kroah Hartmanとの正確なリンクについてはグーグルです)、LWN.netなどの他のサイト、および同じサイトでここで説明されている別の記事について、広範な議論がありました。これはGregh Kroah Hartmanがこのブログで言及した記事で、Rafael J. Wysockiが提案した代替ソリューションに同意しているようです。それが最新のカーネルv3.xxで実際に使用されているかどうかはわかりません

不適切に設計されたアプリは、画面をオンに保つなどのウェイクロックを要求することがありますが、実際には、画面をオンに保つこのシナリオでは、実際にこれを行うより効率的な方法があります。

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

エンドユーザー向けにこの専門用語などを明確にしようとする一方で、実際には問題の核心は、ウェイクロックの管理方法におけるカーネルコードに帰着します。

以下は、未経験者のウェイクロックとは何かに関するXDAの簡単な要約です。BetterBatteryStatsを使用することで、正確にどのプロセスがバッテリーを消費しているかを確認でき、wikiはgithubでホストされ、こちらの市場入手できます


1
おもしろいのは、私が言及したのと同じXDAスレッドを指すことです。システムがより注意を払う必要があることに同意します(たとえば、実行されなくなったアプリによって要求されたWakeLocksをリリースすることによって)。そして、その開発者は、コーディングをより適切に行う必要があります(ライフサイクルの適切な状態で明示的にリリースすることにより)。しかし、それはユーザーが知る助けにはなりません。私の答えが、ユーザーが何ができるかについての洞察を与えてくれることを願っています-そして、あなたの「技術者」の一人が残されたギャップを埋めることができることを!
イジー

3

Wakelock Detectorを チェックしてくださいXDA-Developers / Google Play

Wakelock Detectorは、アプリのウェイクロックを1つの拡張可能なビューにグループ化し、見やすくします。また、実行中のアプリを示します。また、アプリの展開ビューには、アンインストール情報の削除ボタンがあります。

Wakelock Detector:アプリの詳細 Wakelock Detector:プロセスの選択
画像をクリックして拡大します。(出典:Google Play

開示:私はこのアプリの責任ある開発者の一人です。さらに4人の友人がこのプロジェクトに趣味として取り組んでいます。


ありがとうございました!それは確かに貴重な情報です。回答にさらに詳細を追加してもよろしいですか、例えば、何が特別なのですか?その後、スクリーンショットをいくつか追加します。それが完了するまで:アプリへのPlaystoreリンクはここにあります...
Izzy

詳細をありがとう!私はあなたの答えにそれらをマージしました、私はあなたが気にしないことを願っています:)理解の質問:アプリが「0秒」の間隔を使用して位置を問い合わせるとしましょう。これにより、LocationServiceがデバイスをウェイクロックします。思いのロック検出器は、ウェイクか-本当の原因として、その後責任アプリを示してLocationServiceそれがそのアプリケーションパッケージの一部ではないとして、?
イジー

wakelock Detectorは、同じアプリパッケージ名に属するwakelockをグループ化するため、質問の答えは「いいえ」です。ロケーションサービスはAndroid OSに属しているため、ソリューションはアプリのユーザー権限を確認することです
-UzumApps

どうもありがとう!「Androidシステムそのものだとしたら」という簡単な解決策を望んでいました。部。そのようなことはないようですが、可能であれば、WLDと統合することをお勧めします:)
Izzy

2
ご意見をお寄せいただきありがとうございます、私はそれを検討し、それに取り組みます。WLDは良さそうです!!! :)
UzumApps

1

ルート化されていないデバイスユーザーを支援するいくつかの方法

  1. アプリの開発者の1人である@UzumappsがWakelock DetectorWLD)を使用したソリューションを投稿したことて、Wakelock Detector Lightと呼ばれるルートなしでも使用できるアプリの使用について彼が更新していないことに驚いています!私はこれを新しいデバイス(ルート化されていない)のソリューションの検索を発見しました。

これは最近の開発であるため、ルート化されていないデバイスユーザー向けに投稿しています。Moto X Play(Android 6.0.1)で動作するものとしてテスト済み

注:私は2番目の方法を機能させることができませんでした。私のような知識のない人でも機能するように編集ソリューションを歓迎します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.