Android6.0 亮屏滅屏流程(DisplayPowerControler、WMS)(二)亮度設(shè)置_第1頁(yè)
Android6.0 亮屏滅屏流程(DisplayPowerControler、WMS)(二)亮度設(shè)置_第2頁(yè)
Android6.0 亮屏滅屏流程(DisplayPowerControler、WMS)(二)亮度設(shè)置_第3頁(yè)
Android6.0 亮屏滅屏流程(DisplayPowerControler、WMS)(二)亮度設(shè)置_第4頁(yè)
Android6.0 亮屏滅屏流程(DisplayPowerControler、WMS)(二)亮度設(shè)置_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Android6.0 亮屏滅屏流程(DisplayPowerControler、WMS)(二)亮度設(shè)置從這個(gè)函數(shù)開(kāi)始分析,主要分析下亮度的設(shè)置流程。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片public void setScreenState(int state) if (mScreenState != state) if (DEBUG) Slog.d(TAG, "setScreenState: state=" + state); mScreenState = state; mScreenReady = false; scheduleSc

2、reenUpdate(); scheduleScreenUpdate主要通過(guò)消息方式,最后調(diào)用到下面函數(shù)。當(dāng)我們屏幕剛要點(diǎn)亮,這個(gè)時(shí)候mScreenBrightness為0,所以這個(gè)時(shí)候調(diào)用mPhotonicModulator.setState設(shè)置state是點(diǎn)亮,但是brightness是0的。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片private final Runnable mScreenUpdateRunnable = new Runnable() Override public void run() mScreenUpdatePending =

3、false; int brightness = mScreenState != Display.STATE_OFF && mColorFadeLevel > 0f ? mScreenBrightness : 0; if (mPhotonicModulator.setState(mScreenState, brightness) if (DEBUG) Slog.d(TAG, "Screen ready"); mScreenReady = true; invokeCleanListenerIfNeeded(); else if (DEBUG) Slog.d

4、(TAG, "Screen not ready"); ; DisplayPowerState的設(shè)置亮度狀態(tài)邏輯分析mPhotonicModulator.setState應(yīng)該要PhotonicModulator的run函數(shù)結(jié)合一起看。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片public boolean setState(int state, int backlight) synchronized (mLock) boolean stateChanged = state != mPendingState; boolean backlight

5、Changed = backlight != mPendingBacklight; if (stateChanged | backlightChanged) if (DEBUG) Slog.d(TAG, "Requesting new screen state: state=" + Display.stateToString(state) + ", backlight=" + backlight); mPendingState = state; mPendingBacklight = backlight; boolean changeInProgress

6、 = mStateChangeInProgress | mBacklightChangeInProgress; mStateChangeInProgress = stateChanged; mBacklightChangeInProgress = backlightChanged; if (!changeInProgress) Slog.d(TAG,"notify set backlight thread run"); mLock.notifyAll(); return !mStateChangeInProgress; 兩者結(jié)合看先setState設(shè)置了狀態(tài),只有狀態(tài)改變時(shí)

7、,我們才能重新設(shè)置狀態(tài)(設(shè)置到mpendingState和mPendingBacklight)。而在run函數(shù)中,當(dāng)設(shè)置的狀態(tài)mPendingState、mPendingBacklight和mActualState、mActualBacklight(真正設(shè)置到背光的狀態(tài)、亮度)不一樣時(shí),才會(huì)調(diào)用mBlanker.requestDisplayState設(shè)置亮度。否則狀態(tài)沒(méi)有改變,就會(huì)把mStateChangeInProgress 和mBacklightChangeInProgress 設(shè)置為false,然后線程就wait住。而此時(shí)setState重新設(shè)置下來(lái)的話,這個(gè)時(shí)候把亮度和狀態(tài)設(shè)置到mPe

8、ndingState 和mPendingBacklight 。然后這時(shí)mStateChangeInProgress 和 mBacklightChangeInProgress都是false。這樣就可以調(diào)用mLock的notifyAll函數(shù)重新喚醒線程,這樣就把把前面setState設(shè)置下來(lái)的mPendingState和mPendingBacklight再通過(guò)mBlanker.requestDisplayState設(shè)置到背光設(shè)備中去。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片Override public void run() for (;) / Get pen

9、ding 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 (!stateChanged) / S

10、tate changed applied, notify outer class. postScreenUpdateThreadSafe(); mStateChangeInProgress = false; if (!backlightChanged) mBacklightChangeInProgress = false; if (!stateChanged && !backlightChanged) try mLock.wait(); catch (InterruptedException ex) continue; mActualState = state; mActual

11、Backlight = 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="); 設(shè)置亮度

12、、狀態(tài)到背光設(shè)備DisplayBlanker的requestDisplayState如下,主要調(diào)用requestGlobalDisplayStateInternal函數(shù)。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

13、(state = Display.STATE_OFF) requestGlobalDisplayStateInternal(state, brightness); callbacks.onDisplayStateChange(state); if (state != Display.STATE_OFF) requestGlobalDisplayStateInternal(state, brightness); ; requestGlobalDisplayStateInternal函數(shù)先是對(duì)state和brightness的處理,然后把這個(gè)兩個(gè)變量放在mGlobalDisplayState 和m

14、GlobalDisplayBrightness成員變量中。緊接著調(diào)用applyGlobalDisplayStateLocked函數(shù)mTempDisplayStateWorkQueue作為參數(shù)。最后再調(diào)用mTempDisplayStateWorkQueue各個(gè)成員的run函數(shù)(這里返回的是Runnable接口,這里就會(huì)設(shè)置狀態(tài)和亮度到設(shè)備中去)。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片private void requestGlobalDisplayStateInternal(int state, int brightness) if (state = Di

15、splay.STATE_UNKNOWN) state = Display.STATE_ON; if (state = Display.STATE_OFF) brightness = PowerManager.BRIGHTNESS_OFF; else if (brightness < 0) brightness = PowerManager.BRIGHTNESS_DEFAULT; else if (brightness > PowerManager.BRIGHTNESS_ON) brightness = PowerManager.BRIGHTNESS_ON; synchronized

16、 (mTempDisplayStateWorkQueue) try synchronized (mSyncRoot) if (mGlobalDisplayState = state && mGlobalDisplayBrightness = brightness) return; / no change mGlobalDisplayState = state; mGlobalDisplayBrightness = brightness; applyGlobalDisplayStateLocked(mTempDisplayStateWorkQueue); / Setting th

17、e display power state can take hundreds of milliseconds / to complete so we defer the most expensive part of the work 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+) mTempDisplayStateWo

