モバイルにおける電力最適化のための
1プラクティス
於保 俊(Ohoooo) KLab EM部
DroidKaigi (2015/04/25)発表資料
自己紹介
● 於保 俊(おほ すぐる) Tw:@ohomagic
● 環境学修士・・・
● 六本木のクラブKLabでエンジニアリングマネージャー
やってます
● 仕事は、「何でも屋?」
○ 広く浅く様々な技術課題解決をしています
○ KLabのEM部の工作担当です
○ N88BASIC(大昔)→Java(大学)→PHP(KLab)→最近
は、Python、C#、C・・・色々・・・Android(うっ
● 最近子供が生まれて、いつか一緒にコード書く
ことを夢見ています
ネタスライド
一応ソフトウェアのエンジニアです
今日のお話
● はじめに
○ なぜ消費電力が重要なのか?
○ 電力最適化の課題
○ 電力最適化の先行事例等
● 電力計測の仕組み
○ 電力はどうやって測るか?
○ 今回の装置の紹介
● 実例として
○ いろんなアプリを測ってみた 何が電気を食うのか?
○ AndroidWearのWatchFaceの消費電力を減らしてみた
● まとめ
はじめに
なぜ消費電力が重要なのか?
● 電気は有限
● 電池のもちが悪いとユーザー
がアクティブになってくれる時
間が短くなる
● 電池のもちが悪いとネガティ
ブなユーザー体験につながる
● 場合によってはアンインストー
ルの理由にもなる
画像:Wikipediaより引用
さらに 「ウェアラブルの台頭」
● AndroidWear / Apple Watch …
● バッテリー容量はさらに小さい
● モバイルSoCがメインで最適化がまだ進んでない
後藤弘茂のWeekly海外ニュース「スマートウォッチの電池と価格の呪縛を解き放つSoC設計と実装」
http://pc.watch.impress.co.jp/docs/column/kaigai/20141030_673678.html
● 十分とは言いがたい稼働時間
よりシビアな条件で電力消費と戦わなくてはいけない
課題
ではどうやってアプリの電力消費を最適化するか?
計測できなきゃ手が出せない
● 一般的なパフォーマンスチューニングでも
○ プロファイラを使って時間がかかっているところやメモリ
の消費などを計測します
○ 計測して問題個所を特定し、改善していきます
● つまり、どこで「電力」を消費しているかを計測で
きなきゃチューニングのしようがない
計測可能なら、計測・変更を繰り返すことでチュー
ニングできる
先行事例
いくつかありますが、
今回参考にさせていただいたものを紹介します。
Google
Project Volta&Battery Historian
● Project Volta
○ Android5.0で導入されたバッテリーのもちをよくするた
めの各種仕組みとAPI群
https://developer.android.com/about/versions/android-5.0.html#Power
● Battery Historian
○ Project Voltaで導入された電源関連の統計情報を取得
し、整形して分析しやすくするツール
https://github.com/google/battery-historian
株式会社ブリリアントサービス様
電力測定キット「パワースカウター」
● ダミーバッテリーを使って、電力を計測
● 本格的な計測が廉価(2~3万円)にできるそうです
http://www.brilliantservice.co.jp/works/power_kit.html
● 今回の発表は、ここからヒントを得て、
○ 自分もやってみたい!
○ もっと安く簡単にできないか?
○ バッテリーが取り外しできない最近の機種に対応するには
  を考えて、実験したものです
