Android系統是基於Linux核心的,而Linux核心的第一個被啟動的程序為init程序。init程序啟動後會fork出Android的第一個程序zygote(受精卵)程序。為什麼叫這麼個名字?因為所有的應用程序都是由zygote程序fork出來的。而所有程序都會呼叫到attachApplication函式對ADJ進行初始化,attachApplication函式比較長,我們擷取與lmk相關的部分看下:
第495行:初始化curAdj、setAdj、verifiedAdj為INVALID_ADJ第507行:呼叫updateOomAdjLocked函式更新adj排程程序組SCHED_GROUP_BACKGROUND(0):後臺程序組,簡稱BSCHED_GROUP_DEFAULT(1):前臺程序組,簡稱FSCHED_GROUP_TOP_APP(2):TOP程序組,簡稱TSCHED_GROUP_TOP_APP_BOUND(3):TOP程序組,簡稱TupdateOomAdjLocked函式(無參)
updateOomAdjLocked實現1
在processList.java中有定義MAX_EMPTY_TIME = 30*60*1000(30 minutes,空程序存活時長)N表示在程序佇列LRU中程序的數量第34~39行重置所有活躍程序的uid記錄第43行:Adj序列號更新,用於標誌Adj是否已被更新第47~48行:CUR_MAX_CACHED_PROCESSES = MAX_CACHED_PROCESSES 預設值為32;CUR_MAX_EMPTY_PROCESSES = 32/2,空程序數量上限不可超過cch程序數量上限的一半;emptyProcessLimit = 16,cachedProcessLimit = 32-16=16第54~56行:計算numSlots = (906-900+1)/2 = 3,空程序數量=N-非快取程序數量-cch_hidd程序數量第64行:如果空程序數量大於cch程序數量最大閾值,空程序數量設定為cch程序數量最大閾值第66行:計算空程序因子=空程序數量/3第67行:空程序因子最小值設定為1adj、processState關係表-2