Androidのプロセス回収


自動回転
Androidのプロセスはホストであり、システムのプロセス空間が緊張している場合、優先順位に従って自動的にプロセスの回収を行います。
ここから三つの問題を持ってきました。
回収ルール:  いつ回収しますか?どれを回収しますか?
誤殺を避ける:  回収を阻止するにはどうすればいいですか?
データの復元と保存:  回収されました。どうすればいいですか?
 
Androidはプロセスを6段階に分けて、優先順位は高い順から低い順に次のようになります。
1.フロントプロセス(FOREGROUND UAPP)2.テレビプロセス(VISIBLEuAPP)3.セカンダリサービスプロセス(SECONDARYUSERVER)4.バックグラウンドプロセス(HIDDEN_APP)5.コンテンツ供給ノード(CONTENT_UPROVIDER)6.空プロセス(EMPTYuAPP)
特徴:
1.プロセスの中にserviceと視覚的なactivityが同時に含まれるなら、このプロセスはserviceプロセスではなく可視プロセスに帰すべきです。
2.また、他のプロセスがそれに依存しているなら、プロセスのレベルを高めることができます。例えば、AプロセスのserviceはBプロセスのコンポーネントにバインドされています。プロセスAは常にBプロセスと同じくらい重要であると考えられます。
3.システム中のphoneサービスはセカンダリサービスではなくフロントプロセスに分けられます。
 
androidで進行するoom_adj値はその優先度を表している。
oom_adj値が高いほど、プロセスの優先度が低いことを表す。 
adb shell cat/proc//oom_adjはあるプロセスの現在のoom_を調べます。adj値
プロセスoom_adj値の更新:
and roidプロセスのoom_adjはActivityManagerServiceで更新されます。
updateOomAdjLocked() =>
int adj = computeOomAdjLocked(app, hiddenAdj, TOP_APP, false);

Process.setOomAdj(app.pid, adj) =>

android_os_Process_setOomAdj //android_util_Process.cpp
プロセス回収lowmemorykiller:
lowmemorykiller.cのlowmem_を参照してください。shrink関数は、どのプロセスが回収されるかを計算し、SIGKILL信号を送信します。
    if (selected) {
        lowmem_print(1, "send sigkill to %d (%s), adj %d, size %d
", selected->pid, selected->comm, selected_oom_adj, selected_tasksize); lowmem_deathpending = selected; lowmem_deathpending_timeout = jiffies + HZ; force_sig(SIGKILL, selected);   nr_samples--; rem -= selected_tasksize; }
oom_adjレベルはinit.rcに設定されています。
# Define the memory thresholds at which the above process classes will
# be killed.  These numbers are in pages (4k).
    setprop ro.FOREGROUND_APP_ADJ 0
    setprop ro.VISIBLE_APP_ADJ 1
    setprop ro.SECONDARY_SERVER_ADJ 2
    setprop ro.HIDDEN_APP_MIN_ADJ 7
    setprop ro.CONTENT_PROVIDER_ADJ 14
    setprop ro.EMPTY_APP_ADJ 15
init.rcでは、PIDを1とするプロセス(initプロセス)のoom_adj設定は-16:
    # Set init its forked children's oom_adj.
    write /proc/1/oom_adj -16
本機の設定を確認します。cat/sys/module/lowmemorykiller/parameters/adj
0,1,2,7,14,15
 
回収タイミング:
init.rc中:
# Write value must be consistent with the above properties.
# Note that the driver only supports 6 slots, so we have combined some of
# the classes into the same memory level; the associated processes of higher
# classes will still be killed first.
    setprop ro.FOREGROUND_APP_MEM 1536
    setprop ro.VISIBLE_APP_MEM 2048
    setprop ro.SECONDARY_SERVER_MEM 4096
    setprop ro.HIDDEN_APP_MEM 5120
    setprop ro.CONTENT_PROVIDER_MEM 5632
    setprop ro.EMPTY_APP_MEM 6144
これらの数字は対応するメモリのしきい値です。この値を下回ると、Androidは処理を順番にオフにします。これらの数字の単位はpageです。  1 page=4 kB.
上の6つの数字が対応しているのは(MB)です。6,8,16,20,22,24
現在の設定を確認してもいいです。
cat/sys/module/lowmemorykiller/parameters/minfree
この値を再設定するには(異なる需要に対応):
echo「1536,2048,4096,5120,153660,2340」>/sys/module/lowmemorykiller/parameters/minfree
このように、利用可能メモリが90 MB以下の場合には、空きプロセスが開始され、利用可能メモリが60 MB以下の場合には、コンテンツ供給ノードが終了する。
具体的な回収はActivityManagerService.javaの関数trimAppliations()で実現されます。
1.まず、Packageが移動された無駄なプロセスを削除します。
2.プロセスの現在の状態に基づいて、oom_を更新します。adj値は、次のように動作する。
activityが実行されていないプロセスを削除します。
APがすべてのactivity状態を保存した場合、このAPを終了する。
3.最後に、まだたくさんのactivitiesが運行しているなら、それらのactivity状態がすでに保存されているactivityを除去します。
 
システムメモリが不足しているときに、AndroidのLow Memory Killerは必要に応じて、そのメモリをリリースします。つまり、最適なプロセスを探して殺します。
最適:
•oom_adjが大きいほど
•物理メモリの占用が多い
 
LRUリストを表示します。Adb shell dumpsys activity
activitydemoがフロントにいる時:
Serviceを含むプロセスの優先度が高く、computeOom Adj Lockedにあります。
中将は2つの小分類に分類されます。
static final int MAX_SERVICE_INACT IVITY=30*60*1000;                  
 if(now<(s.lastActivity+MAX){SERVICEClity}{
if(adj)SECONDARYUSERVERUADJ){
                            adj=SECONDARYUSERVERUADJ;
                            app.adjType=「started-services」
                            app.hidden=false
                        }
                    }
if(adj)SECONDARYUSERVERUADJ){
                        app.adjType=「started-bg-services」
                    }
)
 
完全にキルにプロセスをさせないのは不可能です。いくつかの操作を通じて、キルルにプロセスを小さくすることができます。
1プロセスの優先度を上げる:
バックグラウンド操作はService形式を採用しています。一つのプロセスは一つのバックグラウンドactivityを実行しているレベルより高いです。
2 backキーを押すと、プロセス中のactivityはdestoryではなくバックグラウンドで動作します。backボタンを再搭載する必要があります。
3他の優先度の高いプロセスに依存します。
 
プロセスの属性を強制的に変更します。
プログラムにset Persistent(true)を設定します。
projectのAndroid Manifest.xmlの「aplication」に属性androidを追加します。persistent=「true」
android:persistent(SDK)
    Whether or not the appication shoud remand running at all times.The default value is「false」.Application s shound normally set this flags;persistence mode is inted only for certain system.system.system.systremation。
 
1.killProcess(int pid)を使って指定PIDのプロセスを殺すことができます。
public void onClick(View v)                 
   android.os.Process.killProcess(android.os.Process.myPid);
)
System.exit(0)を使うと、同じ効果が得られます。
 
2.finishを使って、現在のactivityを殺すことができます。
 
1.資料を保存する:毎回ActivityでonPauseまたは
ワンストップ状態の時はまず資料を保存して、それからOCreateの時に資本金を使います。
生命周期の方法。
2.OnSaveInstance State(ライフサイクル以外の方法)
オンストリップInstance State