職場の大先輩におすすめされ、しかも貸してもらえた。
ActivityというAndroidのアプリケーション構成要素を軸に、スマホというモバイル家電でいかにマルチタスクシステムを矛盾なく構築したか、が書かれている。
書店でAndroidコーナーに行くとアプリケーション開発手法ばかりが取り上げられて
...続きを読むいる中で、純粋にAndroid内部について書かれた(しかも日本人原著の!)貴重な本。
Androidアプリ開発経験と、Linuxの知識がある人をメインの想定読者としているが、読み進める上で最低限必要なことはちゃんと説明してくれている。
コラムでは、著者がずっと関わってきた携帯ソフト開発業界の歴史などが書かれていて、それもそれだけで本にできるんじゃないかというぐらい面白い。
- メモリ不足対策
- スマホでは、ユーザがプロセスを明示的に終了することを期待できない上に、フラッシュストレージのデバイス特性により、スワップ領域を用意することもできないため、メモリが不足する状態が普通に発生する。
- そのため、メモリが不足したとき、Androidシステム上優先度の低いプロセスを自動で終了させる仕組みが必要となる。(例えば、裏に回ってしばらく使われていないActivityなど)
- Androidでは自動で終了させる仕組みは二段構えとなっており、少しメモリが不足してきたタイミングでAndroid独自ドライバによって行われるものと、かなりメモリが不足してきたタイミングでLinuxの提供するOOM killerによって行われるものとがある。
- どちらもoom_scoreに準じてどのプロセスを終了するかが選択される。
- lmkd : oom_scoreを調整するデーモンプロセス
- lowmemorykillerドライバ:linux kernelの提供するshrink_slab()を契機に、oom_scoreに準じてActivityを終了させる、Linux Kernel module。
- Activityの管理
- SystemServerプロセスのActivityManagerServiceクラスがActivityStackを管理する。
- 状態の変化に応じて、Activityにメッセージを送ったり、終了している場合はプロセスの再生成を行う。
- ActivityStackはActivityの再現に必要なすべての情報をもつActivityRecordを管理している。
- Activityの起動
- ZygoteサービスにActivityの起動依頼をしたら、zygoteサービスがforkし、setuidしたりlisten用のsocketを準備してから、指定したクラスのmainメソッドを呼び出す。
- 工夫
- 例外でスタックを巻き戻してから呼び出すことで、スタックを節約している(p.166)
- Java Runtimeを使うプロセスは(SystemServiceも)、app_processからforkすることで、実メモリを共有し、節約している