一些常用命令
进程相关命令
作用 | 命令 |
查看lru list | adb shell dumpsys activity lru |
查看总体进程相关信息 | adb shell dumpsys activity processes |
查看某个进程的详细信息 | adb shell dumpsys activity p processName |
查看进程的oom | adb shell dumpsys activity oom |
内存相关命令
作用 | 命令 |
查看历史Lmk查杀对应级别数量 | dumpsys activity lmk |
process+oom+category+total | dumpsys meminfo |
输出指定包名的进程,可能包含多个进程 | dumpsys meminfo --package |
输出指定pid的某一进程 | dumpsys meminfo |
查看手机详细的内存信息 | cat /proc/meminfo |
进程优先级
ADJ级别 | adjString | 取值 | 含义 |
INVALID_ADJ | -10000 | 未初始化的值 | |
CACHED_APP_MAX_ADJ | 999 | 不可见进程adj的最大值 | |
CACHED_APP_MIN_ADJ | “cch” | 900 | 不可见进程adj的最小值 |
CACHED_APP_LMK_FIRST_ADJ | 950 | lmk 最先查杀的级别 | |
SERVICE_B_ADJ | "svcb " | 800 | B List中的Service |
PREVIOUS_APP_ADJ | "prev " | 700 | 上一个进程 |
HOME_APP_ADJ | "home " | 600 | Home进程 |
SERVICE_ADJ | "svc " | 500 | 服务进程 |
HEAVY_WEIGHT_APP_ADJ | "hvy " | 400 | 重量级进程 |
BACKUP_APP_ADJ | "bkup " | 300 | 备份进程 |
PERCEPTIBLE_LOW_APP_ADJ | "prcl " | 250 | 感知低的进程 |
PERCEPTIBLE_APP_ADJ | "prcp " | 200 | 可感知进程 |
VISIBLE_APP_ADJ | "vis " | 100 | 可见进程 |
PERCEPTIBLE_RECENT_FOREGROUND_APP_ADJ | 50 | 当前为前台Service,15秒内曾是前台App | |
FOREGROUND_APP_ADJ | "fg " | 0 | 前台进程 |
PERSISTENT_SERVICE_ADJ | "psvc " | -700 | 关联着系统和persistent进程 |
PERSISTENT_PROC_ADJ | "pers " | -800 | 系统persistent进程 |
SYSTEM_ADJ | "sys " | -900 | 仅指system_server进程 |
NATIVE_ADJ | "ntv " | -1000 | native进程 |
procState级别 | procStateString | 取值 | 含义 |
PROCESS_STATE_NONEXISTENT | “NONE” | 20 | 不存在 |
PROCESS_STATE_CACHED_EMPTY | "CEM " | 19 | 进程处于cache状态且为空进程 |
PROCESS_STATE_CACHED_RECENT | "CRE " | 18 | 进程处于cached状态,且与现有的最近任务一致的activity |
PROCESS_STATE_CACHED_ACTIVITY_CLIENT | “CACC” | 17 | 进程处于cached状态,且为另一个cached进程(内含Activity)的client进程 |
PROCESS_STATE_CACHED_ACTIVITY | "CAC " | 16 | 进程处于cached状态且内含activity |
PROCESS_STATE_LAST_ACTIVITY | “LAST” | 15 | 后台进程且拥有上一次显示的activity |
PROCESS_STATE_HOME | “HOME” | 14 | 后台进程且拥有Home Activity |
PROCESS_STATE_HEAVY_WEIGHT | "HVY " | 13 | 后台进程,但无法执行restore |
PROCESS_STATE_TOP_SLEEPING | “TPSL” | 12 | 设备处于sleeping时的top app |
PROCESS_STATE_RECEIVER | “RCVR” | 11 | 后台进程且正在运行receiver |
PROCESS_STATE_SERVICE | "SVC " | 10 | 后台进程且正在运行Service |
PROCESS_STATE_BACKUP | “BKUP” | 9 | CACHED_APP_MIN_ADJ后台进程且正在执行backup/restore操作 |
PROCESS_STATE_TRANSIENT_BACKGROUND | “TRNB” | 8 | 短暂的处于后台的进程 |
PROCESS_STATE_IMPORTANT_BACKGROUND | “IMPB” | 7 | 对用户很重要,但是用户不可感知 |
PROCESS_STATE_IMPORTANT_FOREGROUND | “IMPF” | 6 | 对用户很重要,用户可感知 |
PROCESS_STATE_BOUND_FOREGROUND_SERVICE | “BFGS” | 5 | 拥有一个前台Service且由系统绑定 |
PROCESS_STATE_FOREGROUND_SERVICE | "FGS " | 4 | 拥有一个前台Service |
PROCESS_STATE_BOUND_TOP | “BTOP” | 3 | 绑定Top app的进程 |
PROCESS_STATE_TOP | "TOP " | 2 | 拥有当前用户可见top Activity的进程 |
PROCESS_STATE_PERSISTENT_UI | “PERU” | 1 | persistent系统进程,并正在执行UI操作 |
PROCESS_STATE_PERSISTENT | "PER " | 0 | persistent系统进程 |
进程提升优先级的原因
从bugreport中查看
首先搜索dumpsys activity processes找到Process LRU list找到对应进程名如下:
Proc # 6: hvy B/ /HVY trm: 0 16885:com.qiyi.video/u0a209 (cch-act)
hvy 和 HVY 分别代表adj和procState,B代表SCHED_GROUP_BACKGROUND,0代表trimMemoryLevel 为0,cch-act代表adjType
一些常见的示例
- 进程adj > Service的由system拉起的client进程,且没有其他flag等,adj会为VISIBLE_APP_ADJ,adjType会为"service"
一般涉及到adjTarget基本跟Service和ContentProvider相关
Proc #12: vis F/S/FGS trm: 0 19817:com.xiaomi.wearable/u0a495 (service)
com.xiaomi.wearable/.home.devices.ble.sync.NotifySyncService<=Proc{1705:system/1000}
vis = 100 代表可见进程,F = SCHED_GROUP_DEFAULT ,S代表该进程有前台Service,FGS = 5代表procState,adjtype为"service",adjTarget为com.xiaomi.wearable/.home.devices.ble.sync.NotifySyncService ,adjSource为Proc{1705:system/1000}
- 设置进程的maxAdj
Proc # 6: vis R/ /TOP trm: 0 20886:com.miui.bugreport/1000 (cch-started-ui-services)
vis=100 代表可见进程,R=SCHED_GROUP_RESTRICTED,TOP=2,代表当前进程拥有Top Activity,但是这些跟adjType="cch-started-ui-services"不匹配,所以被提升优先级了
APP* UID 1000 ProcessRecord{49fbeae 20886:com.miui.bugreport/1000}
// 最大adj为100,最大procState为2
oom: max=100 procState: max=2 curRaw=1001 setRaw=1001 cur=100 set=100
lastCompactTime=0 lastCompactAction=0 mCurSchedGroup=1 setSchedGroup=1 systemNoUi=false trimMemoryLevel=0
curProcState=2 mRepProcState=2 pssProcState=2 setProcState=2 lastStateTime=-1m5s440ms
本地查看
直接使用adb shell dumpsys activity oom
主要实现在ActivityManagerService的dumpOomLocked
Process OOM control (82 total, non-act at 4, non-svc at 4):
PERS #81: sys F/ /PER trm: 0 1684:system/1000 (fixed)
oom: max=-900 curRaw=-900 procState: max=21 setRaw=-900 cur=-900 set=-900
state: cur=PER set=PER lastPss=242MB lastSwapPss=7.8MB lastCachedPss=0.00
cached=false empty=false hasAboveClient=false