startActivityの深層 前編
android-2.3.1_r1のソースコードを、Activity.startActivity()からアプリが起動するまでを追いかけてみる。
Activity startActivity() ↓ startActivityForResult() ↓ Instrumentation execStartActivity() ↓ IActivityManager startActivity() // BinderでIPC ↓ ---- プロセス境界 ---- ↓ ActivityManagerService startActivity() ↓ ActivityStack startActivityMayWait() ↓ ActivityManagerService startActivityLocked() ↓ startActivityUncheckedLocked() // この辺から汚すぎる… ↓ startActivityLocked(ActivityRecord r, ...) // 上のとはシグネチャ違う // ActivityRecord受け取る方 ↓ resumeTopActivityLocked() // すげー汚い… // プロセスを起動する初回パスと思われるところだけ追っかける ↓ startSpecificActivityLocked() ↓ startProcessLocked() ↓ startProcessLocked(ProcessRecord app, ...) // 上とはシグネチャが違う // ProcessRecord受け取る方 ↓ Process start() // これの戻り値がpid ↓ startViaZygote() ↓ zygoteSendArgsAndGetPid() // ここでsocketにwriteすると、pidがreadできるようだ // socketで別プロセスにプロセス生成を依頼している模様 // static main()を実行したいクラス名をsocketで渡すらしい
Processクラスのsocketの通信相手がforkしてpidを返してると思われる。
今回はここまで。
forkしているところを見つけるまで読む予定。