2012年3月16日金曜日

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を返してると思われる。

0 件のコメント:

コメントを投稿