Androidを支える技術<II> 5.7, 5.8章
日付:3/28
章:5.7, 5.8
調査者:ichimura.icon
章のまとめ
どんな内容が書かれているか?
startActivity関連のこと
ここまでの全体的な振り返り
ひとつひとつがまとまっていたので、そのまま箇条書きに起こす感じになっています。
startActivity()の呼び出しから見る、アプリ起動時に起こること
intentの解決
intentを初期化してstartActiity()を呼ぶとアプリが起動する
startActivity()は、ActivityManagerServiceが主に処理を行う
インテントを解決して、起動すべきActivityを決める
インテントを解決するのはPackageManagerService
起動時でpackage.xmlを読み込んで、apkファイルをスキャン、intent-filterのデータ構造を作成
ActivityManagerServiceがintentを引数にこのPackageManagerServiceのresolveIntent()を呼び出すと、intentにマッチしたActivityの情報を返す
プロセスの開始と初期化
ActivityManagerServiceは、この解決したActivityの情報をもとにActivityRecordのデータを作成してActivityStackに積む
ActivityRecordのデータをもとに、Process.start()を呼び出す
Process.start()はZygoteに新たなプロセスを生成するメッセージを送信
Zygoteサービスに、uidと起動時に呼ぶJavaのmain()メソッドを指示すると、Zygoteをforkした後にそのuidにsetuid()してmainメソッドを呼ぶ
ここで渡すuidはPackageManagerServiceが解決してくれたアプリのuid
ActivityThreadのmain()メソッドはattach()メソッドを呼び出して、ActivityRecordに対応したapkクラスをロードし、Activityを作成する
この時ActivityStackのトップが新しくなるため、それまでトップにいたプロセスのoom_score_adjを更新する
oom_score_adjによるプロセスkill
ActivityManagerServiceがoom_score_adjのスコアを更新するためにはlmkdにLMK_PROCPRIOコマンドを送信する
前面に出ているアプリに低いスコア、一つ前に使っていたアプリはそれよあり高いスコアが設定され、2つ前はさらに高いスコア...となっていく
Linuxカーネルがメモリ不足と判断するとキャッシュ解放のためにshrink_slab()を呼び出してlowmemorykillerドライバのshink_slab()からlowmemorykillerドライバのshinkerが起動する
このドライバがoom_score_adjの高いプロセスからkillしていく
shink_slab()が間に合わない時はOOM Killerが発動する
この時もoom_score_adjの高いプロセスが優先的にkillされていく
まとめ
プロセスの作成はZygoteと呼ばれるサービスがおこなっていた
app_processがバイトコード実行環境を起動するコマンド名で、app_processでZygoteクラスを実行することで、Zygoteサービスが実現していた
Zygoteサービスはuidとクラスを指定されるとプロセスをforkした上で、指定されたuidにsetuid()し、指定されたクラスをロードしてmain()を実行する。
こうすることでバイトコード実行環境の初期化などが終わったところから新しいプロセスの処理を始められるため、高速にアプリを開始できる
システムサービスで共通に使うクラスライブラリのメモリはforkにより共有されているため、メモリ節約ができる
生成されたアプリプロセスが最初に実行するクラスが、ActivityThread
重要なmain()、attach()、handleMessage()の3つで構成される
main()メソッドがアプリの開始となるメソッドで、Looperを用いてメッセージループを回し、ActivityThreadのインスタンスを作ってattach()メソッドを呼び出す
インスタンスを作る過程でHとApplicationThreadという2つ内部クラスが関わる
attach()メソッドがapkの情報をもとにApplicationやApplicaitonContextを作る
handleMessage()メソッドがActivityのライフサイクル関連の処理をアプリ側のプロセスで行っている
応用
code:sample.kt
質疑応答