電力計測の仕組み
電力とは?
● 電圧×電流
● 電圧は回路に並列に、電流は回路に直列につ
ないで計測する
● 電圧計と電流計があれば、電力は分かる
● 端末にUSB給電するとき「バッテリーが満充電」
であれば、電力はバイパスされて端末を動かす
のに「ほぼ」使われる
今回の装置の紹介
● INA226 I2Cディジタル電流・電圧・電力計モ
ジュール
● ArduinoUno
● USB充電器
● USBケーブル(高速充電対応)
● 計測用スケッチ(Arduino用プログラム)
● ファイル保存+グラフ描画用自作プログラム
INA226 I2Cディジタル電流・電圧・電力計モジュールとは
● I2Cでつながるデジタル
電力計
● ストロベリー・リナックス
通販で購入
● 1000円!
● 計測レンジ ±20A 36V
● 精度1.25mA 1.25mV
● 小さい
● キャリブレーションいらな
くて簡単
下記商品URLから引用
https://strawberry-linux.
com/catalog/items?code=12031
Arduino Uno
● 便利なマイコン基板
● 簡単にPCと外部入
出力をつなげられて
重宝します
● 3000円くらい
下記URLから引用
http://www.arduino.cc/en/Main/ArduinoBoardUno
回路構成
100kΩ抵抗
Arduino用スケッチ(抜粋)
INA226との通信は
オレ工房様のスケッチを利用
http://ore-kb.net/archives/150
シリアル出力部分を、受け側プ
ログラムに合わせて改変して使
用させていただきました。
約5msごとにデータ取得します
https://github.com/oho-sugu/powermeter
void setup()
{
Wire.begin();
Serial.begin(115200);
setupRegister();
}
char buf[64];
unsigned short voltage; // Bus Voltage (mV)
unsigned short current; // Current (mA)
unsigned short power; // Power (uW)
unsigned long time; // time (ms)
void loop()
{
voltage = (unsigned short)readRegister(INA226_REG_BUS_VOLTAG
current = (unsigned short)readRegister(INA226_REG_CURRENT);
power = (unsigned short)readRegister(INA226_REG_POWER);
time = millis();
snprintf(buf, NELEMS(buf)
, "T%lxV%xI%xP%xn"
, time
, voltage
, current
, power
);
Serial.print(buf);
delay(5);
}
ロガープログラム&計測風景
https://github.com/oho-sugu/powermeter-java
計測条件
● デバイスにUSBで給電できること
● バッテリーが満充電状態であること
この装置の利点と欠点
● 利点
○ 安い、簡単に作れる
○ デバイスにUSB給電するだけ、手軽に使える
○ USB給電に対応する機器なら何でも対応可能
○ それなりに細かく消費電力のモニタリングが可能
● 欠点
○ 精度は専門の機器に比べると劣る
○ 電力がバッテリーの充電に使われる場合、さらに精度が
悪化する
○ 時間解像度は数msくらいが限界→メソッド単位とかでは
さすがに電力計測できない
実例1
あの有名アプリの電力消費
※注 計測対象・条件
Nexus5 Android5.1 ディスプレイ明るさ最高
通信環境 Wifiのみ
以降の計測結果は、あくまで発表者の環境での結
果です。
傾向をきちんと裏付ける回数の試行を行うことはで
きなかったので、あくまでも参考としてとらえてくだ
さい。
また個別のアプリについての批判や良否の判断の
意図はありません。
端末起動時~何もしない状態~スタンバイ
最大7W超
画面OFF
スタンバイ時
0.2Wくらい
通常時
何もしない状態
1Wくらい
画面輝度最低と
最大
0.5Wくらい違う
ブラウザ(Chrome)使用 平均2.7W
Youtube動画再生 平均2.0W
GoogleMap使用時 平均3.7W 意外と電気食う
ここまでの結果まとめ
● 意外とGoogleMapが電気食い
● 動画再生が消費電力が少ない
○ これはデコード専用回路のおかげだと推測
● ブラウザも比較的大食い
○ 特に瞬間最大消費電力が多い
○ スクロール時など、画面変更時に目立つ
まずは、当社アプリから
お知らせ(WebView)の表示
平均4.51W
ゲームプレイ中
平均2.32W
データダウンロード
平均2.81W
真・戦国バスター 平均2.59W
https://play.google.com/store/apps/details?id=jp.klab.senbus.android
ユニティちゃんのホームランスタジアム
                  平均2.83W
https://play.google.com/store/apps/details?id=com.klab.
ここまでの結果まとめ
音ゲー Playgroundゲームエンジン WebViewはとても消費電力が多い
ゲームのコア部分であるライブでの消費電力はかな
り少ない 下限もおよそ 2Wくらいと低い
真・戦国バスター Androidの標準UIコンポーネント
ベースで作成
増減が激しい
ユニティちゃんの
ホームラン競争
Unity 4 消費電力下限が約2.5Wと高い
シーンやオブジェクトの激しい変更がなければ電力消
費は落ち着いている
その他のゲームでも調べてみましたが
● WebViewはアニメーションやスクロール時の電力消費が激しい
● 通信時、特に連続してファイルのDLをするときは電力を消費
なぞって消すパズルのゲーム
平均2.38W
ひっぱるゲーム 平均2.37W
白い動物のRPG 平均2.46W
3Dレースゲーム 平均2.56W
本格オンラインRPG 平均2.60W
ここまでのまとめ
消費電力は
● ゆるい傾向として2D<3D
● シーンや画面の切り替えは多いほど消費電力大
● 同じゲームエンジンを使っていても違う傾向
● 頻繁な通信は大きな電力消費
● さらに調査が必要
とはいえ、いわゆるパフォーマンスチューニングは省電力にも貢献
すると思われます
※何をすれば省電力かという体系的なノウハウは今後調査と検証
が必要です
実例2
AndroidWear端末で電力最適化
※注 計測対象・条件
Sumsung Gear Live 275C Android5.0.1
ディスプレイ明るさ最低
以降の計測結果は、あくまで発表者の環境での結
果です。
傾向をきちんと裏付ける回数の試行を行うことはで
きなかったので、あくまでも参考としてとらえてくだ
さい。
AndroidWearのWatchFaceの
消費電力測定
● まず、AndroidWearSDKのサンプルのいくつか
のWatchFaceの消費電力を見ます
● そして、自作WatchFaceの消費電力チューニン
グを試みてみます
参考:公式ドキュメント
https://developer.android.com/training/wearables/watch-faces/performance.html
Sample Analog 平均0.36W
一秒ごとに針が
動くアナログ時計
Sample Sweep 平均0.52W
連続的に針が動
くアナログ時計
Sample Tilt 平均0.53W
OpenGLで描画さ
れるふよふよする
時計
Sample Digital 平均0.35W デジタル時計
自作WatchFaceを作ってみます
● 画像をぐるぐる回しています
○ 秒針と分針に対応する画像をAnalog Sweepのサンプ
ルを参考になめらかに回転させながら合成して、描画し
ています
参考
https://developer.android.com/samples/WatchFace/Wearable/src/com.example.android.wearable.
watchface/SweepWatchFaceService.html
secondMatrix.reset();
secondMatrix.setRotate(((float)mTime.second +
milliseconds / 1000.0f)*6.0f,centerX,centerY);
secondMatrix.postTranslate(-(float)width/7,-(float)height/7);
if(mSecondScaledBitmap!=null)
canvas.drawBitmap(mSecondScaledBitmap, secondMatrix,null);
自作WatchFace初期Ver 平均0.62W
気付いたこと
● 操作をやめて10秒後くらいから消費電力がガク
ンと下がる
○ →CPUのパワーステートの切り替え?
● 処理が継続して重ければ、消費電力の高い状
態が維持される
チューニング
ということは、
当たり前だけど、sleepなどを入れて処理の間隔を
あければよい?
Sleepを32ms≒30FPS 平均0.49W
Sleep100ms≒10FPS 平均0.52W
減ったけど思った結果にはならなかった
● Sleep100msの時の挙動がよくわからない
● とはいえ、計測しながらチューニングできるのは
可能性を感じる
● 単純な図形なら、画像ではなく、直接描画した
方がいいのではないか→今後確かめたい
まとめ1
ここまで、今回は平均消費電力を一つの指標にし
ているが、適切ではないとやっていて思った
→様々な要因によって消費電力は変化するので、
操作ごとのポイントで評価した方がいい
→この手法は、ミクロなチューニングとして使うべき
で、アプリ全体の電池のもちを評価する長期間の
テストと併用するべき
とはいえ、ピンポイントでチューニングの参考にと
てもなります
まとめ2
● 簡単な装置で、比較的簡単に電力測定できる
● プログラムの工夫で消費電力は抑えられる
● 見えてくるエンジンやOSやハードウェアの特性
● 計測可能だし、消費電力を気にしてみてもいい
のでは?
● あと、ハードウェア楽しいよ!
ご清聴ありがとうございました

Droid kaigiプレゼン