18、rkQueue.get(i).run();/設(shè)置亮度、狀態(tài)到設(shè)備 finally mTempDisplayStateWorkQueue.clear(); applyGlobalDisplayStateLocked函數(shù)會(huì)遍歷各個(gè)顯示設(shè)備(多顯示),然后調(diào)用updateDisplayStateLocked函數(shù)返回一個(gè)Runnable,最后把這個(gè)Runnable放入之前傳入的mTempDisplayStateWorkQueue隊(duì)列中。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片private void applyGlobalDisplayStateLocked(Li

19、st<Runnable> workQueue) final int count = mDisplayDevices.size(); for (int i = 0; i < count; i+) DisplayDevice device = mDisplayDevices.get(i); Runnable runnable = updateDisplayStateLocked(device); if (runnable != null) workQueue.add(runnable); 那下面我們看下updateDisplayStateLocked函數(shù),主要是調(diào)用了Displa

20、yDevice的requestDisplayStateLocked函數(shù),當(dāng)然mGlobalDisplayState和mGlobalDisplayBrightness作為參數(shù)。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片private Runnable updateDisplayStateLocked(DisplayDevice device) / Blank or unblank the display immediately to match the state requested / by the display power controller (if

21、known). DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); if (info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) = 0) return device.requestDisplayStateLocked(mGlobalDisplayState, mGlobalDisplayBrightness); return null; 這里的DisplayDevice的requestDisplayStateLocked函數(shù),是在LocalDisplayAdapter中

22、實(shí)現(xiàn)的,這里吧state和brightness保存在mState和mBrightness中,然后返回Runnable接口,最后在Runnable接口中設(shè)置亮度和狀態(tài)。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片public Runnable requestDisplayStateLocked(final int state, final int brightness) / Assume that the brightness is off if the display is being turned off. assert state != Display.S

23、TATE_OFF | brightness = PowerManager.BRIGHTNESS_OFF; final boolean stateChanged = (mState != state); final boolean brightnessChanged = (mBrightness != brightness) && mBacklight != null; if (stateChanged | brightnessChanged) final int displayId = mBuiltInDisplayId; final IBinder token = getDi

