手机一直显示开机屏幕不亮状态,屏幕下面还显示一串英文poweryd by android 什么意思

极力推荐Android 开发大总结文章:欢迎收藏

本篇文章主要介绍 Android 开发中的部分知识点通过阅读本篇文章,您将收获以下内容:

三、控制系统休眠与唤醒锁

我们不是牛逼的程序员峩们只是程序开发中的垫脚石。
我们不发送红包我们只是红包的搬运工。

应用接口层:PowerManager中开放给应用一系列接口应用可以调用PM的接口申請wakelock,唤醒系统使系统进入睡眠等操作;

Framework层:应用调用PowerManager开放的接口,来对系统进行一些列的操作是在PowerManagerService中完成的PowerManagerService计算系统中和Power相关的计算,是整个电源管理的决策系统同时协调Power如何与系统其它模块的交互,比如亮屏暗屏,系统睡眠唤醒等等。

HAL层:该层只有一个power.c文件該文件通过上层传下来的参数,向/sys/power/wake_lock或者/sys/power/wake_unlock文件节点写数据来与kernel进行通信主要功能是申请/释放锁,维持屏幕亮灭

Kernel层:内核层实现电源管理嘚方案主要包含三个部分:

1、Kernel/power/:实现了系统电源管理框架机制。

3、drivers/power:是设备电源管理的基础框架为驱动提供了电源管理接口。

Android电源管理框架如下图:

PowerManagerServcie是android系统电源管理的核心服务它在Framework层建立起一个策略控制方案,向下决策HAL层以及kernel层来控制设备待机状态控制显示屏,背光燈距离传感器,光线传感器等硬件设备的状态向上提供给应用程序相应的操作接口,比如听音乐时持续保持系统唤醒应用通知来临喚醒手机屏幕等场景


  
 

  
  • WAKEFULNESS_DOZING:表示系统正处于“doze”状态。这种状态下只有低耗电的“屏保”可以运行其他应用进程都被挂起。

 

  

  

创建sensorManager 对象用于與sensor交互,比如距离传感器光线传感器,加速度传感器(doze上使用)获取电池状态服务,和背光服务;

创建mSettingsObserver 监听系统设置变化比如亮屏時间,自动背光屏幕亮度,屏保低电模式等等

总而言之在SystemReady方法中完成的主要工作如下:

获取屏幕最大,最小以及默认亮度值;

创建Notifier对潒用于通知系统中电源状态的改变;

创建WirelessChargerDetector对象,用于检测无线充电的传感器(市面上支持的手机较少)

PowerManager向应用提供了相应的接口以供應用程序调用,来改变系统待机状态屏幕状态,屏幕亮度等PowerManager是PowerManagerService的代理类,PowerManager向上层应用提供交互的接口具体的处理工作在PowerManagerService中完成。下媔介绍PowerManager中提供的相应接口作用:

Wakeup():强制系统从睡眠状态唤醒此接口对应用是不开放的,应用想唤醒系统必须通过设置亮屏标志(后面即將讲到);

gotoSleep():强制系统进入到睡眠状态此接口也是应用不开放。

userActivity():向PowerManagerService报告影响系统休眠的用户活动重计算灭屏时间,背光亮度等例洳触屏,划屏power键等用户活动;

isDeviceIdleMode():返回设备当前的状态,如果处于Idle状态则返回true,Idle状态是在手机长时间没有被使用以及没有运动的情况下手机进入到一种Doze低功耗的模式下,这种状态下手机可能会关掉网络数据访问可以通过监视DEVICE_IDLE_MODE_CHANGED这个广播信息,来监控手机状态的改变

Wakeup流程洳下图所示

PowerManager的wakeup接口可供应用程序调用,来强制唤醒系统如果该设备处于睡眠状态,调用该接口会立即唤醒系统比如按Power键,来电闹鍾等场景都会调用该接口。唤醒系统需要android.Manifest.permission#DEVICE_POWER的权限;


  
 

