2011年1月20日木曜日

system_process以降

さて、先日に引き続き、initから先です。

第4回横浜PF部の勉強会(init 祭り)においては、Zygoteの非常に複雑な起動の仕組みを紹介しました。ただ、この時点では学習不足もあってZygoteとsystem_processをあまり分けて考えていませんでした。

Zygoteは、/system/bin/app_processを使って起動されるすべてのVMプロセスの親となるプロセスで、起動時にオプション --start-system-serverの引数が渡されると、起動時にsystem_processという名前の子プロセスを生成するように実装されています。

system_processは、Zygoteをコピーして生成されたAndroidの中枢を担うシステム用のVMプロセスで、Java側の各種サービススレッド群は、すべてこのsystem_processのスレッドとして生成されます。

DBMSを使ってスレッドの一覧を取得できます。

*159native6937main
*260vmwait21341HeapWorker
*361vmwait10618GC
*462vmwait00Signal Catcher
*563running138431JDWP
*664vmwait7654Compiler
765native10Binder Thread #1
866native00Binder Thread #2
971native479150android.server.ServerThread
1072native248311ActivityManager
1176timed-wait1921ProcessStats
1277native165PackageManager
1378native00FileObserver
1479native00AccountManagerService
1581native00SyncHandlerThread
1686native5510AlarmManager
1783native01UEventObserver
1884native10PowerManagerService.mScreenOffThread
1985native50PowerManagerService
2087native162WindowManager
2188native70664WindowManagerPolicy
2289native13InputDispatcher
2390native20InputReader
2491native44NetdConnector
2594native00WifiService
2692native60ConnectivityThread
2795native00Tethering
2896native00MountService
2997native40VoldConnector
3099native00AudioService
31101native00SoundPool
32102native00SoundPoolThread
33103native00backup
34107timed-wait717watchdog
35110native21LocationManagerService
36111native2113ThrottleService
37122native00GpsLocationProvider
38160native00Binder Thread #3
39163native00Binder Thread #4
40164native30Binder Thread #5
42292native00Binder Thread #9
44231native00Binder Thread #8
45217native00Binder Thread #6
46229native00Binder Thread #7
47293native00Binder Thread #10
48295native00Binder Thread #11

結構たくさんのスレッドが立ってますね。

勉強会でも話した内容ですが、ここまでの流れを簡単に述べると

  1. kernelが/initを起動する
  2. /initがinit.rcに従い /system/bin/app_process(Zygote) を --start-system-server引数付きで起動する
  3. app_processがfork後、com.android.server.SystemServer#main を実行する(system_server)
  4. com.android.server.SystemServer#main が android_server_SystemServer_init1(JNIEnv* env, jobject clazz)をJNI経由で呼び出し
  5. android_server_SystemServer_init1() が system_init()を呼び出し
  6. system_init()では Surfaceflingerのinstantiate等を行った後、SystemServer#init2をコールバック
  7. SystemServer#init2が、 amdrpod.server.ServerThreadを生成、runする。
  8. 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()
  9. この後、生成したサービスの一部のsystemReady()メソッドを実行していく
  10. 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部のお題にあげたいところだったりします。

0 件のコメント:

コメントを投稿