PROCESS_STATE_TOP_SLEEPING状态变化

博客介绍了Android 8.0和9.0系统中PROCESS_STATE_TOP_SLEEPING的值不同,还阐述了Google工程师对耗电统计中bg定义的改变。在两个系统版本里,bg定义的范围不同,且9.0中TOP_SLEEPING优先级降低,Android保护程度下降。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9.0上 public static final int PROCESS_STATE_TOP_SLEEPING = 11;

8.0上 public static final int PROCESS_STATE_TOP_SLEEPING = 5;

以下是Google工程师comment:

Make TOP_SLEEPING procstate more like a cached process.

When an app is on the top of the activity stack but the screen
is not on, this doesn't really count as a top app in the normal
sense.  In particular, we'd really like to apply the normal
restrictions we have on background and cached apps: no network
access, no ability to use wake locks, etc.  (In other words, in
this state the app's activity is stopped, so from its perspective
it is no different than the user leaving it to go to another app.)

To do this, we change the order of the TOP_SLEEPING proc state
out from the range of foreground states down to between the
cached and background states.

Test: ActivityManagerProcessStateTest
Bug: 70808931
Change-Id: I994caba8c27553a452de75efa358be0e683d046f

进而改变了耗电统计中bg定义:

BatteryStatsImpl.java
/** Whether to consider Uid to be in the background for background timebase purposes. */

    public boolean isInBackground() {
        // Note that PROCESS_STATE_CACHED and ActivityManager.PROCESS_STATE_NONEXISTENT is
        // also considered to be 'background' for our purposes, because it's not foreground.
        return mProcessState >= PROCESS_STATE_BACKGROUND;
    }

BatteryStats.java 映射到ActivityManager procstate

9.0上
/**
* Maps the ActivityManager procstate into corresponding BatteryStats procstate.
*/

public static int mapToInternalProcessState(int procState) {
    if (procState == ActivityManager.PROCESS_STATE_NONEXISTENT) {
        return ActivityManager.PROCESS_STATE_NONEXISTENT;
    } else if (procState == ActivityManager.PROCESS_STATE_TOP) {
        return Uid.PROCESS_STATE_TOP;
    } else if (procState == ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
        // State when app has put itself in the foreground.
        return Uid.PROCESS_STATE_FOREGROUND_SERVICE;
    } else if (procState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
        // Persistent and other foreground states go here.
        return Uid.PROCESS_STATE_FOREGROUND;
    } else if (procState <= ActivityManager.PROCESS_STATE_RECEIVER) {
        return Uid.PROCESS_STATE_BACKGROUND;                                                    
    } else if (procState <= ActivityManager.PROCESS_STATE_TOP_SLEEPING) {
        return Uid.PROCESS_STATE_TOP_SLEEPING;
    } else if (procState <= ActivityManager.PROCESS_STATE_HEAVY_WEIGHT) {
        return Uid.PROCESS_STATE_HEAVY_WEIGHT;
    } else {
        return Uid.PROCESS_STATE_CACHED;
    }
}

大于 public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 5; 小于等于 ActivityManager.PROCESS_STATE_RECEIVER = 10 属于 PROCESS_STATE_BACKGROUND

所以bg定义为: 大于 public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 5;

Android 8.0

        if (procState == ActivityManager.PROCESS_STATE_NONEXISTENT) {
            uidRunningState = ActivityManager.PROCESS_STATE_NONEXISTENT;
        } else if (procState == ActivityManager.PROCESS_STATE_TOP) {
            uidRunningState = PROCESS_STATE_TOP;
        } else if (procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
            // Persistent and other foreground states go here.
            uidRunningState = PROCESS_STATE_FOREGROUND_SERVICE;
        } else if (procState <= ActivityManager.PROCESS_STATE_TOP_SLEEPING) {
            uidRunningState = PROCESS_STATE_TOP_SLEEPING;
        } else if (procState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
            // Persistent and other foreground states go here.
            uidRunningState = PROCESS_STATE_FOREGROUND;
        } else if (procState <= ActivityManager.PROCESS_STATE_RECEIVER) {
            uidRunningState = PROCESS_STATE_BACKGROUND;
        } else {
            uidRunningState = PROCESS_STATE_CACHED;
        }

大于 public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 6; 小于等于 ActivityManager.PROCESS_STATE_RECEIVER = 12 属于 PROCESS_STATE_BACKGROUND

所以bg定义为: 大于 public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 6;

TOP_SLEEPING的优先级被拉低了,Android的保护程度降低。

Linux系统中的进程状态是用于描述进程当前行为和资源使用情况的关键信息。根据系统的不同实现,进程状态可以分为多个类型: - **运行态(R, Running)**:表示该进程正在运行或者在就绪队列中等待被调度执行[^1]。 - **可中断休眠态(S, Sleeping)**:表示该进程处于等待某些条件满足的状态,例如等待I/O操作完成或信号量释放。此时进程可以被中断并唤醒[^3]。 - **不可中断休眠态(D, Disk Sleep)**:表示该进程正在等待某些不可中断的资源,通常与硬件交互有关(如磁盘读写)。在此状态下,进程无法被信号打断。 - **停止状态(T, Stopped)**:表示该进程已经暂停执行,通常是由于接收到SIGSTOP信号或其他调试相关的原因导致。 - **追踪停止状态(t, Tracing Stop)**:表示该进程因被调试器追踪而暂停执行,直到调试器允许其继续运行。 - **僵死状态(Z, Zombie)**:表示该进程已经结束执行,但其父进程尚未通过wait()系统调用获取其退出状态信息。此时进程仅保留了一个内核中的PCB结构,不消耗其他资源[^3]。 - **死亡状态(X, Dead)**:表示该进程彻底终止,并从系统中移除[^1]。 除了上述基本状态外,还有一些特殊的进程分类: - **僵尸进程**:指已经执行完毕但未被父进程回收的进程。这类进程仍然占据着系统中的PID资源,可能导致资源耗尽问题。 - **孤儿进程**:当一个进程的父进程先于它终止时,该进程成为孤儿进程。这种情况下,init进程(PID=1)会接管这些孤儿进程并负责后续的清理工作。 - **守护进程**:一种长期运行且独立于用户终端的后台服务进程。它们通常在系统启动时开始运行并在系统关闭时才终止[^3]。 为了查看和管理进程状态,Linux提供了多种工具和命令: - `ps -ef` 或 `ps aux` 可以列出所有进程的信息,包括状态字段[^3]。 - `top` 实时监控系统中各个进程的状态变化[^3]。 - `pgrep` 用于快速查找符合条件的进程ID[^4]。 - `kill` 命令发送特定信号给指定进程,从而改变其状态(如发送SIGSTOP/SIGCONT控制暂停/恢复)。 ### 示例代码 以下是一个简单的Python脚本,演示如何使用`subprocess`模块来获取某个具体进程的状态信息: ```python import subprocess def get_process_status(pid): cmd = ['ps', '-p', str(pid), '--format', 'pid,state,cmd'] result = subprocess.run(cmd, stdout=subprocess.PIPE, text=True) return result.stdout.strip() # 获取PID为1234的进程状态 status_info = get_process_status(1234) print(status_info) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值