(原创)Android6.0亮屏流程之Keyguard Window绘制
亮滅屏問題一直是Android模塊最常見的問題之一。
? ? ? ?由于問題出現(xiàn)問題的地方涉及到公司代碼,我這里僅僅只作原生代碼模塊的分析
? ? ? ?其實在看過另外一篇關(guān)于android亮屏流程的文章就會發(fā)現(xiàn),影響亮屏快慢的因素大致有三種:1.設(shè)置背光流程出問題了,導(dǎo)致屏幕黑屏,2.window繪制時間過長,導(dǎo)致屏幕block時間過長;3.底層surfacecontroller準備時間過長。
而根據(jù)遇到的亮屏慢的問題,基本上都是由于window繪制時間過長,導(dǎo)致屏幕亮屏慢
最近處理的幾個亮屏慢的問題,其中關(guān)鍵log信息基本都是:
10-28 09:02:59.002 ?1393 ?1462 I DisplayPowerController: Blocking screen on until initial contents have been drawn.
10-28 09:03:05.020 ?1393 ?1462 I DisplayPowerController: Unblocked screen on after 6018 ms
由于在android亮屏流程中大致描述的亮屏所走的流程點,但是僅僅只能作為一個粗略的點做參考,但是看到上面的兩條信息,我們可以去追溯一下代碼流程:
在每一次屏幕電源狀態(tài)發(fā)生改變的都會調(diào)用的到DisplayPowerController中的updatePowerState方法,在該方法中如果屏幕狀態(tài)發(fā)生改變的話,會去調(diào)用到animateScreenStateChange,在setScreenState方法里面去設(shè)置屏幕狀態(tài)。那么就到了該問題的主要流程了。
在DisplayPowerController.java中的setScreenState()方法中,有代碼:
[java]?view plain?copy
首先會調(diào)用到 blockScreenOn方法,先看看該方法以及后面要調(diào)用到的unblockScreenOn的方法
[java]?view plain?copy
在blockScreenOn函數(shù)中其實就是創(chuàng)建了一個mPendingScreenOnUnblocker 對象,當該對象為空時,mPendingScreenOnUnblocker == null;返回值才為true。animateScreenStateChange才能繼續(xù)往下執(zhí)行下去。
?
亮屏過程中繪制window過程是通過mWindowManagerPolicy.screenTurningOn(mPendingScreenOnUnblocker);?調(diào)用到PhoneWindowManager中的screenTurningOn(),
[java]?view plain?copy
這里用一個圖來詳細描述
可以看到 整個過程調(diào)用的點較為混亂,這里只能簡單描述一下其調(diào)用過程當PowerManagerService發(fā)出的wakeup請求到DisplayPowerController這邊,在DisplayPowerConrtoller中setScreenState方法中會調(diào)用到PhoneWindowManager模塊的screenTurningOn方法去通過window繪制屏幕。
由于在滅屏之后亮屏首先現(xiàn)實的界面應(yīng)該是鎖屏界面,所以亮屏首先應(yīng)該去繪制keyguard,并且keyguard經(jīng)常會出現(xiàn)超時,當出現(xiàn)keyguard超時時會打印:
WindowManager:Keyguard drawn timeout. Setting mKeyguardDrawComplete
當出現(xiàn)上述打印,便可以確定時keyguard模塊繪制鎖屏超時,需要鎖屏的人去確認超時原因。鎖屏超時時間最長也只有2秒時間。因為
[java]?view plain?copy當mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback);正常執(zhí)行完成的情況下會調(diào)用到finishKeyguardDrawn,當未能正常執(zhí)行,超過1秒還未完成便會發(fā)送消息MSG_KEYGUARD_DRAWN_TIMEOUT強制執(zhí)行finishKeyguardDrawn,? ??
?在finishKeyguardDrawn完成后會檢查所有的亮屏后所依賴的window是否都繪制完成,在mWindowManagerInternal.waitForAllWindowsDrawn(mWindowManagerDrawCallback,WAITING_FOR_DRAWN_TIMEOUT);//WAITING_FOR_DRAWN_TIMEOUT = 1000?中會去檢查window繪制,如上,當超過1秒后,會自動release等待的window,然后正常亮屏。
原文地址:http://blog.csdn.net/u011311586/article/details/53174280
總結(jié)
以上是生活随笔為你收集整理的(原创)Android6.0亮屏流程之Keyguard Window绘制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (原创)Android6.0亮屏流程分析
- 下一篇: Android7.0 PowerMana