Androidを支える技術<II>輪読会テンプレート 4.3
日付:2024/02/22
章:4.3
調査者:ichimura.icon
章のまとめ
どんな内容が書かれているか?
4.3Activityの生成
4.3.1 ActivityStackとActivityRecord
4.1での説明
Activityのライフサイクルと密接に関わる
標準となる、Activity間の画面遷移を管理する専用クラス
カスタマイズする仕組みも豊富に用意されている
3.3の説明
現在どのプロセスが大切かを判断する
このクラスは、Activity、Service、およびそれらを含むプロセスに関する情報を提供し、それらと対話します。
本節の説明
プロセスkill(lowMemoryKillerなど)されたActivityを再生成する
Activityを再生成するには、どこかに復元のための情報を保持する必要がある
必要最小限の情報で保持する
ActivityStackの中にある
図1.17参照
Activityの情報だけ持つ値だけのクラス
つまり、ActivityStack内にあるActivityRecordを参照することで、AcitivityManagerServiceがAcitivityを再生成できる
4.3.2 BundleとActivityプロセスの挙動
そんなActivityRecordはアプリ開発者が関われない
システムが勝手に生成するから
でもそういえば、Activityは復旧情報を保存するためのBundleがある
Bundleはkey/valueを保存するもの
プロセスkillされるActivityの挙動はどうなる?
Activityはプロセス自体が消え、メモリ上の変数なども無くなる
Bundleはどう保持してる?
SystemServerプロセスのメモリ上に保持される
図4.18参照
ActivityManagerServiceとActivityStackを保持する
Bundleの挙動
図4.19、図4.20参照
1. bundleはアプリプロセスで"生成"される
ActivityThreadのhandleStopActivity()
2. Bundleに値を"詰める"
ActivityのonSaveInstanceState(値)
3. 値はBinderによってSystemServer内のAcitivtyStack内のActivityRecordに"保持"される
ActivityManagerServiceのactivityStopped()
SystemServerプロセスはプロセスなんで、OOM_KillerのKill対象となる
oom_score_adjは本気の-941
プロセスとしてはActivityを再構成するすべての情報が入っているので納得
ActivityRecordがActivityStackから取り除かれる(多分、ActivityManagerServiceによる再生成)とBundleと一緒に参照が無くなる
C言語やJavaのプログラム言語のローカル変数と一緒
4.3.3 Bundle(SystemServerプロセス)のkillされにくさ
ichimura.iconここで、どうやら表記のoom_score_adjの値とスコアは違うらしいtakasshii.icon👀
他のプロセスとスコア比較
参考4.2.2節
7 -> 1つ前に使っていたアプリ
6 -> ホームアプリ
0 -> 現在全面のアプリ
-16 -> SystemService
SystemServiceプロセスがkillされるのはアプリ全Killの後
つまり、BundleはActivityプロセスより安全なSystemServiceプロセス内のActivityRecordで保持されている。
4.3.4 ActivityRecordからのActivity生成
生成と再生成の挙動ははほぼ一緒で、プロセスが存在してるかどうかで変わる
再生成時でも、プロセスが存在している場合としてない場合がある
Activityは1つのアプリに複数存在できるため
ActivityのActivityRecordに対応するように、プロセスにもProsessRecordがある
ActivityRecordのプロセス版
こちらもSystemService内の、ActivityManagerServiceによって保持される
SystemServiceが再生成しようとする時、パッケージ名からProcessRecordがあるか確認する
プロセスが存在している場合
ProcessRecordが保持するActivityThreadのプロキシに対してAcitvity"生成"を依頼する
"ActivityThread"のscheduleLaunchActivity()
1.3節で「ActivityThreadというクラスがライフサイクル関連の作業をする」と説明 挙動の詳細は5.6節で
存在しない場合
ActivityManagerServiceがプロセスを"生成"する
Processのstart(entryPoint, プロセス生成に必要な引数うじゃうじゃ)を呼び出し
呼ばれるとZygoteに対してプロセス生成、entryPointのクラスをロードしてmain()実行を依頼
プロセスの初期化が終わったらActivityStackの一番上のActivityRecordを"取り出す"
ActivityManagerServiceのattachApplication()が呼ばれる
挙動の詳細は5.5.1節で
つまり、Activity再生成はProcessRecordとAcitivtyRecord2つを参照し、プロセスの有無に応じて行われる
まとめ
SystemServiceはActivityRecordとProcessRecordを保有するなどをする重要なプロセス
ActivityStack内にあるActivityRecordを参照することで、AcitivityManagerServiceがAcitivityを再生成できる
BundleもActivityプロセスより安全なSystemServiceプロセス内のActivityRecordで保持されている
Activity再生成はProcessRecordに加えてAcitivtyRecordも参照し、プロセスの有無に応じて行われる
応用
code:sample.kt
質疑応答