Androidの開発者ならば当然ご存知のように、そのアプリはシステムからいつkillされても良いように開発することが求められます。
この著作は、Androidがメモリ不足時にどのように動作するのかを詳細に解説しています。
以下、私の理解した範囲で要約してみたいと思います。
2.Androidのメモリ不足時の動作
(1) スマホにはスワップ機能はない
まず、スマホという環境は、WindowsなどのOSと異なり、スワップ機能がないのか基本です。それは、スマホなどの多くの機器では2次記憶は何らかの形のフラッシュメモリ(eMMCやmicroSDカード)であるためで、書き込みは遅くバッテリーも食い、しかも回数に制限があるからです。
(2) スマホは常にメモリ不足
そして、Android にはスワップがなく沢山のアプリがどんどん起動されるためにスマホにとっては現在でもメモリー不足はたまにしか起こらない異常事態ではなく、日常的に頻発する出来事なのです。
(3) 不要プロセスはkillされる
そして、AndroidはLinuxの上に構築されています。そこで、Linuxはシステムがメモリ不足で正常に動作しなくなる前に、Androidがメモリ不足になった時に、どのプロセスをkillするかを判断するのに使う仕組によって、メモリを解放するために積極的に不要なプロセスをkillします。
この時、システムがメモリ不足に陥った時にkillされるプロセスを選ぶ時の、プロセスのkillされやすさを表すパラメータとしてoom_score_adjという指標を基準にします。
そして、Linux がプロセスを kill するのはメモリー不足の最終段階ですが、Androidはそれよりも前の段階でメモリを解放するために積極的に不要なプロセスをkillします。
さらに詳しく見てみると まず、プロセスを Linux カーネルがkillするよりも前の段階にカーネルがファイルシステムにキャッシュの解放を依頼するフェーズがあります。ここでLowMemoryKillerドライバーが不要なアプリのプロセスをkillします。さらに Linux カーネルがプロセスを kill する段になった時は、 Android がoom_score_adj という kill しても良いプロセスを通知するスコアを設定することで Android としてkillしても良いと思うプロセスから Linux にkillされる仕組みとなっています。
(4) 不要Activityはkillされる
これを開発者の視点で見ると、要はActivityがkillされるということです。その基準は、 基本的にはそのプロセスが現在画面を占有している Activity を含んでいるかContentProviderを含んでいるかあるいは SDK のServiceを含んでいるかなどの情報を管理してそれらの情報から現在重要そうなプロセスを選択しLinuxにkillを依頼する仕組みとなっています。
このようにして、Androidは、ある程度余裕がある状態の時から頻繁に裏に行ったActivityのプロセスをkillしてメモリを開けていくことでシステムの正常稼働に必要な程度のメモリをいつも残しておくように努力しています。
私がこの項目を読んで思うのは、この話のキモは、その時点でAndroidにとって不要なActivityは、Androidがスコアを振り、そのスコアに基づいてもともと存在しているLinuxの不要部分を削除する仕組みに依頼してkillして貰っていることだと思います。
(5) Activityのライフサイクルへ続く
そして、頻繁に起きるメモリ不足によってkillされた多数のActivityが、ユーザーから見て、同時に多数動いているようにみせかける仕組みが「Activityのライフサイクル」ということになります。(あってるかな?)
この件については次回にします。