调用mNotifier向系统中通知系统被唤醒;


  

通过调用到DisplayManagerService中对屏幕状态作出相应的改变通过去与WindowManagerService执荇亮屏之前的屏幕绘制过程,与LightServcie交互来点亮屏幕背光灯其调用过程和具体逻辑在亮屏流程文档中有详细分析。


  

  

  

重新计算睡眠超时时间滅屏超时时间,暗屏超时时间将mUserActivitySummary 置为0,通过计算上一次的用户事件时间与超时时间作对比来判断将屏幕置为亮屏 (USER_ACTIVITY_SCREEN_BRIGHT)还是暗屏(USER_ACTIVITY_SCREEN_DIM),前提是手機处于非睡眠状态


  

Android设备的休眠和唤醒主要基于WakeLock机制。WakeLock是一种上锁机制只要有进程获得了WakeLock锁系统就不会进 入休眠。例如在下载文件或播放音乐时,即使休眠时间到了系统也不能进行休眠。WakeLock可以设置超时超时后会自动解锁。

应用使用WakeLock功能前需要先使用new WakeLock()接口创建一个WakeLock類对象,然后调用它的acquire()方法禁止系统休眠应用完成工作后调用release()方法来恢复休眠机制,否则系统将无法休眠直到耗光所有电量。

第一种昰永久的锁住这样的锁除非显式的放开,否则是不会解锁的所以这种锁用起来要非常的小心(默认)。

第二种锁是超时锁这种锁会茬锁住后一段时间解锁。

setReferenceCounted()设置计数锁和非计数锁;wakelock分为计数锁和非计数锁两种:计数锁是应用调用一次acquire申请必定会对应一个release来释放;非计數锁应用调用多次acquire调用一次release就可释放前面acquire的锁。在申请wakelock时默认申请的是计数锁



  

  

在应用持有wakelock锁执行完相应的事物之后,要及时调用release()来執行释放wakelock操作,否则会导致设备保持唤醒迟迟进入不了睡眠状态,严重影响手机功耗正常情况下,每个wakelock的acquire都应该对应一个release操作release操作囷acquire流程相似。

 
 

  

  

  

因此Android实现防止系统休眠的功能是通过向设备文件“sys/power/wake_lock”中写数据来完成的,如果写的是“PowerManagerService.WakeLocks”系统将不能进入休眠状态,但昰屏幕会关闭;如果写的是“PowerManagerService.Display”则屏幕不会关闭。如果系统要恢复休眠再向设备文件“sys/power/wake_unlock”中写入同样的字符串就行了。


  

updatePowerStateLocked()方法并不长泹是其涉及调用的方法较为复杂,还是不容以理解下面作详细分析:
电源状态更新,最重要的标志变量为mDirty当与电源相关的状态改变,嘟会通过置位的方法反映在mDirty集合变量了比如充电状态,屏幕亮度电源设置,唤醒状态等发生改变都会在mDirty中反映出来


  
  • 3).接下来就是一个无限循环但是这个循环最多执行两次便退出了,这一点将在后面详细分析循环中最先调用updateWakeLockSummaryLocked,来将系统中所有的wakelock锁更新到一个集合变量mWakeLockSummary中也就是不管系统中创建了多少个wakelock,一个便足以阻止系统进入睡眠状态因此这里将所有的wakelock总结后通过置位的方法保存到一个变量中,应鼡创建wakelock时会指定wakelock的类型不同的wakelock类型置于不同的位。

  • 5).循环中调用的第三个方法是updateWakefulnessLocked()这个方法是循环结束的关键,如果它的返回值为true则表礻wakefulness的状态发生改变了,降继续循环重新调用前面两个方法更新userActivity和Wakelock集合变量如果能第二次调用updateWakefulnessLocked()一定会返回false,继而跳出循环方法实现为

 

  

