2011年01月13日

AndroidのPower Management (メモ2)

前回の続きです。

まとまっていませんが、メモを残します。



状態遷移

通常状態 <-> スリープ <-> サスペンド

このうち、スリープ <-> サスペンドはカーネル内部で自発的に行いますが、通常状態 <-> スリープの間の遷移はユーザーランド側からの指示によって行われています。

このため、前回サスペンドからの復帰のためにCPUに割り込みをかけてwakelockしただけではスリープまでしか戻らず、キーのイベントを発行して、ユーザーランド側から通常状態に戻るように指示が出させる必要がありました。

この状態遷移の指示は /sys/power/state への書き込みで行います。

コンソールのshellから以下のコマンドを打ち込めば、手動でこれを行うことができます。

通常状態からスリープへ

# echo mem > /sys/power/state

スリープから通常状態へ

# echo on > /sys/power/state

ソースコードの探索

上記のように /sys/power/state への書き込みは以下で行っています。

hardware/libhardware_legacy/power/power.c

関数 int set_screen_state(int on)

これを呼んでいるところをさかのぼると

frameworks/base/core/jni/android_os_Power.cpp

これはJNIによってJavaから呼び出されます。

frameworks/base/core/java/andorid/os/Power.java

  public static native int setScreenState(boolean on);
  public static native void acquireWakeLock(int lock, String id)
  public static native void releaseWakeLock(String id)

これらのメソッドを使って実際の管理を行っているのは

frameworks/base/services/java/com/android/server/PowerManagerService.java

Settingsのメニューで設定したScreenTimeoutの時間でスレッドを待機させています。

なお、このサービスはsystem_serverのプロセスで動いていて、これをnew してサービスとして登録しているのは

frameworks/base/services/java/com/android/server/SystemServer.java

以上、ソースコードをざっとながめてみたメモです。



トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード