1、Android60 亮屏灭屏流程DisplayPowerControlerWMS二亮度设置Android6.0 亮屏灭屏流程(DisplayPowerControler、WMS)(二)亮度设置在setScreenState中先是调用了DisplayPowerState的setScreenState函数。上篇博客我们没有分析,主要分析下亮度的设置流程。cpp view plain copy 在CODE上查看代码片派生到我的代码片public void setScreenState(int state) if (mScreenState != state) if (DEBUG) Slog.d(TA
2、G, setScreenState: state= + state); mScreenState = state; mScreenReady = false; scheduleScreenUpdate(); scheduleScreenUpdate主要通过消息方式,最后调用到下面函数。当我们屏幕刚要点亮,这个时候mScreenBrightness为0,所以这个时候调用mPhotonicModulator.setState设置state是点亮,但是brightness是0的。cpp view plain copy 在CODE上查看代码片派生到我的代码片private final Runnable
3、 mScreenUpdateRunnable = new Runnable() Override public void run() mScreenUpdatePending = false; int brightness = mScreenState != Display.STATE_OFF & mColorFadeLevel 0f ? mScreenBrightness : 0; if (mPhotonicModulator.setState(mScreenState, brightness) if (DEBUG) Slog.d(TAG, Screen ready); mScreenRea
4、dy = true; invokeCleanListenerIfNeeded(); else if (DEBUG) Slog.d(TAG, Screen not ready); ; DisplayPowerState的设置亮度状态逻辑分析mPhotonicModulator.setState应该要PhotonicModulator的run函数结合一起看。cpp view plain copy 在CODE上查看代码片派生到我的代码片public boolean setState(int state, int backlight) synchronized (mLock) boolean stat
5、eChanged = state != mPendingState; boolean backlightChanged = backlight != mPendingBacklight; if (stateChanged | backlightChanged) if (DEBUG) Slog.d(TAG, Requesting new screen state: state= + Display.stateToString(state) + , backlight= + backlight); mPendingState = state; mPendingBacklight = backlig
6、ht; boolean changeInProgress = mStateChangeInProgress | mBacklightChangeInProgress; mStateChangeInProgress = stateChanged; mBacklightChangeInProgress = backlightChanged; if (!changeInProgress) Slog.d(TAG,notify set backlight thread run); mLock.notifyAll(); return !mStateChangeInProgress; 两者结合看先setSt
7、ate设置了状态,只有状态改变时,我们才能重新设置状态(设置到mpendingState和mPendingBacklight)。而在run函数中,当设置的状态mPendingState、mPendingBacklight和mActualState、mActualBacklight(真正设置到背光的状态、亮度)不一样时,才会调用mBlanker.requestDisplayState设置亮度。否则状态没有改变,就会把mStateChangeInProgress 和mBacklightChangeInProgress 设置为false,然后线程就wait住。而此时setState重新设置下来的话,
8、这个时候把亮度和状态设置到mPendingState 和mPendingBacklight 。然后这时mStateChangeInProgress 和 mBacklightChangeInProgress都是false。这样就可以调用mLock的notifyAll函数重新唤醒线程,这样就把把前面setState设置下来的mPendingState和mPendingBacklight再通过mBlanker.requestDisplayState设置到背光设备中去。cpp view plain copy 在CODE上查看代码片派生到我的代码片Override public void run() f
9、or (;) / Get pending change. final int state; final boolean stateChanged; final int backlight; final boolean backlightChanged; synchronized (mLock) state = mPendingState; stateChanged = (state != mActualState); backlight = mPendingBacklight; backlightChanged = (backlight != mActualBacklight); if (!s
10、tateChanged) / State changed applied, notify outer class. postScreenUpdateThreadSafe(); mStateChangeInProgress = false; if (!backlightChanged) mBacklightChangeInProgress = false; if (!stateChanged & !backlightChanged) try mLock.wait(); catch (InterruptedException ex) continue; mActualState = state;
11、mActualBacklight = backlight; / Apply pending change. if (true) Slog.d(TAG, Updating screen state: state= + Display.stateToString(state) + , backlight= + backlight); mBlanker.requestDisplayState(state, backlight); Slog.d(TAG, kangchen Updating screen state: state=); 设置亮度、状态到背光设备DisplayBlanker的reques
12、tDisplayState如下,主要调用requestGlobalDisplayStateInternal函数。cpp view plain copy 在CODE上查看代码片派生到我的代码片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) r
13、equestGlobalDisplayStateInternal(state, brightness); callbacks.onDisplayStateChange(state); if (state != Display.STATE_OFF) requestGlobalDisplayStateInternal(state, brightness); ; requestGlobalDisplayStateInternal函数先是对state和brightness的处理,然后把这个两个变量放在mGlobalDisplayState 和mGlobalDisplayBrightness成员变量中。
14、紧接着调用applyGlobalDisplayStateLocked函数mTempDisplayStateWorkQueue作为参数。最后再调用mTempDisplayStateWorkQueue各个成员的run函数(这里返回的是Runnable接口,这里就会设置状态和亮度到设备中去)。cpp view plain copy 在CODE上查看代码片派生到我的代码片private void requestGlobalDisplayStateInternal(int state, int brightness) if (state = Display.STATE_UNKNOWN) state =
15、Display.STATE_ON; if (state = Display.STATE_OFF) brightness = PowerManager.BRIGHTNESS_OFF; else if (brightness PowerManager.BRIGHTNESS_ON) brightness = PowerManager.BRIGHTNESS_ON; synchronized (mTempDisplayStateWorkQueue) try synchronized (mSyncRoot) if (mGlobalDisplayState = state & mGlobalDisplayB
16、rightness = brightness) return; / no change mGlobalDisplayState = state; mGlobalDisplayBrightness = brightness; applyGlobalDisplayStateLocked(mTempDisplayStateWorkQueue); / Setting the display power state can take hundreds of milliseconds / to complete so we defer the most expensive part of the work
17、 until / after we have exited the critical section to avoid blocking other / threads for a long time. for (int i = 0; i mTempDisplayStateWorkQueue.size(); i+) mTempDisplayStateWorkQueue.get(i).run();/设置亮度、状态到设备 finally mTempDisplayStateWorkQueue.clear(); applyGlobalDisplayStateLocked函数会遍历各个显示设备(多显示)
18、,然后调用updateDisplayStateLocked函数返回一个Runnable,最后把这个Runnable放入之前传入的mTempDisplayStateWorkQueue队列中。cpp view plain copy 在CODE上查看代码片派生到我的代码片private void applyGlobalDisplayStateLocked(List workQueue) final int count = mDisplayDevices.size(); for (int i = 0; i count; i+) DisplayDevice device = mDisplayDevice
19、s.get(i); Runnable runnable = updateDisplayStateLocked(device); if (runnable != null) workQueue.add(runnable); 那下面我们看下updateDisplayStateLocked函数,主要是调用了DisplayDevice的requestDisplayStateLocked函数,当然mGlobalDisplayState和mGlobalDisplayBrightness作为参数。cpp view plain copy 在CODE上查看代码片派生到我的代码片private Runnable
20、updateDisplayStateLocked(DisplayDevice device) / Blank or unblank the display immediately to match the state requested / by the display power controller (if known). DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); if (info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) = 0) return device.r
21、equestDisplayStateLocked(mGlobalDisplayState, mGlobalDisplayBrightness); return null; 这里的DisplayDevice的requestDisplayStateLocked函数,是在LocalDisplayAdapter中实现的,这里吧state和brightness保存在mState和mBrightness中,然后返回Runnable接口,最后在Runnable接口中设置亮度和状态。cpp view plain copy 在CODE上查看代码片派生到我的代码片public Runnable requestDi
22、splayStateLocked(final int state, final int brightness) / Assume that the brightness is off if the display is being turned off. assert state != Display.STATE_OFF | brightness = PowerManager.BRIGHTNESS_OFF; final boolean stateChanged = (mState != state); final boolean brightnessChanged = (mBrightness
23、 != brightness) & mBacklight != null; if (stateChanged | brightnessChanged) final int displayId = mBuiltInDisplayId; final IBinder token = getDisplayTokenLocked(); final int oldState = mState; if (stateChanged) mState = state;/保存state updateDeviceInfoLocked(); if (brightnessChanged) mBrightness = br
24、ightness;/保存brightness / Defer actually setting the display state until after we have exited / the critical section since it can take hundreds of milliseconds / to complete. return new Runnable() /返回Runnable Override public void run() / Exit a suspended state before making any changes. int currentSt
25、ate = oldState; if (Display.isSuspendedState(oldState) | oldState = Display.STATE_UNKNOWN) if (!Display.isSuspendedState(state) setDisplayState(state); currentState = state; else if (state = Display.STATE_DOZE_SUSPEND | oldState = Display.STATE_DOZE_SUSPEND) setDisplayState(Display.STATE_DOZE); curr
26、entState = Display.STATE_DOZE; else return; / old state and new state is off / Apply brightness changes given that we are in a non-suspended state. if (brightnessChanged) Slog.d(TAG, kangchen setDisplayBrightnessbrightness1= + brightness); setDisplayBrightness(brightness); Slog.d(TAG, kangchen setDi
27、splayBrightnessbrightness2= + brightness); / Enter the final desired state, possibly suspended. if (state != currentState) setDisplayState(state); private void setDisplayState(int state) if (DEBUG) Slog.d(TAG, setDisplayState( + id= + displayId + , state= + Display.stateToString(state) + ); try fina
28、l int mode = getPowerModeForState(state); SurfaceControl.setDisplayPowerMode(token, mode);/到SurfaceControl设置状态 finally Trace.traceEnd(Trace.TRACE_TAG_POWER); private void setDisplayBrightness(int brightness) try mBacklight.setBrightness(brightness);/设置亮度 finally Trace.traceEnd(Trace.TRACE_TAG_POWER)
29、; ; return null; DisplayPowerControl设置亮度逻辑(根据VSync信号将亮度慢慢变亮)上面在DisplayPowerState中仅仅是设置状态,比如刚点亮屏幕这个时候其实设置的brightness为0,我们继续分析DisplayPowerState的updatePowerState函数。在updatePowerState函数中,当设置亮度时会调用如下代码:cpp view plain copy 在CODE上查看代码片派生到我的代码片if (!mPendingScreenOff) if (state = Display.STATE_ON | state = Display.STATE_DOZE) animateScreenBrightness(brightness, slowChange ?
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1