Android 验证进程优先级设置是否成功

一、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
相关推荐
码流怪侠1 小时前
Android MediaCodec 全面详解:从入门到精通
android·程序员·音视频开发
程序员陆业聪2 小时前
Android插件化江湖:从DroidPlugin到Shadow的技术演进
android
敲代码的瓦龙2 小时前
Android?广播!!!
android·java·开发语言·android-studio
黄林晴2 小时前
Android Studio Quail 1 Canary 5 发布,Compose 截图测试 + R8 混淆 mapping 问题解决
android·android studio
山上春2 小时前
MT-Workflow2:面向 Odoo 的可视化审批工作流引擎
android·workflow·odoo·bpmn
恋猫de小郭2 小时前
Flutter GenUI 0.9 和 A2UI 0.9 发布,全动动态 UI 支持,AI 在 App 里直出界面
android·flutter·ios
Carson带你学Android3 小时前
Flutter 官方 Skills:一条命令,让 AI 写出「专家级别」的代码
android
三少爷的鞋3 小时前
Android 架构系列之MVVM 和 MVI 算架构吗?
android·kotlin
白菜欣12 小时前
Linux — 进程控制
android·linux·运维