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を返してると思われる。
 
0 件のコメント:
コメントを投稿