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しているところを見つけるまで読む予定。
0 件のコメント:
コメントを投稿