
遅かれ早かれ、すべてのAndroidユーザーは、電話が画面から外れていても、どのアプリケーションが一晩でバッテリー全体を消費したかを理解する必要があると思います。 見つかった犯人の運命はうらやましいことではありません。ほとんどの場合、単純に削除されます。 それでは、アプリケーションがバッテリーを最小限に使用するために何ができるでしょうか? この記事では、この質問に答えて、使用したバッテリー消費を削減する方法について説明します。

定量化
まず、コードの修正後の進行状況を監視するために、バッテリー消費を測定する方法について同意しましょう。 私たちが利用できるのは、バッテリー電力の割合だけです。 私たちはそれに集中します。 この値は、非常に多くの要因によって異なります。
測定誤差を減らすために、次のことをお勧めします。
- 同じデバイスを使用します。
- スケールの同じ部分を使用します(実際、スケールの異なる部分の電荷の1%の変化は、異なる電荷の変化を意味します。たとえば、通常100%から99%までは90%から89%よりも速く放電します)。
- デバイスで一連のバッテリーテストを開始する前に、工場出荷時設定にリセットすることをお勧めします。
- 各テストの前にデバイスを再起動します。
- 1回のテストで、測定誤差がそれほど大きくならないようにデバイスを10%以上放電します。
- 一連のテスト中に新しいアプリケーションをインストールまたは起動しないでください;バックグラウンドでバッテリーを消費する可能性があります。
- 画面の明るさ、ネットワーク設定など、デバイスの設定を変更しないでください。
- テスト中または各テスト中に同じパスに沿ってデバイスをかなりの距離(数メートル以上)移動しないでください。
バッテリーは何をしますか?
バッテリーの主な消費者は次のとおりです。
- CPU動作
- スクリーンバックライト;
- GPU操作
- ネットワークでの作業;
- 頻繁なGPS取得。
このリストは多くのAndroid開発者に馴染みがあると思います。 最も興味深いのは、これらの各ポイントの貢献です。 もちろん、異なる場合があります。 そして、これが私の観察です。
- 多くの場合、CPUが主な消費者です。
- バックライトは多くの場合、CPUを必要とします。
比較テスト中にバックライトの輝度を変更しないことが非常に重要です。 そうしないと、結果が歪む可能性があります。 たとえば、明るさの変化が1年以上続くNexus 5のバッテリー消費にどのように影響するかを測定すると、次の結果が得られました:画面の明るさを20%から80%に変更すると、バッテリー消費が1時間あたり15%増加しました。 - 電話機が動いている場合や携帯電話の信号が弱い場合、ネットワーク操作の消費量が大幅に増加する可能性があります。
これは、セルラーポイントを検索するコストが原因です。 画面の明るさと同様に、これはテスト結果に影響する可能性があることに注意してください。 - GPS座標の取得に対する消費の効果は、座標を更新するときにコールバックが呼び出され、一定量のコードが実行されるという事実によってしばしば強化されます。
アプリケーションによるバッテリー消費を削減するために、何に影響を与えることができますか? それほど多くはありません。
- まず、CPUの負荷を軽減します。 これがバッテリー消費を削減する主な方法です。 CPUを使用するようにアプリケーションをプロファイルすることは理にかなっています。 可能であれば、負荷の一部をGPUに転送します。 これは重要な貢献をすることができます。
- 次にネットワーク。 ネットワークにアクセスする可能性が低くなるようにデータをバッファすることは理にかなっています。 ネットワーク経由でデータを転送する際のバッテリー消費を削減する方法について詳しく説明します。
- 次はGPSです。 頻繁に更新される正確な座標が必要ない場合は、要求しないでください。 WiFi経由で座標を決定する可能性を検討する価値があります。 これについてはよく書かれています。
バッテリー消費プロファイリング
以下が必要です。
- OS 5.xとかなり新しいバッテリーを搭載したAndroidデバイス。 可能であれば、彼は工場出荷時の状態にリセットする必要があります。
- プロファイラー: github.com/google/battery-historian デスクトップにインストールし、テストの前にテストする必要があります。
各実験は、次の手順で構成されています。
- バッテリーを完全に充電してください。 バッテリースケールの同じ部分で、後で実験結果を互いに比較できることが重要です。
- テスト対象のアプリケーションをデバイスにインストールします。
- デバイスを再起動します。 これは必要です そうしないと、バックグラウンドで実行されている他のアプリケーションが結果に影響を与える可能性があります。
- バッテリー統計のリセット:adb shell dumpsys batterystats --reset
- ウェイクロックの統計を有効にすることもできます。 デフォルトでは無効になっています:adb shell dumpsys batterystats --enable full-wake-history
- 充電しないように、コンピューターからデバイスを取り外すことを忘れないでください。
- 次に、テスト済みのアプリケーションを実行します。
- そして、デバイスを数時間延期し、少なくとも10-15%放電させます。 テスト中は、結果に影響する可能性があるため、デバイスに触れず、画面をオンにしないことをお勧めします。
- テスト中にデータを調査します。
最後のステップで詳細に説明します。 テストデータを調べるには2つの方法があります。 Googleが開発したプロファイラーを使用できます。 そして、Androidの設定でUIを使用できます。
1.バッテリー履歴プロファイラー
まず、プロファイラーはAndroid 5.xと以前のバージョンのOSで異なるUIを表示します。 さらに、データの量、完全性、表示の容易さは、Android 5の方が大きく異なります。一方、異なるバージョンのAndroidで実行した場合、バッテリーでアプリケーションをプロファイリングした結果は著しく異なります。 Android 5でプロファイリングを開始することをお勧めします。その後、OSの以前のバージョンでこのプロセスを必ず繰り返してください。
2. Android設定のUI
ここではすべてが簡単です。 電話で、[設定]-> [バッテリー]に移動します。 パーセンテージとは、各アプリケーションで使用されるバッテリーの割合を意味します。 100%の場合、テスト中に費やされたすべてが取得されます。