24、splayTokenLocked(); final int oldState = mState; if (stateChanged) mState = state;/保存state updateDeviceInfoLocked(); if (brightnessChanged) mBrightness = brightness;/保存brightness / Defer actually setting the display state until after we have exited / the critical section since it can take hundreds o

25、f milliseconds / to complete. return new Runnable() /返回Runnable Override public void run() / Exit a suspended state before making any changes. int currentState = oldState; if (Display.isSuspendedState(oldState) | oldState = Display.STATE_UNKNOWN) if (!Display.isSuspendedState(state) setDisplayState(

26、state); currentState = state; else if (state = Display.STATE_DOZE_SUSPEND | oldState = Display.STATE_DOZE_SUSPEND) setDisplayState(Display.STATE_DOZE); currentState = Display.STATE_DOZE; else return; / old state and new state is off / Apply brightness changes given that we are in a non-suspended sta

27、te. if (brightnessChanged) Slog.d(TAG, "kangchen setDisplayBrightnessbrightness1=" + brightness); setDisplayBrightness(brightness); Slog.d(TAG, "kangchen setDisplayBrightnessbrightness2=" + brightness); / Enter the final desired state, possibly suspended. if (state != currentStat

28、e) setDisplayState(state); private void setDisplayState(int state) if (DEBUG) Slog.d(TAG, "setDisplayState(" + "id=" + displayId + ", state=" + Display.stateToString(state) + ")"); try final int mode = getPowerModeForState(state); SurfaceControl.setDisplayPowe

29、rMode(token, mode);/到SurfaceControl設(shè)置狀態(tài) finally Trace.traceEnd(Trace.TRACE_TAG_POWER); private void setDisplayBrightness(int brightness) try mBacklight.setBrightness(brightness);/設(shè)置亮度 finally Trace.traceEnd(Trace.TRACE_TAG_POWER); ; return null; DisplayPowerControl設(shè)置亮度邏輯(根據(jù)VSync信號(hào)將亮度慢慢變亮)上面在DisplayP

30、owerState中僅僅是設(shè)置狀態(tài),比如剛點(diǎn)亮屏幕這個(gè)時(shí)候其實(shí)設(shè)置的brightness為0,我們繼續(xù)分析DisplayPowerState的updatePowerState函數(shù)。在updatePowerState函數(shù)中,當(dāng)設(shè)置亮度時(shí)會(huì)調(diào)用如下代碼:cpp view plain copy 在CODE上查看代碼片派生到我的代碼片if (!mPendingScreenOff) if (state = Display.STATE_ON | state = Display.STATE_DOZE) animateScreenBrightness(brightness, slowChange ? BRIG

31、HTNESS_RAMP_RATE_SLOW : BRIGHTNESS_RAMP_RATE_FAST); else animateScreenBrightness(brightness, 0); 我們注意到這里有一個(gè)BRIGHTNESS_RAMP_RATE_SLOW 和BRIGHTNESS_RAMP_RATE_FAST(這里涉及到亮度顯示原理我們后面分析),先看animateScreenBrightness函數(shù)。這里函數(shù)主要調(diào)用了mScreenBrightnessRampAnimator.animateTo函數(shù)。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片pri

32、vate void animateScreenBrightness(int target, int rate) if (mScreenBrightnessRampAnimator.animateTo(target, rate) try mBatteryStats.noteScreenBrightness(target); catch (RemoteException ex) / same process 我們?cè)賮?lái)看mScreenBrightnessRampAnimator 對(duì)象的創(chuàng)建cpp view plain copy 在CODE上查看代碼片派生到我的代碼片mScreenBrightness

33、RampAnimator = new RampAnimator<DisplayPowerState>( mPowerState, DisplayPowerState.SCREEN_BRIGHTNESS); 我們注意一個(gè)參數(shù)是DisplayPowerState對(duì)象mPowerState,另一個(gè)參數(shù)是DisplayPowerState.SCREEN_BRIGHTNESScpp view plain copy 在CODE上查看代碼片派生到我的代碼片public static final IntProperty<DisplayPowerState> SCREEN_BRIGHTN

34、ESS = new IntProperty<DisplayPowerState>("screenBrightness") Override public void setValue(DisplayPowerState object, int value) object.setScreenBrightness(value); Override public Integer get(DisplayPowerState object) return object.getScreenBrightness(); ; RampAnimator的構(gòu)造函數(shù)。cpp view p

35、lain copy 在CODE上查看代碼片派生到我的代碼片public RampAnimator(T object, IntProperty<T> property) mObject = object; mProperty = property; mChoreographer = Choreographer.getInstance(); 我們結(jié)合RampAnimator的構(gòu)造函數(shù),再來(lái)分析RampAnimator的animateTo函數(shù)。1. 當(dāng)rate<=0時(shí),這個(gè)時(shí)候,我們直接調(diào)用mProperty.setValue。就是調(diào)用DisplayPowerState的setSc

36、reenBrightness函數(shù)。這個(gè)setScreenBrightness函數(shù)我們后面分析。2. 當(dāng)rate>0時(shí),這個(gè)時(shí)候會(huì)調(diào)用postAnimationCallback函數(shù)(這個(gè)函數(shù)根據(jù)VSync信號(hào)過(guò)來(lái),把亮度慢慢上升的一個(gè)過(guò)程),而且mAnimating置為true。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片public boolean animateTo(int target, int rate) / Immediately jump to the target the first time. if (mFirstTime | rate &

37、lt;= 0) if (mFirstTime | target != mCurrentValue) mFirstTime = false; mRate = 0; mTargetValue = target; mCurrentValue = target; mProperty.setValue(mObject, target);/設(shè)置值 if (mAnimating) mAnimating = false; cancelAnimationCallback(); if (mListener != null) mListener.onAnimationEnd(); return true; retu

38、rn false; / Adjust the rate based on the closest target. / If a faster rate is specified, then use the new rate so that we converge / more rapidly based on he new request. / If a slower rate is specified, then use the new rate only if the current / value is somewhere in between the new and the old t

39、arget meaning that / we will be ramping in a different direction to get there. / Otherwise, continue at the previous rate. if (!mAnimating | rate > mRate | (target <= mCurrentValue && mCurrentValue <= mTargetValue) | (mTargetValue <= mCurrentValue && mCurrentValue <= t

40、arget) mRate = rate; final boolean changed = (mTargetValue != target); mTargetValue = target; / Start animating. if (!mAnimating && target != mCurrentValue) mAnimating = true; mAnimatedValue = mCurrentValue; mLastFrameTimeNanos = System.nanoTime(); postAnimationCallback(); return changed; 下面

41、我們先分析postAnimationCallback函數(shù),這個(gè)和之前分析WMS的VSync信號(hào)類似,當(dāng)VSync信號(hào)過(guò)來(lái)時(shí),會(huì)調(diào)用mAnimationCallback函數(shù)。(可以看之前博客cpp view plain copy 在CODE上查看代碼片派生到我的代碼片private void postAnimationCallback() mChoreographer.postCallback(Choreographer.CALLBACK_ANIMATION, mAnimationCallback, null); 那我們繼續(xù)看mAnimationCallback 的run函數(shù),這個(gè)函數(shù)當(dāng)當(dāng)前值和

42、上一次值不一樣,我們就調(diào)用DisplayPowerState的setScreenBrightness來(lái)設(shè)置亮度。而且當(dāng)前值不是目標(biāo)值,我們就繼續(xù)調(diào)用postAnimationCallback函數(shù),來(lái)設(shè)置VSync回調(diào)。最后當(dāng)亮度變成目標(biāo)值后,將mAnimating 置為false,代表亮度變化的動(dòng)畫(huà)結(jié)束了。cpp view plain copy 在CODE上查看代碼片派生到我的代碼片private final Runnable mAnimationCallback = new Runnable() Override / Choreographer callback public void un

43、() final long frameTimeNanos = mChoreographer.getFrameTimeNanos(); final float timeDelta = (frameTimeNanos - mLastFrameTimeNanos) * 0.000000001f; mLastFrameTimeNanos = frameTimeNanos; final float scale = ValueAnimator.getDurationScale(); if (scale = 0) / Animation off. mAnimatedValue = mTargetValue; else final float amount = timeDelta * mRate / scale; if (mTargetValue > mCurrentValue) mAnimatedValue = Math.min(mAnimatedValue + amount, mTargetValue); else mAnimatedValue = Math.max(m

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論