ActivityManagerService.java の中の updateOomAdjLocked()
は、Android の動作中に頻繁に呼び出され、バックグラウンドで走っているプロセスが多くなると、プロセスを自動的に kill するようになっています。
引数なしの updateOomAdjLocked()
の最後の方で、numHidden
の値をダンプするようにすれば、その瞬間にいくつの hidden
プロセスが存在するか調べられます。
基本的には動的に計算される adj の値は 0~15 の範囲になりますが、アプリケーションのフラグとして SYSTEM
と PERSISTENT
が設定されている場合は、CORE_SERVER_ADJ (-12)
が採用されるようです。
final ProcessRecord appAppLocked(ApplicationInfo info) {
...
if ((info.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_PERSISTENT))
== (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent = true;
app.maxAdj = CORE_SERVER_ADJ; // ★
}
...
}
絶対に kill されてはいけない電源管理系のサービスなどは、このフラグを設定しておかなければいけません。
ApplicationInfo.FLAG_SYSTEM
の方は、プリインストールアプリ (/system/app/*
) の場合は自動で付加され、ApplicationInfo.FLAG_PERSISTENT
の方は、AndroidManifest.xml の application 要素で以下のように設定するようです。
...
<application ... android:persistent="true">
...