Hatena::ブログ(Diary)

inutchの日記

2010-05-12

Xperiaのバッテリー節約について

最近急にXperiaの電池の持ちが悪くなって、他のサイトとかも参考にしながら2,3日いろいろ調べてたらだんだん混乱してきたけど、やっと整理できました。

結論から言うと、作りの悪いアプリとウィジェットが、スリープ中にやたらと電池を食うことが意外と多いみたい。

ずっと何かを監視してたり、ネットに定期的にアクセスする必要があるなら、電池を消費するのはわかるけど、そういうアプリで「定期更新しない」設定にしてても、Pause状態でプロセスが存在するだけでかなり電池を食う場合がありました。

前エントリーで作ったCPU消費をチェックするアプリで見てても、特にCPUは動いて無いのに、なぜか電池を食うんですよね。何かリソースをつかんだままなのか。。。?

#というわけで、作ったアプリはあまり意味が無かった。笑

androidって、いろんなアプリをダウンロードして遊べるのが面白いのに、そのアプリのせいでバッテリーがなくなっちゃうのは困ります。

操作中は問題となるアプリが動いてても問題なくて、スリープ中にそういうアプリが確実に終了してればいいので、タスクキラー系のアプリを使うことにしました。

不要なアプリを明示的に終了させることで、通勤時間や昼休みにtwitterやブラウザを結構使ったり、いろいろアプリダウンロードしたりしても、夕方6時ぐらいにバッテリーが70%ぐらい残るようになりました。これくらいの残量ならかなり安心。

根本的な解決のために、Googleはandroid developersサイトの開発ガイドに、省電力なアプリ開発のためのガイドラインを載せて欲しいです。

それでは、参考までに僕の設定を。

前提

・メールはGmailを使用。

・アドレス帳は自動同期せず、編集時だけ手動で同期。

・カレンダーは同期しない。

・Timescapeは使わない。

・プリインストール以外で日常的に使うアプリ

 - CliphWeather : 天気予報ウィジェット

 - twicca : twitterクライアント

 - GoMarks : Googleブックマークへのアクセス

 - Simeji : インプットメソッド

 - Battery Indicator : ステータスバーに電池残量を表示

 - Automatic Task Killer : タスクキラー

 - Advanced Task Manager : タスクキラー

タスクキラーの設定

方針1.

頻繁に使う(&信用できる)アプリ、常駐して無いと意味が無いアプリ、必要そうなプリインストールアプリを残して、それ以外は Advanced Task Manager を使って適当なタイミングで手動で終了。デスクトップにタスク終了用のウィジェットを設置。

Excludeの設定をしたApps: (終了しないもの)

(プリインストール)
  Wiper App
  Face Recognition Ser...
  Service Account Prov...
  ソフトウェア更新
  android.bootinfo
  アラーム
  sonyericsson.learningclient
  Gmail
(インストールしたもの)
  Simeji
  Battery Indicator
  CliphWeather
  Automatic Task Killer
  Advanced Task Manager

Excludeの設定をしたServices: (終了しないもの)

(プリインストール)
  Wiper
  FaceRecognitionServi...
  StkAppService
  service.GTaklService
  BluetoothHeadsetServ...
(インストールしたもの)
  RefleshService (CliphWeatherのアイコン)
  MainService (Automatic Task Killerのアイコン)
  BatteryIndicatorServ... (Battery Indicatorのアイコン)

※AllAppsはいじってません。

方針2.

手動で終了させるのを忘れたときのために、Automatic Task Killer を使ってスリープに入るときに、下記"以外"のアプリを自動で終了。

(終了しないもの)

(プリインストール)
  Gmail
  アラーム
(インストールしたもの)
  Advanced Task Manager
  Battery Indicator
  Simeji
方針3.

プリインストールのアプリで、使うことが無いと思われるものを、 Advanced Task Manager の Auto-End Apps Service を使って終了させる。

Auto-End Frequency : Every 30 mins
Auto-End Running Apps : チェックしない
Auto-End Apps List (終了させるもの)
・Moxier メール
・SNS Provider
・Timescape Plug-in M...
・Timescape Provider
・mixi
・カメラ
 (プリインストールでは2種類あり、撮影用じゃないほう。画像編集系?)
 (アイコンが正面じゃなくて左斜め下向いてるほう)

その他の設定

Wi-Fi : 外ではOFF ※ONだと結構電池消費しそう
・Bluetooth : 常にOFF
・ネットワークモード : WCDMAのみ
・タッチ操作音 : OFF
・選択時の操作音 : OFF
・SDカードの通知 : OFF
・画面の向き : OFF ※あまり影響なし?
・画面の明るさ : 自動調整OFF、明るさ低めに
・バックライト消灯 : 1分
・バックグラウンドデータ : OFF ※あまり影響なし?
・Gmailの同期 : ON
・サービス設定 : Google以外は登録しない
・位置情報(ワイヤレスネットワーク) : ON
・位置情報(GPS機能) : 普段はOFF ※ONでもあまり変わらない?
・Googleと共有 : OFF

Wi-FiとGPSはONにしたいときもあるので、デスクトップにプリインストールのクイック設定ウィジェットを置いています。

タスクキラーとクイック設定以外のウィジェットは、置いてません。時計も外して様子を見てます。


---2010/05/14 1:20追記---

1日たったらまた電池の消費が増えた。。。

念のため、下記のアプリも自動停止するようにしました。

上の設定も修正済み。

