一、ADB 命令查看
1. 查看进程优先级(dumpsys)
# 查看所有进程的优先级
adb shell dumpsys activity processes
# 查看特定进程的优先级
adb shell dumpsys activity processes | grep <包名>
# 查看进程的 OOM_ADJ 值
adb shell cat /proc/<pid>/oom_adj
2. 查看 /proc 文件系统
# 查看特定进程的 oom_score_adj 值(Android 使用的优先级)
adb shell cat /proc/<pid>/oom_score_adj
# 查看进程的优先级(PR 列)
adb shell ps -A | grep <包名或进程名>
# 查看进程状态和优先级详情
adb shell ps -Al | grep <包名>
3. 输出示例
# oom_score_adj 值说明:
# -17 或 -1000: 不能被调整(系统进程)
# -16 ~ 0: 越高越不容易被杀
# 正值: 越高越容易被杀(最大 1000)
# 示例输出:
u0_a123 12345 1234 567890 45000 0 S com.example.myapp
# 用户ID PID PPID VSZ RSS PR 状态 进程名
二、代码中验证
1. 查看当前进程优先级
public class PriorityChecker {
public static void checkCurrentProcessPriority() {
int pid = android.os.Process.myPid();
// 获取进程优先级
int priority = android.os.Process.getThreadPriority(android.os.Process.myTid());
String priorityName = getPriorityName(priority);
Log.d("Priority", "Process ID: " + pid);
Log.d("Priority", "Thread Priority: " + priority + " (" + priorityName + ")");
Log.d("Priority", "Thread Group: " + getThreadGroup());
}
public static String getPriorityName(int priority) {
if (priority == android.os.Process.THREAD_PRIORITY_FOREGROUND) {
return "FOREGROUND";
} else if (priority == android.os.Process.THREAD_PRIORITY_BACKGROUND) {
return "BACKGROUND";
} else if (priority == android.os.Process.THREAD_PRIORITY_LOWEST) {
return "LOWEST";
} else {
return "NORMAL";
}
}
public static String getThreadGroup() {
try {
File file = new File("/proc/" + android.os.Process.myPid() + "/cgroup");
BufferedReader br = new BufferedReader(new FileReader(file));
String line = br.readLine();
br.close();
return line;
} catch (Exception e) {
return "Unknown";
}
}
}
2. 查看 OOM_ADJ 值
public static void checkOomAdj() {
int pid = android.os.Process.myPid();
try {
// 读取 oom_score_adj 文件
File file = new File("/proc/" + pid + "/oom_score_adj");
BufferedReader br = new BufferedReader(new FileReader(file));
String oomAdj = br.readLine().trim();
br.close();
Log.d("OOM_ADJ", "PID: " + pid);
Log.d("OOM_ADJ", "oom_score_adj: " + oomAdj);
// 解析优先级含义
int adj = Integer.parseInt(oomAdj);
Log.d("OOM_ADJ", "Priority Level: " + getOomAdjLevel(adj));
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getOomAdjLevel(int adj) {
if (adj <= -1000) {
return "UNCHANGEABLE (System Process)";
} else if (adj == -16) {
return "NATIVE_ADJ";
} else if (adj == -12) {
return "SYSTEM_SERVER_ADJ";
} else if (adj <= 0) {
return "FOREGROUND_APP_ADJ";
} else if (adj <= 2) {
return "VISIBLE_APP_ADJ";
} else if (adj <= 5) {
return "SERVICE_ADJ";
} else if (adj <= 7) {
return "BACKUP_APP_ADJ";
} else if (adj <= 14) {
return "CACHED_APP_ADJ";
} else {
return "HIDDEN_APP_ADJ (Most likely to be killed)";
}
}
3. 查看进程信息(ActivityManager)
public static void checkProcessInfo(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
// 获取当前进程信息
List<ActivityManager.RunningAppProcessInfo> processes = am.getRunningAppProcesses();
String packageName = context.getPackageName();
for (ActivityManager.RunningAppProcessInfo process : processes) {
if (process.processName.equals(packageName)) {
Log.d("ProcessInfo", "Process Name: " + process.processName);
Log.d("ProcessInfo", "PID: " + process.pid);
Log.d("ProcessInfo", "Importance: " + process.importance);
Log.d("ProcessInfo", "Importance Level: " + getImportanceLevel(process.importance));
Log.d("ProcessInfo", "Lru: " + process.lru);
break;
}
}
}
public static String getImportanceLevel(int importance) {
switch (importance) {
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND:
return "FOREGROUND (1)";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE:
return "FOREGROUND_SERVICE (2)";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_TOP_SLEEPING:
return "TOP_SLEEPING (3)";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE:
return "VISIBLE (4)";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE:
return "SERVICE (5)";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED:
return "CACHED (6)";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_GONE:
return "GONE (7)";
default:
return "UNKNOWN";
}
}
三、完整验证示例
public class PriorityVerification {
private Context mContext;
public PriorityVerification(Context context) {
mContext = context;
}
/**
* 完整验证进程优先级
*/
public void verifyPriority() {
Log.d("=== Priority Verification ===");
// 1. 验证线程优先级
verifyThreadPriority();
// 2. 验证 OOM_ADJ 值
verifyOomAdj();
// 3. 验证进程信息
verifyProcessInfo();
// 4. 验证线程组
verifyThreadGroup();
Log.d("=== Verification Complete ===");
}
private void verifyThreadPriority() {
int tid = android.os.Process.myTid();
int priority = android.os.Process.getThreadPriority(tid);
Log.d("ThreadPriority", "Thread ID: " + tid);
Log.d("ThreadPriority", "Priority: " + priority);
Log.d("ThreadPriority", "Priority Name: " + getPriorityName(priority));
}
private void verifyOomAdj() {
int pid = android.os.Process.myPid();
try {
File file = new File("/proc/" + pid + "/oom_score_adj");
if (file.exists()) {
BufferedReader br = new BufferedReader(new FileReader(file));
String adj = br.readLine().trim();
br.close();
Log.d("OOM_ADJ", "PID: " + pid);
Log.d("OOM_ADJ", "oom_score_adj: " + adj);
Log.d("OOM_ADJ", "Level: " + getOomAdjLevel(Integer.parseInt(adj)));
} else {
Log.d("OOM_ADJ", "File not found: " + file.getAbsolutePath());
}
} catch (Exception e) {
Log.e("OOM_ADJ", "Error reading oom_score_adj", e);
}
}
private void verifyProcessInfo() {
ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
try {
List<ActivityManager.RunningAppProcessInfo> processes =
am.getRunningAppProcesses();
String packageName = mContext.getPackageName();
for (ActivityManager.RunningAppProcessInfo process : processes) {
if (process.processName.equals(packageName)) {
Log.d("ProcessInfo", "Process Name: " + process.processName);
Log.d("ProcessInfo", "PID: " + process.pid);
Log.d("ProcessInfo", "Importance: " + process.importance);
Log.d("ProcessInfo", "Importance Level: " +
getImportanceLevel(process.importance));
break;
}
}
} catch (Exception e) {
Log.e("ProcessInfo", "Error getting process info", e);
}
}
private void verifyThreadGroup() {
try {
File file = new File("/proc/" + android.os.Process.myPid() + "/cgroup");
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
Log.d("ThreadGroup", line);
}
br.close();
} catch (Exception e) {
Log.e("ThreadGroup", "Error reading cgroup", e);
}
}
private String getPriorityName(int priority) {
if (priority == android.os.Process.THREAD_PRIORITY_FOREGROUND) {
return "FOREGROUND";
} else if (priority == android.os.Process.THREAD_PRIORITY_FOREGROUND_SERVICE) {
return "FOREGROUND_SERVICE";
} else if (priority == android.os.Process.THREAD_PRIORITY_BACKGROUND) {
return "BACKGROUND";
} else if (priority == android.os.Process.THREAD_PRIORITY_LOWEST) {
return "LOWEST";
} else if (priority == android.os.Process.THREAD_PRIORITY_DEFAULT) {
return "DEFAULT";
}
return "NORMAL";
}
private String getOomAdjLevel(int adj) {
if (adj <= -1000) {
return "UNCHANGEABLE";
} else if (adj <= -12) {
return "SYSTEM_SERVER";
} else if (adj <= -6) {
return "PERSISTENT";
} else if (adj <= 0) {
return "FOREGROUND_APP";
} else if (adj <= 2) {
return "VISIBLE_APP";
} else if (adj <= 5) {
return "SERVICE_APP";
} else if (adj <= 7) {
return "BACKUP_APP";
} else if (adj <= 14) {
return "CACHED_APP";
} else {
return "HIDDEN_APP (Most likely to be killed)";
}
}
private String getImportanceLevel(int importance) {
switch (importance) {
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND:
return "FOREGROUND";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE:
return "FOREGROUND_SERVICE";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE:
return "VISIBLE";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE:
return "SERVICE";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED:
return "CACHED";
case ActivityManager.RunningAppProcessInfo.IMPORTANCE_GONE:
return "GONE";
default:
return "UNKNOWN";
}
}
}
四、ADB 常用命令速查

五、验证步骤总结
设置前后的对比
// 1. 在设置优先级前先验证一次
verifyPriority();
// 2. 设置优先级
setLowPriority();
// 3. 再次验证,查看值是否变化
verifyPriority();
预期结果

六、注意事项
- 系统进程限制 :某些进程的 oom_score_adj 值可能无法修改(值为 -1000)
- 权限要求 :部分操作可能需要特定权限
- 即时生效 :设置后通常会立即生效
- 数值范围 :Android 7.0+ 使用 oom_score_adj,范围通常是 -1000 到 1000