2014年12月 8日

Android

Android 5.0 Lollipopで追加されたバッテリーセーバーとは?

  • このエントリーをはてなブックマークに追加

Yahoo! JAPAN Tech Advent Calendar 2014の8日目の記事です。一覧はこちら

スマートフォンは日々すさまじい勢いで進化し続けています。
Androidが世の中に初めて登場した頃、アプリの開発者たちはハードウエア・リソースの乏しさに、苦しい戦いを強いられたものでした。
2008年10月に世界で最初に市販されたAndroid端末は、HTCが製造したT-Mobile G1という端末でしたが、320x480ピクセルのディスプレイに、192MBのメモリ、CPUは528MHz ARM 11のシングルコア・プロセッサで、GPUは備えていませんでした。ついでですがこの端末は、物理キーボードを搭載していました(Androidは最初期の頃、物理キーボードを前提として開発されていました)。
それが現在ではどうでしょうか?
参考までに、12月上旬にY!mobileにて販売予定のNexus 6を例に出すと、ディスプレイは1440x2560ピクセル、メモリは3GB、2.7GHzのクアッドコア・プロセッサと、Adreno 420 GPUを備えています。
これほどの変化がたった6年の間に起きたのです。

Androidとバッテリー

しかし、バッテリー駆動時間に注目するとどうでしょうか。
連続待受時間で比較してみると、T-Mobile G1が約140時間と少ないものの、その2年後に発売されたHTC Desireでは約400時間、そしてNexus 6でも約400時間とほぼ変わらないものとなっています。
バッテリーの容量自体は、HTC Desireの1,400mAhからNexus6の3,220mAhへと、2倍強も増えているのにです。
読者の多くも、スマートフォンのバッテリー駆動時間があまり伸びていないと感じていらっしゃるのではないでしょうか。
バッテリー容量の増加以上にサービスの複雑化、多機能化が進んでいるのです。

より長い駆動時間を求めて

スマートフォンを長時間使いたいユーザーの声を反映してか、Android初期の頃から、バッテリー効率化アプリが数多く登場してきました。
そのなかには、むやみにバックグラウンドサービスを強制停止するために、OSに必要なサービスまで止めてしまい、全体が不安定になってしまうような粗悪なアプリもありました。
最近ではそういうこともないようで、省電力アプリを使用していても不安定に感じることがありません。
また、省電力化の方向性も、他アプリのバックグラウンドサービスを強制停止することよりも、画面を暗くしたり、位置情報サービスや同期サービスを停止するなど、端末の設定を省電力に最適化する方向に変わってきているように思います。
ちなみに、ヤフーも「スマホ最適化ツール」という省電力アプリを出しています。

バッテリーセーバーの登場

こうしたなか、GoogleはAndroid 5.0 Lollipopに、バッテリーセーバーモードという省電力機能を搭載しました。
このバッテリーセーバーモードは、バッテリー残量が20%を切ったあたりで使用するかどうかが通知され(自動でONにすることもできます)、ONにすると、さまざまな方法で消費電力が低減されるようになります。
Heads up Notificationの形で通知されます

手動でONにするには、
設定アプリの「電池」から
設定アプリ内にある電池の項目です

Toolbarの右上のメニュー内にあるバッテリーセーバーを選び、

ONにします。

ちなみに、充電を開始すると、自動的にOFFになります。
充電中にONにしようとすると、こうなります。
なかなかいい動きです

バッテリーセーバーは実際何をするのか

さて、このバッテリーセーバーは実際には何をしているのでしょうか?
Googleが開発者向けに公式に発表しているわけではないのですが、
現時点では少なくとも、

  • CPUクロックが低下する
  • 画面が非常に暗くなる
  • アカウントの同期機能が無効になる
  • Activity起動時などにアニメーションが行われないようになる
  • バイブレーションが無効になる
  • ステータス・バーとナビゲーション・バーがオレンジになる

ことがわかっています。

ステータス・バーとナビゲーション・バーがオレンジになります

そこで、次のようなテストをしてみました。

処理速度はどのくらい遅くなるか

10万回ほど乱数計算をさせてみて、計算終了までにかかった時間を計測してみました。
主要なロジックは次のようなものです。
皆さんは間違ってもこのような処理を、メインスレッドで行わせてはいけません。
ちゃんと別スレッドで計算するようにしましょう。

@Override
public void onClick(View v) {
    long startTime = System.currentTimeMillis();
    Random rand = new Random(startTime);

    int sum = 0;

    for(int i = 0; i < TRIAL; i++) {
        double x = rand.nextDouble();
        double y = rand.nextDouble();

        if (Math.pow(x, 2.0) + Math.pow(y, 2.0) <= 1.0) {
            sum++;
        }
    }

    double pai = 4.0 * (double)sum / (double)TRIAL;

    long diff = System.currentTimeMillis() - startTime;
    String text = getString(R.string.result_format, String.valueOf(pai), diff);
    mResultText.setText(text);
}

結果は次のようになりました。

通常時
通常時。73msでした。

バッテリーセーバーモード時
バッテリーセーバーモード時。221msでした。

処理が相当に遅くなっていることがわかると思います。
実際、この状態でいくつかのアプリを使用してみましたが、非常に使いにくく感じるほど遅くなっているものもありました。
最近のアプリはリッチな画面効果のものが増えてきていますので、これはちょっと厳しいですよね。

まとめ

バッテリーセーバーモードはユーザーの使用感を全く変えてしまいますので、省電力のために普段から有効にするといった利用方法は苦しそうです。
そのため、既存の省電力アプリを置き換えるものではなく、あくまでバッテリー残量がわずかになってしまった場合の緊急的な措置と考えたほうが良さそうです。
バッテリーとの戦いはまだまだ続きそうですので、アプリ開発者の方でも、無駄な通信をしていないか、処理をサーバーで肩代わりできないかなど、ユーザーのバッテリーに配慮した設計を心がけ、ほんとうの意味でユーザーにとって使いやすいアプリを目指したいものです。

※ Google、Nexus、Androidは、Google Inc.の登録商標または商標です。 

Yahoo! JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。

  • このエントリーをはてなブックマークに追加