方針1.

  マップ
  マーケット
  設定
  電話帳

方針2.

  マーケット
  設定
  電話帳

2010-05-09

androidアプリ開発はじめました

GW中にXperiaを買ったので、早速アプリ開発にも着手。

Xperia(に限らずスマートフォン全般だと思いますが)、電池の持ちが悪いので、常駐して動く余計なプロセスがないか気になります。

そこで、任意の区間での各プロセスのCPU使用時間を計測するアプリを作ろうとしています。

とりあえず、検証用に作ったもの。(野良アプリの直リンクです)

http://inutch.net/droid/ListProcStat.apk

「get stat」ボタンを押すと、

プロセス名(スレッド名),utime,stime

のフォーマットで出力されます。

utime: ユーザモードでのCPU使用時間

stime: カーネルモードでのCPU使用時間

やってることは、単に /proc ファイルシステムの中身を読んで整形しているだけです。

これだけじゃ何もわからないですが、間隔を置いて2回測定して、「send」ボタンでPCに内容をメールで送信して、PC側でEXCELとか使って2点間の差分を取れば、各プロセス/スレッドに対して、その区間のCPU使用時間がわかります。

※自分用に作ってるので、TO: のメールアドレスがデフォルトで僕のアドレスになっています。ご注意ください。

#なんか、普段仕事でやってることと変わらない気が・・・

これから、アプリとして単体で使えるように作りこんでいきます。

  • (済)測定開始時と測定終了時のデータをそれぞれ保持して差分を表示するようにする。
  • (済) /proc の読み込みはGUIとは別スレッドで。
  • プロセス名(パッケージ名)→アプリケーション名への変換。(わかりやすいように)
  • (済)表示のフィルタリング。(スレッドもすべて/プロセスのみ、全プロセス/動いたプロセスだけ、など)
  • GUIのデザイン。
  • 測定開始時の値を永続化してこのアプリ自体がkillされてもいいようにする。
  • 定期的な測定機能の追加。

ある程度アプリとしての体裁が整ってからMarketに載せます。

--- 2010/05/09 20:55追記 ---

上の(済)の機能は作りました。 

utime,stimeは区別しても意味が無いので、合計して表示するように変更しています。

ソート結果が見やすいように、

CPU使用時間[タブ]プロセス名(スレッド名)

と表示順序を変更しています。

http://inutch.net/droid/ListProcStat.apk

2010-04-04

CGIでのperlプロファイリングを簡単に

昔書いたperlのCGIが、データが増えてくると重いことがわかって、まあだいたい重い場所は見当がついてるけど、一応プロファイリングして確認しておこうと思いまして、perlのプロファイラを調べてみた。Devel::DProf と、Devel::Profile がよく使われてるみたい。

Devel::DProf http://search.cpan.org/~ilyaz/DProf-19990108/DProf.pm

Devel::Profile http://search.cpan.org/~jaw/Devel-Profile-1.05/Profile.pm

Dprofは、結果の表示に別コマンドが必要だけど、Profileは直接読みやすいフォーマットで出力してくれるみたいだから、Devel::Profileがいいな。

使い方は、

$ perl -d:Profile foo.pl

ってやるだけで、カレントディレクトリに prof.out っていうファイルが出力されます。

ただ、これだと、コマンドラインでは使えるけど、CGIのプロファイリングが出来ない。

Apache::DProf http://search.cpan.org/~FWILES/Apache-DB-0.10/lib/Apache/DProf.pm

はなんか準備が面倒だしなあ、、、と思ってたら、下記の記事を発見。

http://metatoys.org/propella/tips/Devel_DProf.html

そうか!perlの先頭行のパスの指定にオプションつけちゃえばいいんだ!

記事ではDProfでしたが、Profileでも同じことが出来ました(当然ですが)。

Windows上で、Apache+ActivePerlでテストするときは、先頭行は、

#!C:/perl/bin/perl

と書かないといけないので、そこにオプションをつけて、

#!C:/perl/bin/perl -d:Profile

としました。

2009-09-02

IEでFlashVarsにJSONを渡すとダブルクォーテーションで切れる件

mixiアプリで、FlashVarsにJSON文字列を渡して、ActionScript側でデコードしようとして、ほかのブラウザではうまくいったのにIEだけ、ダブルクォーテーションで切れてしまう事に悩んでいたところ、下記の記事で文字列参照すればよいことがわかりました。

http://c-brains.jp/blog/wsg/09/01/15-202601.php

ただし、IE以外ではこれをやると逆にエラーになるので、下記のようにIE限定の対処としました。

  var json_str = JSON.stringify(json_obj);
  if( navigator.userAgent.toLowerCase().indexOf("msie") != -1 ){
    json_str = json_str.replace(/"/g,""");
  }
  var flashvars = {
    json: json_str
  };

mixiアプリ作りました

SmoothAlbum

http://mixi.jp/view_appli.pl?id=7540

前作ったFlashのフォトアルバムの使いまわしですが・・・。

2009-02-19

Loaderで読み込んだ外部画像ファイルにスムージングをかける

ActionScript3 でコーディングしてて、Loader で読み込んだ外部の画像ファイルにスムージングをかけたくて、Loader の smoothing プロパティを探したけど無かったので、簡単なやり方を考えました。

Loader の Event.COMPLETE のイベントハンドラに下記の1行を加えるだけ。

protected function loaderCompleteHandler(event:Event):void {
    Bitmap(event.target.content).smoothing = true;
}