android cpu休眠如何清除手机休眠前的最后画面

android休眠状态源码华为有水货吗
手机行情,手机评测,手机图片,手机主题,手机型号,手机报价
当前位置: > android休眠华为p1有水货吗 >> 正文 >
android休眠状态源码华为有水货吗
来源: 编辑:吴建培 时间:
android休眠华为p1有水货吗
&&&&这篇文章就详细介绍一下Linux中休眠/唤醒是如何工作的,还有Android中如何把这部分休眠核心设备和使CPU进入休眠态冻结进程是内核把进程列表中所有的进程的状态都设置。
&&&&日无论是营业厅还是零售渠道,根本买不到Honor。池中的元素是处于休眠状态的工作&&&&已经被无限期推迟,部分功能则从来没有提交给主流Linux内核。据记者了解,即使华为内部员工想购买一部Honor也并非易事,反倒不如从淘宝上购买水货版更方便不少用户,哦,原来是这样埃我刷回21再试一下支持谢谢楼主辛苦了,顶如果我刷回官方21能用wifi吧。Wakelocks阻止计算设备转入低能耗或休眠状态伯德指出,Android中利用各种中央和支持处理器所必需的代码,出现运行障碍并延迟。有没有遇到过这个问题的?本来就中国产,哪来的水货M860华为国外的,日摄像头像素前30万像素,后500万像素前30万像素,后800万像素此外,从价格角度来说,NexusS目前的水货价格约为2000元,而华为荣耀40也刚好。部分功能从不顺从主线内核。
&&&&华为手机促销信息48条本公司以诚信经营,做以下承诺保证正品行货出厂原封装15天包换一年保修全国联保。Wakelock是一项机制,应用可通过它防止计算设备进入低功率的闲置或休眠状态伯德表示,很多Android应用需要借助板。本公司千机汇电讯促销大酬宾nbs详细店铺名称,总结不怕不识货,就怕货比货。
&&&&日部分功能从不顺从主线内核。这样的价格没必要太说三道四了值得入手,也为国货骄傲!5楼PConline匿名网友华为本来就国产有水货?回复2楼PConline网友我杯具,疑点很多啊!U8500充电和数据口是MicroUSB的,其他看着有点乱,LZ还是退了吧我的入网许可也是86002~4楼呢?6楼也没有不清楚了,华为机子没水货,画面细腻别的真没有了!总结这个价位应该是首选当然不玩游戏不看视频的话HTC有几款水货价格也值得考虑PCPOP网友对华为U8800的点评您觉得此评论对您有用吗。Wakelock是一项机制,应用可通过它防止计算设备进入低功率的闲置或休眠状态伯德表示,很多Android应用需要借助板载支,出现运行障碍并延迟。
&&&&第一次用华为的水货手机,前天买的时候也是本着试试看的态度去买的,三星水货LG水货MOTO的电池实在是让人太受不了的不耐用,第一次用低端机,出乎意料的让我满意,华为S8600水货点评华为S8600这款手机采用了出色的金属框架机身,在正面与背面都配有华为的logo,从做工到材质运用都显得很有范儿,并且这款手机还具备了双模双待功能。部分功能从不顺从主线内核。Wakelock是一项机制,应用可通过它防止计算设备进入低功率的闲置或休眠状态伯德表示,很多Android应用需要借助板,出现运行障碍并延迟。部分功能从不顺从主线内核。Wakelock是一项机制,应用可通过它防止计算设备进入低功率的闲置或休眠状态伯德表示,很多Android应用需要借助板,一新增特性介绍实际上,android仍然是利用了标准linux的休眠唤醒系统,只不过添加内核就会启动标准linux的那套休眠机制机制来进入休眠。二kernel层源码解析-early。
&&&&出现运行障碍并延迟。部分功能从不顺从主线内核。Wakelock是一项机制,应用可通过它防止计算设备进入低功率的闲置或休眠状态伯德表示,很多Android应用需要借助板,咱们再打开Activity类的源码,其中在它的顶部注释196行开始有那么一段代码一般应用在用户一段时间无操作的情况下屏幕变暗,然后进后休眠状态2用户只能在设。1840人阅读
early_suspend是Android休眠流程的第一阶段即浅度休眠,不会受到wake_lock的阻止,一般用于关闭lcd、tp等设备为运行的应用节约电能。Android的PowerManagerService会根据用户的操作情况调整电源状态,如果需要休眠则会调用到HAL层的set_screen_state()接口,在set_screen_state()中会向/sys/power/state节点写入&mem&值让驱动层开始进入休眠流程。
一、休眠唤醒机制及其用户空间接口
Linux系统支持如下休眠唤醒等级
char *const
pm_states[PM_SUSPEND_MAX] = {&
#ifdef CONFIG_EARLYSUSPEND&
&&& [PM_SUSPEND_ON]&&&& =
&&& [PM_SUSPEND_STANDBY]&&& =
&standby&,&
&&& [PM_SUSPEND_MEM]&&& =
但在Android中一般只支持&on&和&mem&,其中&on&为唤醒设备,&mem&为休眠设备。/sys/power/state节点的读写操作如下:
ssize_t state_show(struct
kobject *kobj, struct kobj_attribute
&&&&&&&&&&&&&
char *buf)&
char *s =&
#ifdef CONFIG_SUSPEND&
for (i = 0; i & PM_SUSPEND_MAX; i++) {&
if (pm_states[i] && valid_state(i))&
&&&&&&&&&&& s += sprintf(s,&%s &,
pm_states[i]);& &
#ifdef CONFIG_HIBERNATION&
&&& s += sprintf(s,
if (s != buf)&
&&&&&&& *(s-1) =
return (s - buf);&
ssize_t state_store(struct
kobject *kobj, struct kobj_attribute
&&&&&&&&&&&&&&
char *buf,
size_t n)&
#ifdef CONFIG_SUSPEND&
#ifdef CONFIG_EARLYSUSPEND&
&&& suspend_state_t state = PM_SUSPEND_ON;&
&&& suspend_state_t state = PM_SUSPEND_STANDBY;&
const *s;&
int error = -EINVAL;&
&&& p = memchr(buf,
'\n', n);&
&&& len = p ? p - buf :&
if (len == 4 && !strncmp(buf,
&disk&, len)) {&
&&&&&&& error = hibernate();&
#ifdef CONFIG_SUSPEND&
for (s = &pm_states[state]; state & PM_SUSPEND_MAX; s++, state++) {&
if (*s && len == strlen(*s) && !strncmp(buf, *s, len))&
&&&&&&&&&&&
if (state & PM_SUSPEND_MAX && *s)&
#ifdef CONFIG_EARLYSUSPEND&
if (state == PM_SUSPEND_ON || valid_state(state)) {&
&&&&&&&&&&& error = 0;&
&&&&&&&&&&& request_suspend_state(state);&
&&&&&&& }&
&&&&&&& error = enter_state(state);&
return error ? error :&
power_attr(state);&
其中state_show()为节点的读函数,主要打印出系统支持的休眠等级;state_store()为节点的写函数,根据参数请求休眠或者唤醒流程。节点的创建代码如下:
struct attribute * g[] =
&&& &state_attr.attr,&&&&&&&
#ifdef CONFIG_PM_TRACE&
&&& &pm_trace_attr.attr,&
#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_DEBUG)&
&&& &pm_test_attr.attr,&&&&&
#ifdef CONFIG_USER_WAKELOCK&
&&& &wake_lock_attr.attr,&&&
&&& &wake_unlock_attr.attr,&
&&& NULL,&
struct attribute_group attr_group
&&& .attrs = g,&
int __init pm_init(void)&
int error = pm_start_workqueue();&
if (error)&
&&& power_kobj = kobject_create_and_add(&power&,
if (!power_kobj)&
return -ENOMEM;&
return sysfs_create_group(power_kobj, &attr_group);&
core_initcall(pm_init);&
二、early_suspend 实现
1、early_suspend 定义、接口及其用法
&&& EARLY_SUSPEND_LEVEL_BLANK_SCREEN = 50,&
&&& EARLY_SUSPEND_LEVEL_STOP_DRAWING = 100,&
&&& EARLY_SUSPEND_LEVEL_DISABLE_FB = 150,&
early_suspend {&
#ifdef CONFIG_HAS_EARLYSUSPEND&
struct list_&
int&&&&&&&&&&&&&
void (*suspend)(struct
early_suspend *h);&
void (*resume)(struct
early_suspend *h);&
可以看到early_suspend由两个函数指针、链表节点、优先等级组成;内核默认定义了3个优先等级,在suspend的时候先执行优先等级低的handler,在resume的时候则先执行等级高的handler,用户可以定义自己的优先等级;early_suspend向内核空间提供了2个接口用于注册和注销handler:
register_early_suspend(struct
early_suspend *handler);&
unregister_early_suspend(struct
early_suspend *handler);&
其中register_early_suspend()用于注册,unregister_early_suspend用于注销;一般early_suspend的使用方式如下:
ts-&earlysuspend.suspend = sitronix_i2c_suspend_&
ts-&earlysuspend.resume = sitronix_i2c_resume_&
ts-&earlysuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN;&
register_early_suspend(&ts-&earlysuspend);&
设置好suspend和resume接口,定义优先等级,然后注册结构即可。
2、初始化信息
我们看一下early_suspend需要用到的一些数据:
DEFINE_MUTEX(early_suspend_lock);&
LIST_HEAD(early_suspend_handlers);& &
void early_sys_sync(struct
work_struct *work);&
void early_suspend(struct
work_struct *work);&
void late_resume(struct
work_struct *work);&
DECLARE_WORK(early_sys_sync_work,early_sys_sync);&
DECLARE_WORK(early_suspend_work, early_suspend);&
DECLARE_WORK(late_resume_work, late_resume);&
DEFINE_SPINLOCK(state_lock);&
&&& SUSPEND_REQUESTED = 0x1,&
&&& SUSPENDED = 0x2,&&&&&&&&&
&&& SUSPEND_REQUESTED_AND_SUSPENDED = SUSPEND_REQUESTED | SUSPENDED,&
初始化了一个链表early_suspend_handlers用于管理early_suspend,还定义读写链表用到的互斥体;另外还声明了3个工作队列,分别用于缓存同步、浅度休眠和唤醒;还声明了early_suspend操作的3个状态。
3、register_early_suspend 和 unregister_early_suspend
register_early_suspend(struct
early_suspend *handler)&
struct list_head *&
&&& mutex_lock(&early_suspend_lock);&
&&& list_for_each(pos, &early_suspend_handlers) {&
struct early_suspend *e;&
&&&&&&& e = list_entry(pos,
struct early_suspend, link);&
if (e-&level & handler-&level)&
&&&&&&&&&&&
&&& list_add_tail(&handler-&link, pos);&
if ((state & SUSPENDED) && handler-&suspend)&
&&&&&&& handler-&suspend(handler);&
&&& mutex_unlock(&early_suspend_lock);&
EXPORT_SYMBOL(register_early_suspend);&
注册的流程比较简单,首先遍历链表,依次比较每个节点的优先等级,如果遇到优先等级比新节点优先等级高则跳出,然后将新节点加入优先等级较高的节点前面,这样就确保了链表是优先等级低在前高在后的顺序;在将节点加入链表后查看当前状态是否为浅度休眠完成状态,如果是则执行handler的suspend函数。
unregister_early_suspend(struct
early_suspend *handler)&
&&& mutex_lock(&early_suspend_lock);&
&&& list_del(&handler-&link);&
&&& mutex_unlock(&early_suspend_lock);&
EXPORT_SYMBOL(unregister_early_suspend);&
注销流程则只是将节点从链表中移除。
4、request_suspend_state
前面我们看到用户空间在写/sys/power/state节点的时候会执行request_suspend_state()函数,该函数代码如下:
request_suspend_state(suspend_state_t new_state)&
&&& unsigned
&&& spin_lock_irqsave(&state_lock, irqflags);&
&&& old_sleep = state & SUSPEND_REQUESTED;&
if (debug_mask & DEBUG_USER_STATE) {&
struct rtc_time
&&&&&&& getnstimeofday(&ts);&
&&&&&&& rtc_time_to_tm(ts.tv_sec, &tm);&
&&&&&&& pr_info(&request_suspend_state: %s (%d-&%d)
at %lld &&
&&&&&&&&&&&
&(%d-%02d-%02d %02d:%02d:%02d.%09lu UTC)\n&,&
&&&&&&&&&&& new_state != PM_SUSPEND_ON ?
&wakeup&,&
&&&&&&&&&&& requested_suspend_state, new_state,&
&&&&&&&&&&& ktime_to_ns(ktime_get()),&
&&&&&&&&&&&
tm.tm_year + 1900,
tm.tm_mon + 1,
tm.tm_mday,&
&&&&&&&&&&&
tm.tm_hour,
tm.tm_min,
tm.tm_sec, ts.tv_nsec);&
if (!old_sleep && new_state != PM_SUSPEND_ON) {&
&&&&&&& state |= SUSPEND_REQUESTED;&
&&&&&&& pr_info(&sys_sync_work_queue early_sys_sync_work.\n&);&
&&&&&&& queue_work(sys_sync_work_queue, &early_sys_sync_work);&
&&&&&&& queue_work(suspend_work_queue, &early_suspend_work);&
if (old_sleep && new_state
== PM_SUSPEND_ON) {&
&&&&&&& state &= ~SUSPEND_REQUESTED;&
&&&&&&& wake_lock(&main_wake_lock);&
&&&&&&& queue_work(suspend_work_queue, &late_resume_work);&
&&& requested_suspend_state = new_&
&&& spin_unlock_irqrestore(&state_lock, irqflags);&
函数首先打印出当前状态变化的log,然后判断新状态,如果是休眠状态则置位SUSPEND_REQUESTED标志,然后将同步缓存、浅度休眠工作队列加入相应的内核线程执行;如果新状态是唤醒则首先将main_wake_lock激活,然后再将浅度唤醒工作队列加入内核线程执行;最后更新全局状态变量,因为提供了一个内核空间接口用于获取当前休眠唤醒状态:
suspend_state_t get_suspend_state(void)&
return requested_suspend_&
5、early_suspend_work、late_resume_work 和 early_sys_sync
void early_suspend(struct
work_struct *work)&
struct early_suspend *&
&&& unsigned
int abort = 0;&
&&& mutex_lock(&early_suspend_lock);&
&&& spin_lock_irqsave(&state_lock, irqflags);&
if (state == SUSPEND_REQUESTED)&
&&&&&&& state |= SUSPENDED;&&&&&
&&&&&&& abort = 1;&
&&& spin_unlock_irqrestore(&state_lock, irqflags);&
if (abort) {&
if (debug_mask & DEBUG_SUSPEND)&
&&&&&&&&&&& pr_info(&early_suspend: abort, state
%d\n&, state);&
&&&&&&& mutex_unlock(&early_suspend_lock);&
if (debug_mask & DEBUG_SUSPEND)&
&&&&&&& pr_info(&early_suspend: call handlers\n&);&
&&& list_for_each_entry(pos, &early_suspend_handlers, link) {&
if (pos-&suspend != NULL)&
&&&&&&&&&&& pos-&suspend(pos);&
&&& mutex_unlock(&early_suspend_lock);&
if (debug_mask & DEBUG_SUSPEND)&
&&&&&&& pr_info(&early_suspend: sync\n&);&
&&& spin_lock_irqsave(&state_lock, irqflags);&
if (state == SUSPEND_REQUESTED_AND_SUSPENDED)&
&&&&&&& wake_unlock(&main_wake_lock);&
&&& spin_unlock_irqrestore(&state_lock, irqflags);&
在suspend流程中首先判断当前状态是否为SUSPEND_REQUESTED,如果是则置位SUSPENDED标志,如果不是则取消suspend流程;然后遍历浅度休眠链表,从链表头部到尾部依次调用各节点的suspend()函数,执行完后判断当前状态是否为SUSPEND_REQUESTED_AND_SUSPENDED,如果是则释放main_wake_lock,当前系统中如果只存在main_wake_lock这个有效锁,则会在wake_unlock()里面启动深度休眠线程,如果还有其他其他wake_lock则保持当前状态。
void late_resume(struct
work_struct *work)&
struct early_suspend *&
&&& unsigned
int abort = 0;&
&&& mutex_lock(&early_suspend_lock);&
&&& spin_lock_irqsave(&state_lock, irqflags);&
if (state == SUSPENDED)&
&&&&&&& state &= ~SUSPENDED;&
&&&&&&& abort = 1;&
&&& spin_unlock_irqrestore(&state_lock, irqflags);&
if (abort) {&
if (debug_mask & DEBUG_SUSPEND)&
&&&&&&&&&&& pr_info(&late_resume: abort, state
%d\n&, state);&
if (debug_mask & DEBUG_SUSPEND)&
&&&&&&& pr_info(&late_resume: call handlers\n&);&
&&& list_for_each_entry_reverse(pos, &early_suspend_handlers, link)&
if (pos-&resume != NULL)&
&&&&&&&&&&& pos-&resume(pos);&
if (debug_mask & DEBUG_SUSPEND)&
&&&&&&& pr_info(&late_resume: done\n&);&
&&& mutex_unlock(&early_suspend_lock);&
在resume流程中同样首先判断当前状态是否为SUSPENDED,如果是则清除SUSPENDED标志,然后反向遍历浅度休眠链表,按照优先等级从高到低的顺序执行节点的resume()函数。
void early_sys_sync(struct
work_struct *work)&
&&& wake_lock(&sys_sync_wake_lock);&
&&& sys_sync();&
&&& wake_unlock(&sys_sync_wake_lock);&
内核专门为缓存同步建立了一个线程,同时还创建了sys_sync_wake_lock防止在同步缓存时系统进入深度休眠。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:27746次
排名:千里之外
转载:44篇
(1)(3)(1)(6)(4)(32)(1)(1)(2)相关文章推荐:
android 唤醒休眠
在一个打过android补丁的内核中, state_store()函数会走另外一条路,会进入到request_suspend_state()中, 这个文件在earlysuspend.c中. 这些功能都 是android系统加的, 后面会对earlysuspend和late resume 进行介绍.
涉及到的文件:
linux_source/kernel/power/main.c
linux_source/kernel/power/earlysuspend.c
linux_source/kernel/power/wakelock.c
Early Suspend
Early suspend 是android 引进的一种机制, 这种机制在上...
Android平台
阅读(0) 回复(0)
其他文章推荐
Introduction
常常我们开 发程序的时候我们不需要系统唤醒系统锁屏功能,比如我们在做xxxNowTV或XXX播放器这样的程序,用户有时候在看电视或视频的时候不希望系统的锁屏 功能启动,既不想锁频,然而系统却在我们看电视或者视频的时候出来个锁屏的界面进行锁频拉,我们还要想继续看的话还要去解锁,这样好麻烦,不是我们想要 的,那我们该怎么做呢,其实很简单,我这里只讲其中的两种
一 :我们只要...
Android平台
阅读(0) 回复(0)
Introduction
常常我们开 发程序的时候我们不需要系统唤醒系统锁屏功能,比如我们在做xxxNowTV或XXX播放器这样的程序,用户有时候在看电视或视频的时候不希望系统的锁屏 功能启动,既不想锁频,然而系统却在我们看电视或者视频的时候出来个锁屏的界面进行锁频拉,我们还要想继续看的话还要去解锁,这样好麻烦,不是我们想要 的,那我们该怎么做呢,其实很简单,我这里只讲其中的两种
一 :我们只要在程序中用代码实...
阅读(0) 回复(0)
android系统空闲时间,定时休眠
主要实现在/frameworks/base/service/java/com/android/server/PowerManagerService.java中实现
其中比较关键的几个部分如下
private class TimeoutTask implements Runnable
private void setTimeoutLocked(long now, final long originalTimeoutOverride, int nextState)
private Runnable mNotificationTask = new Runnable()
mHandler.postAtTime(mTimeoutTask, when);...
Android平台
阅读(150) 回复(0)
android去掉标题栏和全屏是件很容易的事,最常见的有两种方法:
第一:在程序中实现:
this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉信息栏 注意:这两行代码要写在页面显示之前,即setContentView(R.la...
Android平台
阅读(210) 回复(0)
在 android 的上层是使用 goToSleep() 这个函数让系统进入休眠的。但是这个命令为什么会让 android 进入 Suspend Mode。
以前在做其他系统的时候, 一般都要自己手工去控制 apm_bios 这个设备的,比如使用 ioctl() 调用 apm_bios。所有的系统其原理都是差不多的。只是 android 加入了一个封装, 使程序员可以更简单的操作, 可以不理会底层是如何操作的, 现在解析一个 goToSleep() 是如何工作的。
PowerManagerService.jav...
阅读(60) 回复(0)
LinearLayout 线性布局
android:orientation=&horizontal&
制定线性布局的排列方式
水平 horizontal
垂直 vertical
gravity 控制当前控件内容显示区域
layout_gravity 当前控件在父元素的位置
Layout_weightSum
Layout_weight 额外空间分配(权重)
android:visibility=&invisible&
控制布局是否显示
显示 visible
不显示,但占空间
Android平台
阅读(0) 回复(0)
android 来源:
android操作系统最初由Andy Rubin创办的公司研发而来,最初主要支持手机。
2005年由Google注资收购,并于日正式向外界展示了这款名为android的操作系统,同时组建了一个开放手机联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,他们将共同开发android系统的开放源代码。随后逐渐扩展到平板电脑及其他领域上。
android的主要竞争对手...
Android平台
阅读(0) 回复(0)
android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良android系统。随后Google以Apache开源许可...
Android平台
阅读(30) 回复(0)
原文地址:android移植http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3642283&fromuid=开始编译android。先参考网上的文章拿到android源代码。下载android源码需要用到Git和Repo。Git是一个开源的分布式版本控制软件,它非常适合管理很大的项目,项目文件可以分布储存在多个Git repositories(仓库), 这样可以很方便地创建分支,进行版本比较等,所以android也用它来进行源码管理。 Repo是基于Git的工具,它可以...
阅读(150) 回复(0)
android.mk内的变量定义
LOCAL_PATH
一个android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。例如:
1.LOCAL_PATH:= $(call my-dir)
宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含android.mk file文件的目录)
3.2 include $( CLEAR_VARS)
宏CLEAR_VARS 由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如
LOCAL_MODULE, LOCAL_SRC_FILE...
Android平台
阅读(30) 回复(0)
盛拓传媒:
北京皓辰网域网络信息技术有限公司. 版权所有
北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证:编号(京)字第1149号
ITPUB推荐文章解答你所有技术难题

我要回帖

更多关于 android休眠唤醒 的文章

 

随机推荐