2011年07月14日
Androidのshutdownシーケンス
Android端末では電源を切るときには、電源キーを長押しするとシャットダウンのメニューが表示されて、そこから電源OFFを選択すると実際に電源が切れます。
これがどこで行われているのか、ソースコードを追いかけました。
シャットダウンのメニューの表示まで
電源キーの長押しのハンドリングをしているのはここ。
frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java
Runnable mPowerLongPress;
シャットダウンのダイアログはこれ。
frameworks/policies/base/phone/com/android/internal/policy/impl/GlobalActions.java
ここで電源オフが選択されると ShutdownThread.shutdown が呼ばれる。
シャットダウンの処理
frameworks/base/core/java/com/android/internal/app/ShutdownThread.java
beginShutdownSequenceを経由して、実際のシャットダウンの処理はrunの中で行われます。
- ACTION_SHUTDOWNのIntentをブロードキャストする。
- ActivityManagerサービスのshutdownを呼ぶ。
- Bluetoothサービスのdisableを呼ぶ。
- PhoneサービスのsetRadio(false)を呼ぶ。
- Mountサービスのshutdownを呼ぶ。
- バイブレータをふるわせる。
- Power.shutdown();
frameworks/base/core/java/android/os/Power.java
Power#shutdownはネイティブメソッド
frameworks/base/core/jni/android_os_Power.cpp
static void android_os_Power_shutdown(JNIEnv *env, jobject clazz) { sync(); #ifdef HAVE_ANDROID_OS reboot(RB_POWER_OFF); #endif }
sync, rebootはそれぞれシステムコールなので、Linuxカーネルの中でこれらの処理が行われます。