android4.0 休眠喚醒會出現之前介面,我們通過案頭遠程工具可以看到在休眠時候,系統已經進入解鎖介面。可是我們喚醒機器的時候,系統會閃一下之前操作的介面,再進入解鎖介面。所以判斷應該是休眠時候沒有把解鎖介面寫入framebuffer,找到寫framebuffer地方:
if (LIKELY(hw.canDraw())) { // repaint the framebuffer (if needed) const int index = hw.getCurrentBufferIndex(); GraphicLog& logger(GraphicLog::getInstance()); logger.log(GraphicLog::SF_REPAINT, index); handleRepaint(); // inform the h/w that we're done compositing logger.log(GraphicLog::SF_COMPOSITION_COMPLETE, index); hw.compositionComplete(); logger.log(GraphicLog::SF_SWAP_BUFFERS, index); postFramebuffer(); logger.log(GraphicLog::SF_REPAINT_DONE, index); } else { // pretend we did the post hw.compositionComplete(); usleep(16667); // 60 fps period }
可以看到,是根據hw.canDraw()函數的傳回值跳到不同的入口,再找到hw.canDraw()函數的實現:
bool DisplayHardwareBase::canDraw() const{ return mScreenAcquired;}
所以把操作mScreenAcquired的值的相關代碼去掉就可以了:
--- a/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp+++ b/services/surfaceflinger/DisplayHardware/DisplayHardwareBase.cpp@@ -80,11 +80,13 @@ bool DisplayHardwareBase::DisplayEventThread::threadLoop() if (err >= 0) { sp<SurfaceFlinger> flinger = mFlinger.promote(); LOGD("About to give-up screen, flinger = %p", flinger.get());+ /* if (flinger != 0) { mBarrier.close(); flinger->screenReleased(0); mBarrier.wait(); }+ */ } fd = open(kWakeFileName, O_RDONLY, 0); do {@@ -95,8 +97,10 @@ bool DisplayHardwareBase::DisplayEventThread::threadLoop() if (err >= 0) { sp<SurfaceFlinger> flinger = mFlinger.promote(); LOGD("Screen about to return, flinger = %p", flinger.get());+ /* if (flinger != 0) flinger->screenAcquired(0);+ */ } return true; }