2011年04月19日
AndroidのSystemServerの起動シーケンス(メモ)
SystemServerが起動して各種のサービスが起動するまでのシーケンスをメモしました。
(参照したソースはandroid-2.3.3_r1)
initからapp_processを起動。
init.rc
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media onrestart restart netd
frameworks/base/cmds/app_process/app_main.cpp::main
if (0 == strcmp("--zygote", arg)) { bool startSystemServer = (i < argc) ? strcmp(argv[i], "--start-system-server") == 0 : false; setArgv0(argv0, "zygote"); set_process_name("zygote"); runtime.start("com.android.internal.os.ZygoteInit", startSystemServer); } else {
frameworks/base/core/jni/AndroidRuntime.cpp::start
void AndroidRuntime::start(const char* className, const bool startSystemServer) { LOGD("\n>>>>>> AndroidRuntime START %s <<<<<<\n", className != NULL ? className : "(unknown)"); ... JNIでcallStatic com.android.internal.os.ZygoteInit#main
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java#main
if (argv[1].equals("true")) { startSystemServer(); } else if (!argv[1].equals("false")) { throw new RuntimeException(argv[0] + USAGE_STRING); }
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java#startSystemServer
String args[] = { "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,3001,3002,3003", "--capabilities=130104352,130104352", "--runtime-init", "--nice-name=system_server", "com.android.server.SystemServer", }; ... try { parsedArgs = new ZygoteConnection.Arguments(args); ... /* Request to fork the system server process */ pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities);
framesorks/base/services/java/com/android/server/SystemServer.java
SystemServer#main
public static void main(String[] args) { ... System.loadLibrary("android_servers"); init1(args); // <-- native method }
frameworks/base/services/jni/com_android_server_SystemServer.cpp
static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz) { system_init(); }
frameworks/base/cmds/system_server/library/system_init.cpp
system_init
C++で書いてあるサービスを起動。
- SurfaceFlinger
- SensorService
- AudioFlinger
- MediaPlayerService
- CameraService
- AudioPolicyService
JNIでcallStatic com/android/server/SystemServer#init2
framesorks/base/services/java/com/android/server/SystemServer.java
public static final void init2() { Slog.i(TAG, "Entered the Android system server!"); Thread thr = new ServerThread(); thr.setName("android.server.ServerThread"); thr.start(); }
ServerThread#run
Javaで書いてあるサービスを起動。
- Entropy Service
- Power Manager
- Activity Manager
- Telephony Registry
- Package Manager
- Account Manager
- Content Manger
- System Content Providers
- Battery Service
- Lights Service
- Vibrator Service
- Alarm Manager
- Init Watchdog
- Window Manager
- Bluetooth Service
- Device Policy
- Status Bar
- Clipboard Service
- Input Method Service
- NetStat Service
- NetworkMnagement Service
- Connectivity Service
- Throttle Service
- Accessibility Manager
- Mount Service
- Notification Manager
- Device Storage Monitor
- Location Manager
- Search Service
- DropBox Service
- Wallpaper Service
- Audio Service
- Headset Observer
- Dock Observer
- USB Observer
- UI Mode Manager Service
- Backup Service
- AppWidget Service
- Recognition Service
- DiskStats Service
これらのサービスは必要に応じてそれぞれスレッドを生成しますが、全てSystemServerのプロセスの中で動いています。
普通のLinuxシステムならデーモンはそれぞれ独立したプロセスになっているのと対照的です。