昨日の Android Bazaar and Conference 2011 Summer の出村さんのセッション「Linuxカーネルから紐解くAndroid」で、Android の Low Memory Killer の話を聴きました。Androidでは裏に回ったアプリはそのままスリープした状態で残っておりメモリが足りなくなるとOSが自動的にKillする、というくらいの知識はあったのですが、具体的な優先順位などの話があり興味深いものでした。
優先順位は init.rc の中で定義されているとのことで、Galaxy S2でも確認してみました。以下のように書かれていました。
講演のスライドとだいたい同じですが、CONTENT_PROVIDER が無いようです。あとプロセスをKILLする閾値は多少大きいようです。
読み方は、メモリが 4K * 6144ページ = 24576K 以下になったら (裏に回っている)ホームアプリを KILLする、ということでいいのかな?
FOREGROUND_APPは前面で動作中のアプリ、VISIBLE_APPはユーザから見えているアプリ、PERCEPTIBLE_APPはユーザから認識可能なアプリだそうです。例えば、バックグラウンドで音楽を再生するアプリがそうです。HEAVY_WEIGHT_APPはウェイトが高いということでしょうけどよくわかりません。SECONDARY_SERVERは何だろう。BACKUP_APP は何かデータをバックアップするアプリ? HOME_APPはホームアプリ。HIDDEN_APPはいわゆる裏に回った普通のアプリですね。EMPTY_APPは何?からっぽのアプリ?
Androidで裏に回ったアプリ(というかプロセス)を殺すにあたっては、結構、細かい種類に分けて管理しているということがわかりました。
あと、サービスはこれとは別扱いになっていて、OSからは殺されないはずです。