Zygoteは、/system/bin/app_processを使って起動されるすべてのVMプロセスの親となるプロセスで、起動時にオプション --start-system-serverの引数が渡されると、起動時にsystem_processという名前の子プロセスを生成するように実装されています。
system_processは、Zygoteをコピーして生成されたAndroidの中枢を担うシステム用のVMプロセスで、Java側の各種サービススレッド群は、すべてこのsystem_processのスレッドとして生成されます。
DBMSを使ってスレッドの一覧を取得できます。
*1 |
結構たくさんのスレッドが立ってますね。
勉強会でも話した内容ですが、ここまでの流れを簡単に述べると
- kernelが/initを起動する
- /initがinit.rcに従い /system/bin/app_process(Zygote) を --start-system-server引数付きで起動する
- app_processがfork後、com.android.server.SystemServer#main を実行する(system_server)
- com.android.server.SystemServer#main が android_server_SystemServer_init1(JNIEnv* env, jobject clazz)をJNI経由で呼び出し
- android_server_SystemServer_init1() が system_init()を呼び出し
- system_init()では Surfaceflingerのinstantiate等を行った後、SystemServer#init2をコールバック
- SystemServer#init2が、 amdrpod.server.ServerThreadを生成、runする。
- ServerThreadが各種サービス・マネージャー関連を生成、登録していく。それっぽい箇所を抜き出してみると
- new EntropyService()
- new PowerManagerService()
- ActivityManagerService.main()
- new TelephonyRegistry(context)
- AttributeCache.init(context)
- PackageManagerService.main()
- ActivityManagerService.setSystemProcess()
- context.getContentResolver()
- new AccountManagerService(context)
- ContentService.main()
- ActivityManagerService.installSystemProviders()
- new BatteryService(context)
- new LightsService(context)
- new VibratorService(context)
- PowerManagerService#init()
- new AlarmManagerService(context)
- Watchdog.getInstance().init()
- WindowManagerService.main()
- ((ActivityManagerService)ServiceManager.getService("activity").setWindowManager
- new BluetoothService(context)
- new BluetoothA2dpService()
- new DevicePolicyManagerService(context)
- new StatusBarManagerService(context)
- new ClipboardService(context)
- new InputMethodManagerService()
- new NetStatService()
- NetworkManagementService.create()
- ConnectivityService.getInstance()
- new ThrottleService(context)
- new AccessibilityManagerService(context)
- new MountService(context)
- new NotificationManagerService()
- new DeviceStorageMonitorService(context)
- new LocationManagerService(context)
- new SearchManagerService(context)
- new DropBoxManagerService()
- new WallpaperManagerService(context)
- new AudioService(context)
- new HeadsetObserver(context)
- new DockObserver()
- new UsbObserver(context)
- new UiModeManagerService(context)
- new BackupManagerService(context)
- new AppWidgetService(context)
- new RecognitionManagerService(context)
- new DiskStatsService(context)
- new AdbSettingsObserver
- VMRuntime.getRuntime().startJitCompilation()
- この後、生成したサービスの一部のsystemReady()メソッドを実行していく
- Looper.loop()
とまぁ、こんな処理が長々と一つのメソッドに・・・・長いわ!と途中で放り投げたくなるところでしたけど。余所からアクセスできるようにするものは、ServiceManager#addServiceしています。とりあえず緑にしておきました。なお、メソッドがstaticか否かまで確かめ切れていないので、色々記載に間違いがある気もしていますが・・・とりあえずメモ書きレベルだということでお許し下さい。
名前からもなんとなく想像がつきますが、Threadは、これらのクラス群の処理の中で生成、runされていくのではないでしょうか。近いうちにこのあたりも追いかけてみたいなと思います。
さて、このsystem_processも重要なのですが、先日psコマンドの一覧をtreeにして日記にあげた通り、他のJavaアプリケーションも、それぞれZygoteを親として生成されたVMプロセスとして動作しています。
- jp.co.omronsoft.openwnn
- com.android.phone
- com.android.systemui
- com.android.launcher
- android.process.acore
- com.android.mms
- android.process.media
- com.android.deskclock
- com.android.email
- com.android.protips
- com.android.music
- com.android.quicksearchbox
ここで気になるのが、第三回の勉強会で @l_b__ さんが疑問視されていた、Javaアプリを起動しているのは誰?という話です。
Zygoteが親なので、fork自体はZygoteプロセスなのでしょうが、誰がどのように起動しているものやら。このあたりも追いかけて次回のPF部のお題にあげたいところだったりします。