個々のコンポーネントの消費電力を測定するには、対象のコンポーネントが目的の状態(オン、アクティブ、スキャンなど)になっているときのデバイスの消費電流と、そのコンポーネントがオフになっているときのデバイスの消費電流を比較します。公称電圧でデバイスの平均瞬間消費電流を測定するには、ベンチ電源や専用の電池モニタリング ツールなどの外部電源モニター(Monsoon Solution Inc. の Power Monitor や Power Tool ソフトウェアなど)を使用します。
メーカーは多くのケースで、個々のコンポーネントが消費する電流の情報を提供しています。実際のデバイス電池の消費電流が正確に掲載されている場合は、この情報を使用します。ただし、デバイスの電力プロファイルでこれらの値を使用する前に、メーカー提供の値を検証する必要があります。
消費電力をコントロールする
測定時には、Android Debug Bridge(adb)実行用の開発ホストとの USB 接続など、外部充電ソースとの接続がないことを確認してください。テスト対象のデバイスがホストから電流を引き込み、電池の測定値が低下することがあります。USB On-The-Go(OTG)デバイスはテスト中のデバイスから電流を引き込むことがあるため、USB OTG 接続は使用しないでください。
測定中のもの以外のコンポーネントにおける変更によって測定が不正確になることを避けるため、一定の消費電力でシステムを実行する必要があります。電力測定に望ましくない変化をもたらす可能性のあるシステム アクティビティは次のとおりです。
- モバイル接続、Wi-Fi 接続、Bluetooth 接続での受信、送信、スキャンのアクティビティ。セル無線通信の電力を測定しない場合は、デバイスを機内モードに設定し、必要に応じて Wi-Fi または Bluetooth を有効にします。
- 画面のオン / オフの切り替え。画面がオンのときに表示される色によっては、一部のディスプレイ技術の消費電力に影響することがあります。画面を使用しないコンポーネントの値を測定する場合は、画面をオフにします。
- システムの停止 / 再開。画面がオフの状態になると、システムが停止状態になり、デバイスの一部が低電力またはオフの状態になることがあります。この状態になると、システムが定期的にアラームなどの送信を再開するため、測定中のコンポーネントの電力消費に影響し、電力の読み取り値が大きく変動することがあります。詳細については、システム停止を制御するをご覧ください。
- CPU の速度変化および低電力スケジューラのアイドル状態の開始 / 終了。
通常のオペレーションでは、システムによって CPU 速度、オンラインの CPU コア数、他のシステムコアの状態(CPU やメモリに関連するメモリバス速度や電源レールの電圧など)が頻繁に調整されます。テスト中、次のような調整が電力測定に影響します。
- CPU 速度のスケーリング オペレーション: メモリバスなどのシステム コア コンポーネントのクロックおよび電圧のスケーリング量を削減することがあります。
- スケジューリング アクティビティ: 低電力アイドル状態での CPU 消費時間の割合に影響することがあります。これらの調整がテスト中に行われないようにする方法については、CPU 速度を制御するをご覧ください。
たとえば、デバイスの screen.on
値を計算したいとします。この場合、デバイスの機内モードを有効にして、電流が安定した状態でデバイスを実行します。また、CPU 速度を一定に保ち、部分的なウェイクロックを使用してシステムの停止を防ぎます。その後、デバイスの画面をオフにして測定します(200 mA)。次に、デバイスの画面を最小の明るさでオンにして、もう一度測定します(300 mA)。この結果から、screen.on
の値は 100 mA(300 - 200)になります。
注: アクティブ時の電流消費がフラットな波形でないコンポーネント(セル無線通信や Wi-Fi など)の場合は、電力モニタリング ツールを使用して一定期間の平均電流を測定します。
デバイス電池の代わりに外部電源を使用する場合、電池サーミスタや内蔵残量ゲージピンが接続されていないために問題が発生することがあります。たとえば、電池温度または残り電池容量の無効な読み取り値によって、カーネルまたは Android システムがシャットダウンされる可能性があります。ダミー電池を使用すると、通常のシステムの温度や残り電池容量のダミーの読み取りを提供する、サーミスタまたは残量ゲージピンの信号を送信できます。ダミー電池は外部電源に接続する便利な導線ともなります。あるいは、電池が存在しないことに起因する無効なデータを無視するようにシステムを変更することもできます。
システムの停止をコントロールする
このセクションでは、システムの停止状態への移行が他の測定に干渉することを回避する方法と、停止状態のシステムの消費電力を測定したい場合に測定する方法について説明します。
システムの停止を防ぐ
システムが停止すると、電力測定値で不要な変動が発生し、システム コンポーネントが有効な消費電力の測定には不適切な低電力状態になることがあります。画面がオフのときにシステムが停止しないようにするには、部分的なウェイクロックを一時的に使用します。USB ケーブルでデバイスを開発ホストに接続し、次のコマンドを実行します。
adb shell "echo temporary > /sys/power/wake_lock"
wake_lock
のときは、画面がオフ状態になってもシステムの停止はトリガーしません
(電力消費を測定する前に、必ず USB ケーブルをデバイスから外してください)。
ウェイクロックを削除するには次のコマンドを実行します。
adb shell "echo temporary > /sys/power/wake_unlock"
システムが停止している状態で測定する
システムが停止している状態で消費電力を測定するには、電力プロファイルの cpu.idle
の値を測定します。測定前に以下のことを行なってください。
- 既存のウェイクロックを削除する(上記の説明を参照)。
- デバイスを機内モードにして、セル無線通信による同時実行アクティビティを回避する。このアクティビティは、システム停止の制御対象にある SoC 部分とは別のプロセッサ上で実行される可能性があります。
- 次の方法でシステムを確実に停止状態にする。
- 現在の読み取り値が安定した値になっていることを確認する。読み取り値は、SoC 停止状態の消費電力と、電源を入れたままのシステム コンポーネントの消費電力(USB PHY など)の合計の予想範囲内でなければなりません。
- システム コンソールの出力を確認する。
- システム状態の外部表示を注視する(停止していないときに LED が消灯していないかなど)。
CPU 速度をコントロールする
アクティブな CPU は、オンラインまたはオフラインにでき、クロック速度や関連する電圧を変更できます(メモリバス速度や他のシステムコアの電力状態に影響することもあります)。また、カーネルがアイドルループ状態のときに、低電力のアイドル状態に移行できます。電力プロファイルのさまざまな CPU 電力状態を測定する場合は、他のパラメータを測定する際に消費電力が変動しないようにします。 電力プロファイルは、すべての CPU で同じ速度と電力特性を利用できることを想定しています。
CPU 電力を測定する、または他の測定を行うために CPU の電力を一定に保つ場合は、オンラインにする CPU 数を一定に保ちます(1 つの CPU をオンライン、他の CPU はオフライン、またはホットプラグを解除するなど)。スケジューリングを除くすべての CPU をアイドル状態に保つと、許容可能な結果が得られます。adb shell stop
を使用して Android フレームワークを停止すると、システムのスケジューリング アクティビティを削減できます。
電力プロファイルの cpu.speeds
エントリで、デバイスの使用可能な CPU 速度を指定する必要があります。使用可能な CPU 速度のリストを取得するには、次のコマンドを実行します。
adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
これらの速度は、値 cpu.active
の対応する電力測定値と一致します。
オンラインのコア数が電力消費に大きく影響するプラットフォームでは、プラットフォームの cpufreq ドライバまたはガバナーの変更が必要な場合があります。ほとんどのプラットフォームでは、ユーザースペース cpufreq ガバナーや、速度を設定するための sysfs インターフェースを使用して CPU 速度を制御できます。たとえば、CPU が 1 つのみのシステムで cpufreq ポリシーを使用している場合、またはシステムのすべての CPU が cpufreq ポリシーを共有している場合に速度を 200 MHz に設定するには、システム コンソールまたは adb シェルを使用して次のコマンドを実行します。
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
注: 正確なコマンドは、プラットフォームの cpufreq の実装によって異なります。
これらのコマンドは、新しい速度が許容範囲外でないことを確認後、新しい速度を設定し、CPU が実際に実行している速度を出力します(検証のため)。実行前の最低速度が 200,000 を超える場合は、最初の 2 行の順序を逆にするか、最高速度を設定する前に最初の行をもう一度実行して最低速度を下げる必要があります。
さまざまな速度で実行されている CPU で消費される電流を測定するには、システム コンソールで次のコマンドを使用して CPU を CPU バウンド グループに配置します。
# while true; do true; done
ループの実行中に測定を行います。
一部のデバイスでは、温度上昇が原因でサーマル スロットリングが有効になっている間(つまり、CPU を高速で長時間実行した後)、CPU の最大速度が制限されることがあります。測定中にシステム コンソールの出力で確認するか、測定後にカーネルログを確認して、このような制限に注意してください。
cpu.awake
値により、システムが停止状態でなく、タスクを実行していないときに消費される電力を測定できます。CPU は、低消費電力スケジューラ アイドルループの状態である必要があります。この状態では、CPU が ARM Wait For Event 命令を実行していたり、SoC 固有の低電力状態(アイドルの使用に適した fast-exit レイテンシ)であったりします。
cpu.active
値により、システムが停止モードではなく、タスクを実行していないときの電力を測定できます。1 つの CPU(通常はプライマリ CPU)がタスクを実行し、他の CPU はすべてアイドル状態である必要があります。
画面の消費電力を測定する
オンになっている画面の消費電力を測定するときは、画面がオンになっているときに通常有効化されている他のデバイスも有効になっていることを確認します。たとえば、画面がオンのときにタッチスクリーンとディスプレイ バックライトが通常有効になっている場合は、測定時にそれらのデバイスが有効になっていることを確認し、画面がオンになっているときの実際の電力消費量を測定できるようにします。
ディスプレイ技術の中には、表示される色に応じて消費電力が異なるものがあり、測定時に画面に表示される内容に応じて消費電力が大きく変動する原因となります。測定時に、実際の画面の電力特性を持つものが表示されているようにしてください。黒い画面(一部の技術で消費電力が最も少ない)と白い画面の中間が理想的です。白の背景とその他の色が混在しているカレンダー アプリのスケジュール画面が一般的な選択肢となります。
最小と最大のディスプレイ / バックライトの明るさで画面を測定します。 次のようにして最小の明るさを設定します。
- Android UI を使用(非推奨): [設定] > [ディスプレイの明るさ] のスライダーを最小の明るさに設定します。ただし Android UI では、パネルやバックライトの明るさを最小で 10~20% までにしか設定できません。画面を見るのに苦労するほどに明るさを低くすることはできなくなっています。
- sysfs ファイルを使用(推奨): 可能であれば、sysfs ファイルを使用して、ハードウェアでサポートされる最小の明るさまでパネルの明るさを調整します。
さらに、プラットフォームの sysfs ファイルで LCD パネル、バックライト、タッチスクリーンのオンとオフを有効にできる場合は、sysfs ファイルを使用して画面がオンとオフのときの消費電力を測定できます。それ以外の場合は、システムが停止しないように部分的なウェイクロックを設定し、電源ボタンで画面をオンまたはオフにします。
Wi-Fi の消費電力を測定する
比較的通信の少ないネットワークで Wi-Fi の測定を行います。測定対象のアクティビティとは関係のない大量のブロードキャスト トラフィックが処理されないようにします。
wifi.on
値により、Wi-Fi が有効であるものの、アクティブに送信または受信していないときに消費される電力を測定できます。これはほとんどの場合、Wi-Fi が有効でシステムが停止(スリープ)状態のときの消費電力と、Wi-Fi が無効でシステムが停止(スリープ)状態のときの消費電力を比較して測定します。
wifi.scan
値により、アクセス ポイントの Wi-Fi スキャン中に消費される電力を測定できます。アプリケーションは WifiManager クラスの startScan()
API を使用して Wi-Fi スキャンをトリガーできます。[設定] > [Wi-Fi] を開くことでも、アクセス ポイント スキャンを数秒ごとに実行できます。これにより、消費電力が大幅に増加しますが、測定値から画面の消費電力を差し引く必要があります。
注: 制御された設定(iperf など)を使用して、ネットワークの送受信トラフィックを生成してください。