Android10多屏开机动画

本文介绍了Android10系统中为支持多屏播放不同开机动画的需求,对DisplayManagerService、BootAnimation和SurfaceFlinger所做的修改。DisplayManagerService避免了对layerstack的设置,BootAnimation进行了多动画支持和资源选择的改造,SurfaceFlinger则解决了副屏初始化和powermode设置。详细阐述了bootanimation和SurfaceFlinger的源码修改,以及DisplayManagerService在系统启动后如何保持与bootanimation的一致性。
摘要由CSDN通过智能技术生成

        针对IVI多屏方案,部分场景可能会有支持不同屏播放不同的开机动画的需求,甚至是有动态支持替换动画的需求。原生的BootAnimation并不支持此功能,因此需要针对这种需求,从DisplayManagerService->BootAnimation->SurfaceFlinger的通路进行修改支持。

        DisplayManagerService的修改,主要是为了避免系统启动初期DisplayManagerService的对各个屏的layerstack的设置。因为启动前期并没有任何的window,因此在DMS来看,所有的display是没有内容的,因此直接使用了主显的显示内容。

        BootAnimation的修改,就是要支持多个动画的播放、动画资源文件的选择,以及各display的layerstack的设置。

        SurfaceFlinger的修改,主要是支持了多个屏同时进入动画的显示,SurfaceFlinger原生的框架中,对所有启动时已接入的显示设备是同时加载的,但默认没有设置layerstack、powermode等信息,因此除主屏外,其他屏的初始化都是在DisplayManagerService启动后才进行的,因此可以看到多屏的动画在播放时,是主屏先显示,让等隔几秒后其他屏才显示动画。

SurfaceFlinger层的修改

        SurfaceFlinger层主要解决的是所有副屏的初始化问题,主要是powermode的设置:

diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 1cfc303..b4ade6b 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -4541,31 +4541,37 @@ void SurfaceFlinger::onInitializeDisplays() {
     setTransactionState(state, displays, 0, nullptr, mPendingInputWindowCommands, -1, {}, {});

     setPowerModeInternal(display, HWC_POWER_MODE_NORMAL);
+
 #if ENABLE_POWER_EXTERNAL_DISPLAY
+    for (const auto& [id, token] : mPhysicalDisplayTokens) {
+        const auto displayExt = getDisplayDeviceLocked(token);
+        if (displayExt == display)
+            continue;
+        if(displayExt)
+        {
+            const sp<IBinder> tokenExt = displayExt->getDisplayToken().promote();
+            LOG_ALWAYS_FATAL_IF(tokenExt == nullptr);
+
+            // reset screen orientation and use primary layer stack
+            Vector<ComposerState> stateExt;
+            Vector<DisplayState> displayStateExts;
+            DisplayState ds;
+            ds.what = DisplayState::eDisplayProjectionChanged |
+                     DisplayState::eLayerStackChanged;
+            ds.token = tokenExt;
+            ds.layerStack = 0;
+            ds.orientation = DisplayState::eOrientationDefault;
+            ds.frame.makeInvalid();
+            ds.viewport.makeInvalid();
+            ds.width = 0;
+            ds.height = 0;
+            displayStateExts.add(ds);
+            setTransactionState(stateExt, displayStateExts, 0, nullptr, mPendingInputWindowCommands,
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 开机动画的加载流程如下: 1. 开机自检:开机后,首先进行硬件自检。如果自检通过,将会启动 bootloader。 2. Bootloader:Bootloader 负责初始化硬件设备,加载 kernel,并且将 kernel 加载到内存中。 3. Kernel:Kernel 是 Android 操作系统的核心,负责初始化硬件设备,启动驱动程序,加载文件系统等。 4. Init 进程:Init 进程是 Android 系统中的第一个用户进程,它负责启动系统中所有的服务,并且加载所有的配置文件和属性。 5. SurfaceFlinger:SurfaceFlinger 是 Android 系统中用于显示图形的核心服务,它在启动后会创建一个显示屏幕,显示屏幕上的内容就是从应用程序中传递过来的。 6. Zygote 进程:Zygote 进程是 Android 系统中的一个特殊进程,它负责预加载常用的类和资源,以提高应用程序的启动速度。当应用程序需要启动时,Zygote 进程会 fork 出一个新的进程,该进程会继承 Zygote 进程的状态,从而加速应用程序的启动。 7. 开机动画:在上述进程启动后,系统会加载开机动画开机动画通常是一个视频或者一组图片,这些图片或视频会被 SurfaceFlinger 显示在屏幕上。 8. 启动屏幕:当开机动画结束后,系统会显示一个启动屏幕,表示 Android 系统已经启动完毕。此时,用户就可以开始使用 Android 设备了。 总的来说,Android 开机动画加载流程比较复杂,其中涉及到多个进程和服务,需要相互配合才能完成整个过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值