jellybean的suspend策略变动

最近查看代码,发现android的suspend策略有变动了


在ICS上,当暗屏/亮屏时,会调用powerManagerService的setPowerState,最终会调到 hardware/libhardware_legacy/power/power.c下的set_screen_state,在这个函数中,通过向/sys/power/state中写入 “mem”或"on",让系统进入early suspend。进入early suspend后,若没人持有wakelock,则系统即进入suspend状态了。


再看下Jellybean的代码,之前的power.c这个hal,已经不存在了。搜索源码,发现相关功能的实现,已经挪到 system/core/libsuspend下,而且实现方式也有所改变(PowerManagerService的调用方式还是一样):

将功能模块命名的更合理了:以前叫screen_state, 现在叫auto suspend

方法调用过程也更易读易懂了:以前是通过 set_screen_state(1)和set_screen_state(0)来进入和退出suspend状态,现在改成了autosuspend_enable()和autosuspend_disable()

suspend策略更多了,发现共有三种策略:autosuspend_earlysuspend; autosuspend_autosleep和 autosuspend_wakeup_count。


现在每次调用autosuspend功能时,都尝试着选择三种策略的一种来使用:

static int autosuspend_init(void)
{
    if (autosuspend_inited) {
        return 0;
    }

    autosuspend_inited = true;

    autosuspend_ops = autosuspend_earlysuspend_init();
    if (autosuspend_ops) {
        goto out;
    }

    autosuspend_ops = autosuspend_autosleep_init();
    if (autosuspend_ops) {
        goto out;
    }

    autosuspend_ops = autosuspend_wakeup_count_init();
    if (autosuspend_ops) {
        goto out;
    }

    if (!autosuspend_ops) {
        ALOGE("failed to initialize autosuspend\n");
        return -1;
    }

out:
    ALOGV("autosuspend initialized\n");
    return 0;
}
这里的autosuspend_earlysuspend,和ICS上的suspend,也就是power HAL上的实现是一致的,即early suspend。

从这个初始化代码,也可以看到,三种策略的选择是 earlysuspend > autosleep > wakeup_count, 目前我们还没用到后两种。后两种的机制的原理和工作方法,还要抽空了解下~


你可能感兴趣的:(jellybean的suspend策略变动)