Android 常驻进程如何被查杀?

一、常驻进程的特点

1. 常驻进程的类型
2. 常驻进程的特性
复制代码
常驻进程通常具有以下特点:
    1. 使用 START_STICKY 返回值
    2. 可能是前台服务(有通知)
    3. 绑定到系统进程
    4. 使用 WakeLock 保持唤醒

二、降低常驻进程优先级的方法

方法一:停止前台服务

如果常驻进程运行着前台服务,停止它可以显著降低优先级:

复制代码
public class MyDaemonService extends Service {
    
    private static final int NOTIFICATION_ID = 10001;
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 启动前台服务(高优先级)
        startForeground(NOTIFICATION_ID, createNotification());
        
        // 运行一段时间后,停止前台服务(降低优先级)
        scheduleStopForeground();
        
        return START_STICKY;
    }
    
    private void scheduleStopForeground() {
        new Handler(Looper.getMainLooper()).postDelayed(() -> {
            // 停止前台服务,转为后台服务
            stopForeground(true);
        }, 30 * 1000); // 30秒后停止
    }
    
    private Notification createNotification() {
        return new Notification.Builder(this, "channel")
            .setContentTitle("Daemon Running")
            .setSmallIcon(R.drawable.ic_launcher)
            .build();
    }
}
方法二:调整进程状态
复制代码
public void lowerDaemonPriority() {
    // 1. 设置线程优先级为后台
    android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
    
    // 2. 设置进程组为后台组
    try {
        android.os.Process.setProcessGroup(
            android.os.Process.myPid(),
            android.os.Process.THREAD_GROUP_BACKGROUND
        );
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    // 3. 如果有 WakeLock,释放它
    if (mWakeLock != null && mWakeLock.isHeld()) {
        mWakeLock.release();
    }
}
方法三:解绑系统进程
复制代码
public void unbindFromSystemService() {
    // 解绑之前绑定的系统服务
    if (mSystemServiceConnection != null) {
        unbindService(mSystemServiceConnection);
        mSystemServiceConnection = null;
    }
}

三、特殊情况:系统级常驻进程

1. 系统服务的保护机制

系统级常驻进程(如 AMS、WMS、SystemUI)有特殊保护:

复制代码
// 系统服务的优先级设置
// frameworks/base/services/core/java/com/android/server/am/ProcessList.java

// 系统进程的 OOM_ADJ 值(非常低,不容易被杀)
static final int SYSTEM_ADJ = -16;
static final int SYSTEM_SERVER_ADJ = -12;
2. SELinux 限制

系统级进程受到 SELinux 策略的保护:

复制代码
SELinux 策略会阻止普通应用:
    - 修改系统进程的优先级
    - 向系统进程发送信号
    - 读取系统进程的内存
3. Root 权限的影响

如果有 Root 权限,可以绕过一些限制:

复制代码
# 通过 adb 降低进程优先级(需要 Root)
adb shell renice 19 -p <pid>

# 或使用 setprop 命令
adb shell setprop sys.powerctl reboot,wake

四、完整示例:降低常驻进程优先级

复制代码
public class DaemonManager {
    
    private Context mContext;
    private PowerManager.WakeLock mWakeLock;
    
    public DaemonManager(Context context) {
        mContext = context;
        acquireWakeLock();
    }
    
    /**
     * 降低常驻进程优先级,使其更容易被系统查杀
     */
    public void lowerDaemonPriority() {
        // 1. 释放 WakeLock(如果持有的话)
        releaseWakeLock();
        
        // 2. 停止前台服务(如果运行着)
        stopForegroundService();
        
        // 3. 设置线程优先级为最低
        setLowThreadPriority();
        
        // 4. 设置进程组为后台组
        setBackgroundProcessGroup();
        
        // 5. 解绑系统服务连接
        unbindSystemServices();
        
        // 6. 请求系统回收内存
        requestMemoryCleanup();
    }
    
    private void acquireWakeLock() {
        PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DaemonManager:WakeLock");
        mWakeLock.acquire();
    }
    
    private void releaseWakeLock() {
        if (mWakeLock != null && mWakeLock.isHeld()) {
            mWakeLock.release();
            mWakeLock = null;
        }
    }
    
    private void stopForegroundService() {
        mContext.stopService(new Intent(mContext, MyDaemonService.class));
    }
    
    private void setLowThreadPriority() {
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_LOWEST);
    }
    
    private void setBackgroundProcessGroup() {
        try {
            android.os.Process.setProcessGroup(
                android.os.Process.myPid(),
                android.os.Process.THREAD_GROUP_BACKGROUND
            );
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private void unbindSystemServices() {
        // 解绑系统服务连接
        // ...
    }
    
    private void requestMemoryCleanup() {
        ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
        am.killBackgroundProcesses(mContext.getPackageName());
        System.gc();
    }
}

五、总结

关键要点
复制代码
- 用户应用的常驻服务 :完全可以降低优先级,使其更容易被查杀
- 系统级常驻进程 :不建议修改,可能影响系统稳定性
- WakeLock 的影响 :持有 WakeLock 的进程优先级更高,释放后更容易被杀
- 前台服务的影响 :前台服务优先级最高,停止后优先级大幅降低
相关推荐
刮风那天3 小时前
Android 如何降低进程优先级可以被查杀?
android
资源分享助手4 小时前
超级改图P图改字无限制版教程(安卓)AI改图软件、图片改字软件、安卓修图APP、智能消除工具、图片拼接APP、超级改图下载
android·人工智能
Lehjy5 小时前
【Linux】文件系统磁盘存储结构
android·linux·运维
BU摆烂会噶5 小时前
【LangGraph】节点内调用与状态隔离
android·人工智能·python·ui·langchain·人机交互
BU摆烂会噶6 小时前
【LangGraph】作为节点添加与状态共享
android·人工智能·python·ui·langchain·人机交互
刘大猫.7 小时前
重塑经典:Snapseed4.0全面登陆安卓,内置“胶片相机”与专业手动模式
android·数码相机·ai·机器人·大模型·算力·snapseed4.0
Languorous.7 小时前
MySQL聚合查询:COUNT、SUM、AVG用法,实战案例演示
android·数据库
沅霖7 小时前
Android Studio Java工程开发环境,怎么切换到Kotlin开发环境
android·kotlin·android studio
largecode7 小时前
企业名称能在来电显示吗?号码显示公司名服务打通多终端展示
android·xml·ios·iphone·xcode·webview·phonegap