1. 描述:
副屏开机动画播放开始播放的时间点比主屏开机动画播放的时间点晚
2. SurfaceFlinger修改
在SurfaceFlinger的init初始化方法中,原生代码,只是在此处初始化了主屏的displayState,背屏的displayState初始化流程貌似从Frameworks中的DisplayManagerService往下初始化的(这个猜测,还未仔细研究),这就导致了背屏开机动画播放开始播放的时间点比主屏开机动画播放的时间点晚(实际上背屏开机线程已经起来,送图已经开始了一段时间,但dispalyState未初始化完成,导致背屏开机动画part0中的图片未显示).为了解决这个问题,在SurfaceFlinger的init方法中,初始化主屏的displayState时,同时初始化背屏的displayState,即可实现同步播放
3.在SurfaceFlinger.cpp修改
+++ b/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
在这里插入代码片
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
```d.what = DisplayState::eDisplayProjectionChanged |
DisplayState::eLayerStackChanged;
d.token = token;
@@ -4306,7 +4311,37 @@ void SurfaceFlinger::onInitializeDisplays() {
d.width = 0;
d.height = 0;
displays.add(d);
- setTransactionState(state, displays, 0, nullptr, mPendingInputWindowCommands, -1, {}, false,
+
+ //hwt add Secondary screen startup animation synchronized with main screen 24.03.21 start
+ for (const auto& [id, token] : mPhysicalDisplayTokens) {
+ const auto displayExt = getDisplayDeviceLocked(token);
+ const sp<IBinder> backToken = displayExt->getDisplayToken().promote();
+ LOG_ALWAYS_FATAL_IF(backToken == nullptr);
+ ALOGE("hwt SurfaceFlinger backDisplay: %d", displayExt? 1 : 0 );
+ if (displayExt!=display) {
+ DisplayState backDisplayState;
+ backDisplayState.what = DisplayState::eDisplayProjectionChanged | DisplayState::eLayerStackChanged;
+ backDisplayState.token = backToken;
+ backDisplayState.layerStack = 0;//背屏的display id
+ backDisplayState.orientation = ui::ROTATION_0;//强制转90度
+ //backDisplayState.orientedDisplaySpaceRect.makeInvalid();
+ //backDisplayState.layerStackSpaceRect.makeInvalid();
+ backDisplayState.frame.makeInvalid();
+ backDisplayState.viewport.makeInvalid();
+ backDisplayState.viewport = Rect(getDisplayDeviceLocked(token)->getWidth(),getDisplayDeviceLocked(token)->getHeight());
+ backDisplayState.width = 0;
+ backDisplayState.height = 0;
+ displays.add(backDisplayState);
+ setPowerModeInternal(displayExt, hal::PowerMode::ON);
+ ALOGE("hwt Secondary screen token 11 ");
+ }
+
+ ALOGE("hwt Secondary screen : %s",__FUNCTION__);
+ }
+
+ //end
+
+ setTransactionState(state, displays, 0, nullptr, mPendingInputWindowCommands, -1, {}, false,
{});
setPowerModeInternal(display, hal::PowerMode::ON);