Androidを支える技術<II>輪読会 5.2.5
日付:3/2?
章:3.2.5
調査者:takasshii.icon
runOnce
概要
❶ プロセスをfork
❷ setUIDをする
❸ 指定されたクラスをロードしてmain()メソッドを呼び出す
詳細な内容
ZygoteのソケットにProcessのstart()が書き込む(アプリの起動と同じ関数)
引数として以下を渡す
fork処理
ActivityThread(アプリの起動を行うクラス)を渡す
setUID処理
PackageManagerServiceのresolveIntent()
resolveIntent() uidを受け取る ---> startViaZygote() 適当な文字列にパース ---> プロセス生成
forkとsetUIDはJNIで処理されている
handleChildProc()
概要
❶ Zygote関連のサーバーソケットをclose
❷ AppRuntimeのonZygoteInit()呼び出しによるBinderの初期化を行う
❸ 指定されたクラスのmain()メソッドをMethodAndArgsCaller exceptionに詰めてthrowする
❹ スタックが巻き戻されてトップレベルのcatchでこのexceptionに入っているmain()メソッドを呼び出す
startSystemServer()について(大分前に戻って起動に必要なSystemServerの話)
高い権限を持ったまま、関連したサービスがコードなどのメモリを共有するには?
概要
❶ プロセスをfork
❷ uid 1000にsetuid(1000はハードコード)
takasshii.iconidが1000はsystemappだよ
❸ 子プロセスでAppRuntimeのonZygoteInit()呼び出しによるBinderの初期化などを行う
❹ com.android.server.SystemServerクラスをロードしてmain()メソッドをMethodAndArgsCallerに詰めてthrowを実行
起動するもの
大きく分けて3つ
Bootstrap
相互に依存関係の強いサービスを同時に起動するためのメソッド
ActivityManagerService、PackageManagerService
Core
起動に他のサービスとの依存があまりない、独立したもの
LightService、BatteryService、UsageStatsService
その他の3つ
startOtherServices()
TelecomLoaderService、AccountManagerService、InputManagerService、WindowManagerService他
応用
code:sample.kt
質疑応答