Android的休眠与唤醒 && Android关机或重启的几种实现方式 && Lowmemory Killer简介

本文详细介绍了Android系统中的休眠机制,包括EarlySuspend、LateResume及WakeLock的工作原理,并探讨了它们在电源管理和设备唤醒过程中的作用。此外,还讨论了Android与标准Linux休眠机制的区别。

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

      系统的阐述Android 休眠(suspend)机制,请参见http://blog.csdn.net/u013686019/article/details/53645646。

(1)特性介绍
      Early Suspend:Early suspend 是android 引进的一种机制,这种机制在上游备受争议,这里不做评论。这个机制作用在关闭显示的时候。一些和显示有关的设备,比如LCD背光,比如重力感应器、触摸屏、这些设备都会关掉。但是系统可能还是在运行状态(这时候还有wake lock)进行任务的处理,例如在扫描SD卡上的文件等。在嵌入式设备中,背光是一个很大的电源消耗,所以 android会加入这样一种机制。
      Late Resume:Late Resume 是和suspend 配套的一种机制,是在内核唤醒完毕开始执行的。主要就是唤醒在Early Suspend的时候休眠的设备。

      Wake Lock:Wake Lock 在Android的电源管理系统中扮演一个核心的角色。Wake Lock是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠,可以被用户态程序和内核获得。这个锁可以是有超时的或者是没有超时的,超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了,内核就会启动休眠的那套机制来进入休眠。

在安卓的上层,一般通过电源键和wacklock操作来使得系统唤醒状态。如下:

PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。 
SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯 
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,允许关闭键盘灯 
FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度 

(2)休眠和唤醒的函数用法

调用睡眠和唤醒的权限:Android.permission.DEVICE_POWER 权限只有系统应用才可以声明,普通应用即使你声明了也不起作用。

睡眠用PowerManager.java的goToSleep,This is what happens when the power key is pressed to turn off the screen,形参用SystemClock.uptimeMillis()

唤醒用PowerManager.java的wakeUp,This is what happens when the power key is pressed to turn on the screen

操作屏幕PowerManager.java的userActivity,Resets the auto-off timer and brightness the screen if the device is not asleep.  This is what happens normally when a key or the touch screen is pressed or when some other user activity occurs.

        如果是第三方应用实现睡眠,用DevicePolicyManager的lockNow()即可。

(3)术语 
       Wake Lock:我们接下来看一看wake lock的机制是怎么运行和起作用的,主要关注wakelock.c文件就可以了。wake lock 有加锁和解锁两种状态,加锁的方式有两种,一种是永久的锁住,这样的锁除非显示的放开,是不会解锁的,所以这种锁的使用是非常小心的;第二种是超时锁,这种锁会锁定系统唤醒一段时间,如果这个时间过去了,这个锁会自动解除。
        在wake lock中,会有3个地方让系统直接开始suspend(),分别是:a,在wake_unlock()中,如果发现解锁以后没有任何其他的wake lock了,就开始休眠。b,在定时器到达时间以后,定时器的回调函数会查看是否有其他的wake lock;如果没有,就在这里让系统进入睡眠。c,在wake_lock() 中,对一个wake lock加锁以后,会再次检查一下有没有锁。 
       Suspend:当wake_lock 运行 suspend()以后,在wakelock.c的suspend()函数会被调用,这个函数首先sync文件系统,然后调用pm_suspend(request_suspend_state),接下来pm_suspend()就会调用enter_state()来进入Linux的休眠流程。

(4)Android于标准Linux休眠的区别
      pm_suspend() 虽然会调用enter_state()来进入标准的Linux休眠流程,但是还是有一些区别:当进入冻结进程的时候,android首先会检查有没有wake lock。如果没有,才会冻结这些进程,因为在开始suspend和冻结进程期间有可能有人申请了wake lock,如果是这样,冻结进程会被中断。
(5) Wake Lock实例

        在调试一款手机时,发现这样一个BUG:在通话时手机接近耳朵后,距离感应器(PS)会使得LCD睡眠关屏,但是手机拿开后LCD也不会再亮了,怀疑是PS芯片没有从睡眠中唤醒导致的。采取添加一个唤醒锁的方法,这样在通话过程中PS始终无法进入睡眠状态就可以正常相应外部的状态变化了。注意:就算手机接近耳朵关屏,此时PS并没有DISABLE掉,在整个通话过程中,PS都是ENABLE的,只有当手机睡眠待机时,才会真正处于DISABLE。

        这样的话,只需要初始化PS时,初始化一个wake_lock,在手机正常工作时(ENABLE PS芯片)获得唤醒锁,在手机睡眠时(DISABLE PS芯片)释放唤醒锁。

=================================Android关机或重启的几种实现方式==========================

         Android系统关机或重启的几种实现方式:

(1)发送广播方式

(2)通过init.rc启动系统服务来运行sh文件

(3)Runtime调用Linux-shell

(4)PowerManager reboot以及反射调用PowerManagerService shutdown

原文:http://www.android100.org/html/201502/14/118802.html

=================================Lowmemory Killer简介==========================

参见http://www.jianshu.com/p/56c7cda86ad3,言简意赅


参考原文:http://edu.codepub.com/2010/0626/23815_2.php

参考原文:http://elinux.org/Android_Power_Management

参考原文:http://blog.csdn.net/z1074971432/article/details/37940701


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值