如果if语句中有一项成立则返回false,则跳出死循环当时如果第一次调用该方法,正常情况下当为false如果第二次调用到此肯定会返回false,因为第二佽调用时mWakefulness 为WAKEFULNESS_DREAMING。而gotoSleepNoUpdateLocked前面已作分析这里就不多讲了。

  • 7).接下来调用updateDreamLocked(),更新屏保模式具体处理在handleSandman()函数中,该函数是当系统进入/退出屏保状态或鍺Dozing下状态调用下面详细分析该函数代码:


这里主要更新变量startDreaming,当前状态如果可以进入屏保或者Dozing状态则置为true,否则置为false,如果设置了屏保则灭屏之后会进入一段时间屏保,然后灭屏;如果没有设置屏保则默认进入dozing(打盹)状态


  

此处判断屏保服务是否启动了,而在屏保服务实在系统启动时在StartOtherService中随系统启动在次重启屏保服务


  

如果屏保结束,判断是进入唤醒状态还是进入睡眠状态然后更新电源状态。若是还为到时且wakefulness为WAKEFULNESS_DOZING则返回,继续处于dozing状态


  • 9)最后一个函数updateSuspendBlockerLocked();由于系统中可能需要释放最后一个维持CPU唤醒或者维持屏幕亮灭的Blocker,所以必须将所有事物处理完成再执行该操作。由于该函数是由PowerManagerService调用到底层的唯一入口所以十分重要:

 

则是表示是否维持屏幕亮灭的变量,true表示维歭屏幕亮false表示可以关闭屏幕。



  

下图为概述电源管理核心函数处理流程及作用

Android的电源管理提出wakelock的是一套全新的机制跟我们C++里使用的智能指针(Smart pointer),借用智能指针的思想来设计电源的使用和分配Smart Pointer都是引用,申请引用则它的引用计数会自动加1取消引用则引用计数减1,使用叻智能指针的对象当它的引用计数为0时,则该对象会被回收掉同样, 我们的wake_lock也保持使用计数只不过这种“智能指针”的所使用的资源不再是内存,而是电量应用程序会通过特定的WakeLock去访问硬件,然后硬件会根据引用计数是否为0来决定是不是需要关闭这一硬件的供电

電源管理于Framework层恰似为一个策略控制器,来掌控不同状态下的电源状态改变和更新PowerManager作为一个重要服务在开机屏幕不亮启动时便启动并注册箌系统内,当上层应用程序需要使用该服务只需调用PowerManager开放接口即可控制系统某些电源状态的改变而PowerManagerServcie提供服务端处理逻辑,在交互中做主偠电源控制工作其中与之交互的模块最频繁的为Display,WindowLight,和Battery等其交互之复杂,联系之紧密实非一言以蔽之

至此,本篇已结束如有不對的地方,欢迎您的建议与指正同时期待您的关注,感谢您的阅读谢谢!

如有侵权,请联系小编小编对此深感抱歉,届时小编会删除文章立即停止侵权行为,请您多多包涵

既然都看到这里,领两个红包在走吧!
以下两个红包每天都可以领取

1.支付宝搜索 或扫码支付宝红包海报。

支付宝扫一扫每天领取大红包

2.微信红包,微信扫一扫即可领取红包

微信扫一扫每天领取微信红包

小礼物走一走,来简書关注我

Android 的电源管理也是很重要的一部分比如在待机的时候关掉不用的设备,timeout之后的屏幕和键盘背光的关闭用户操作的时候该打开多少设备等等,这些都 直接关系到产品的待機时间以及用户体验。

framework层主要有这两个文件:

系统在Sleep状态时如果检测到任何一个Wakeup source, 则CPU会从Sleep状态被唤醒,并且调用相关的驱动的resume函数,接下来马仩调用前期注册的early suspend驱动的resume函数,最后系统状态回到AWAKE状态.这里有个问题就是所有注册过early suspend的函数在进Suspend的第一阶段被调用可以理解,但是在resume的时候,

我要回帖

更多关于 开机屏幕不亮 的文章

 

随机推荐