0 前言
基于 android 7.1.1 源码,分析和总结 Process 相关知识!
1 dumpsys meminfo –oom
dumpsys meminfo 可以来看系统的内存使用情况,这里我们重点关注:Total PSS by OOM adjustment:
默认的 dumpsys meminfo 是出了可以看 Total PSS by OOM adjustment,还可以看 Total PSS by process 等等详细的信息,这里我们只关注第一种,这里有一个很方便的指令:
adb shell dumpsys meminfo --oom 
下面是该指令的输出:
1  | Applications Memory Usage (in Kilobytes):  | 
我们可以看到,这部分,系统是根据进程的 adj 将其分类,然后根据不同的分类,显示出了不同类别进程的内存使用情况!
这里我们关心的是 adb shell dumpsys meminfo --oom  是如何归类不同类型的进程的!
2 dumpApplicationMemoryUsage
adb shell dumpsys meminfo --oom 最终会调用 dumpApplicationMemoryUsage 函数,这里我们重点关注和 --oom 相关的逻辑:
这里我们先来看几个和该指令相关的常量;
1  | static final int[] DUMP_MEM_OOM_ADJ = new int[] {  | 
DUMP_MEM_OOM_ADJ 中封装的是 oom adj,DUMP_MEM_OOM_LABEL 中封装的是 lebal,这个看命令输出,很容易猜到是什么意思!
下面我们来重点分析方法!!
1  | final void dumpApplicationMemoryUsage(FileDescriptor fd,  | 
上面的逻辑是和 Total PSS by OOM adjustment 相关的!
1  | ArrayList<ProcessRecord> collectProcesses(PrintWriter pw, int start, boolean allPkgs,  | 
其实,我们可以看出 adb shell dumpsys meminfo --oom 没有传入任何参数,所以返回的就是 mLruProcesses 的拷贝!
3 总结
分析了 adb shell dumpsys meminfo –oom 方法的执行流程,我们来总结下,进程的分类:
| 序号 | 进程 Label | 起始 oom adj 值 | 
|---|---|---|
1 | 
Native | 
ProcessList.NATIVE_ADJ : -1000 | 
2 | 
System | 
ProcessList.SYSTEM_ADJ : -900 | 
3 | 
Persistent | 
ProcessList.PERSISTENT_PROC_ADJ : -800 | 
4 | 
Persistent Service | 
ProcessList.PERSISTENT_SERVICE_ADJ : -700 | 
5 | 
Foreground | 
ProcessList.FOREGROUND_APP_ADJ : 0 | 
6 | 
Visible | 
ProcessList.VISIBLE_APP_ADJ : 100 | 
7 | 
Perceptible | 
ProcessList.PERCEPTIBLE_APP_ADJ : 200 | 
8 | 
Backup | 
ProcessList.BACKUP_APP_ADJ : 300 | 
9 | 
Heavy Weight | 
ProcessList.HEAVY_WEIGHT_APP_ADJ : 400 | 
10 | 
A Services | 
ProcessList.SERVICE_ADJ : 500 | 
11 | 
Home | 
ProcessList.HOME_APP_ADJ : 600 | 
12 | 
Previous | 
ProcessList.PREVIOUS_APP_ADJ : 700 | 
13 | 
B Services | 
ProcessList.SERVICE_B_ADJ : 800 | 
14 | 
Cached | 
ProcessList.CACHED_APP_MIN_ADJ : 900 |