たとえば、上の画面は、午後10時頃から午前7時30分頃までに統計が収集されたことを示しています。 この間、デバイスは72%(100%-28%)放電されます。 排出されたものの14%(つまり、72%から)がスクリーンに送られました。 MAPS.MEで12%。 このリストのアイテムをクリックすると、選択したアプリケーションの費用に関する詳細情報を取得できます。 この画面は、消費量が6時間から7時間に急激に増加したことも示しています。 多くの場合、アプリケーションがGoogle Appsを積極的に使用し、料金が請求されます。 これは上記のスクリーンショットでも見られます。 このダイアログを使用すると、システムで起動された他のアプリケーションやサービスのバックグラウンドに対して、アプリケーションで何が起こっているのかをすばやく理解できます。 また、Android 4.x以前の場合、プロファイラーを使用して取得できないデータを提供します。
バッテリー履歴プロファイラーの使用
最初に、プロファイラーをインストールする必要があります。 インストールプロセスの詳細については、 こちらをご覧ください 。 以下が含まれます。
- go install: golang.org/doc/install
デフォルトで推奨されているように、$ HOME / goディレクトリにgoをインストールする場合、インストール後に次の環境変数を設定するだけです。
export GOPATH = $ HOME / go
エクスポートGOBIN = $ GOPATH / bin - protobufのインストール。
- バッテリー履歴プロファイラーのインストール。
次に、デバイスを接続し、最後の充電データリセット以降のバッテリー消費に関する情報を収集します(バッテリーが完全に充電された場合、またはコマンドが呼び出された場合に発生します:adb shell dumpsys batterystats --reset):
adb bugreport > bugreport.txt
プロファイラーを実行します。
cd $GOPATH/src/github.com/google/battery-historian go run cmd/battery-historian/battery-historian.go
次のブラウザにアクセスします。
http:// localhost:9999
開いたウィンドウで、以前に保存したbugreport.txtファイルを選択します。
ブラウザに表示される結果は、bugreport.txtがダウンロードされたAndroidのバージョンによって異なります。 Android 5.xの場合、システム内の各アプリケーションの統計情報など、一連のタブとさまざまな情報を含むページが表示されます。 デバイスのバッテリー消費に関する一般的な統計:


アプリケーション統計:

Android 4.xでは、このようなダイアログが表示されます。 情報量は大幅に少なくなりますが、一般的な消費で何が起こっているかを理解できます。

アプリケーションプロファイリングモード
少なくとも2つのモードでチェックすることは理にかなっています。
- フォアグラウンドアプリケーション。
- バックグラウンドでのアプリケーション。
理由がない限り、バックグラウンドのアプリケーションはリソースをまったく消費しないことが望ましいです。 さらに、運転中にアプリケーションがどのようにバッテリーを消費するかを個別に確認する価値があります。 特に、GPSを使用している場合、または他の方法で場所に接続されている場合。
バッテリー劣化
時間が経つにつれて、バッテリーの充電が弱くなることを考慮することが重要です。 私は、アプリケーションが半年の間、1.5倍速くバッテリーを放電し始めた場合がありました。 その理由は、バッテリーの劣化です。 これはテスト時に考慮する必要があります。 アプリケーションが6か月前の4時間の作業でデバイスのバッテリー全体を食べていた場合、ほとんどの場合、より短時間でバッテリーを消費します。 そして、その理由は、アプリケーションで何かが間違っているからではありません。
競合他社との比較
上記の方法では、アプリケーションのソースコードにアクセスする必要がないことに注意してください。 これは、競合他社と比較して、アプリケーションがバッテリーを消費する方法を比較できることを意味します。
おわりに
この記事では、Mail.Ru GroupでMAPS.MEを操作するときに取るバッテリー消費を削減する方法について説明しました。 誰かが同じ問題を解決するために他の手段や技術を使用していると聞いたら興味深いでしょう。 コメントを書いてください。