android 亮灭屏流程

1、

frameworks\base\core\java\android\hardware\display\DisplayManagerInternal.java

内部服务

 

frameworks\base\services\core\java\com\android\server\display\DisplayManagerService.java

private final class LocalService extends DisplayManagerInternal {
    @Override
    public void initPowerManagement(final DisplayPowerCallbacks callbacks, Handler handler,
            SensorManager sensorManager) {
        synchronized (mSyncRoot) {
            DisplayBlanker blanker = new DisplayBlanker() {
                @Override
                public void requestDisplayState(int state, int brightness) {
                    // The order of operations is important for legacy reasons.
                    if (state == Display.STATE_OFF) {
                        requestGlobalDisplayStateInternal(state, brightness);
                    }

                    callbacks.onDisplayStateChange(state);

                    if (state != Display.STATE_OFF) {
                        requestGlobalDisplayStateInternal(state, brightness);
                    }
                }
            };
            mDisplayPowerController = new DisplayPowerController(
                    mContext, callbacks, handler, sensorManager, blanker);
        }
    }

 

 

DispalyManagerService 会实现DisplayPowerCallbacks  ,并创建DisplayPowerController ,传递DisplayPowerCallbacks 参数,从而可以回调通知PM 

2、

frameworks\base\services\core\java\com\android\server\display\DisplayPowerController.java

final class DisplayPowerController implements AutomaticBrightnessController.Callbacks

实现回调接口updateBrightness

 

显示状态管理,与pms 独立,与传感器相关,异步回调通知PM状态改变

 

frameworks\base\services\core\java\com\android\server\display\DisplayPowerState.java

DisplayPowerController调用,与显示属性相关

内部类PhotonicModulator是一个异步更新屏幕与背光的状态的线程,通过DisplayBlanker

接口mBlanker.requestDisplayState(state, backlight)实现。

当亮度与屏膜状态没有变化,这个线程就进入等待状态。

 

setScreenState

setScreenBrightness

会发送 mScreenUpdateRunnable 

 

 

3、显示管理

frameworks\base\services\core\java\com\android\server\display\LocalDisplayAdapter.java

 

https://wenku.baidu.com/view/892c8115f02d2af90242a8956bec0975f465a4bf.html

https://blog.csdn.net/fu_kevin0606/article/details/54411816

 

 

frameworks\base\services\core\java\com\android\server\display\DisplayPowerController.java

这里如果setScreenState 为false,则会返回。

 

1、执行setScreenState  设置power state 为 ON

frameworks\base\services\core\java\com\android\server\display\DisplayPowerState.java

 

这里setState 将屏膜请求状态设置到DisplayPowerState 变量中,并唤醒

mPhotonicModulator 独立线程,由于当前有设置为ON ,与之前OFF 为不同状态,所以mPhotonicModulator进程执行,执行如下:

 

frameworks\base\services\core\java\com\android\server\display\DisplayManagerService.java

 

这里由于是亮屏所以会执行一下两个函数

           A:callbacks.onDisplayStateChange(state);

           B:requestGlobalDisplayStateInternal(state, brightness);

 

     A: 函数会影响wms 绘制

     B: 函数如下

 

frameworks\base\services\core\java\com\android\server\display\LocalDisplayAdapter.java

 

这里设置背光亮度与DisplayState 即ON,这里比较费时,是一个独立的进程,只要在窗口绘制完之前结束时不会影响亮屏的。

 

2、通知wms 准备亮屏

这里mPendingScreenOnUnblocker是blockScreenOn()中创建的回调函数,这个函数用于wms 绘制好回调回PMS

blockScreenOn();unblockScreenOn 中log

Blocking screen on until initial contents have been drawn.

Unblocked screen on after " + delay + " ms"

表示绘制开始与结束log

 

这里mWindowManagerPolicy.screenTurningOn(mPendingScreenOnUnblocker);如下

 

frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

 

这里会设置一个keyguard 绘制超时消息MSG_KEYGUARD_DRAWN_TIMEOUT,时间为1s.mKeyguardDrawnCallback 是keyguard 绘制完回调的函数。

 

分别对应窗口绘制完成回调与keygurad 绘制完成回调函数。回调函数发送的消息。

Keygurad 绘制完消息回调,用于等待窗口绘制

窗口绘制完的消息处理函数

处理函数回到接通知PMS

 

Keyguard 绘制完成

窗口绘制完,及通知PMS

 

04-25 07:37:07.179   741   975 D WindowManager: All windows drawn!

检测到window 绘制完成,发送消息ALL_WINDOWS_DRAWN

收到消息ALL_WINDOWS_DRAWN

04-25 07:37:07.184   741   771 I WindowManager: All windows ready for display!

发送MSG_WINDOW_MANAGER_DRAWN_COMPLETE收到后调用

Finished screen turning on...

在进行回到会PMS打印

Unblocked screen on after 538 ms

 

亮屏绘制:

frameworks\base\services\core\java\com\android\server\display\DisplayManagerService.java

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值