ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

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しているところを見つけるまで読む予定。