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
以上、ソースコードをざっとながめてみたメモです。