Kernel logo到Bootanimaiton显示之源码分析

本文深入分析了Linux系统从Kernel Logo显示到Bootanimation开机动画的整个过程,涉及开机logo的显示、开机动画的启动及SurfaceFlinger服务的作用。在Kernel层面,console_init_action负责显示logo,而在用户态,SurfaceFlinger启动bootanim服务来播放开机动画。
摘要由CSDN通过智能技术生成


Kernel logoBootanimaiton显示之源码分析

问题的引入9010项目中发现一个问题:从kernel logobootanimaiton开机动画,中间会存在一个黑屏的时间,或长或短。长时间显示像是死机,短时间即类似界面间的跳转(优化后)。原因在于当Bootanimation绘画之前会有一个清屏的动作,具体的解决思路及方法在mediatek上有相关的,这里先分析一下这两个阶段的源码。

首先明确一点,开机logo图片的显示是在初始化kernel时(用户态);开机动画确切的来说是在SystemServer进程启动本地服务SurfaceFlinger时显示的,属于内核态。用户态与内核态之间通过系统调用层Syscall切换,实质上是一种软中断手段。

 

注:所有源码基于3710项目

可能涉及到几处源码的path:

1init.rc:/system/core/rootdir/init.rc

2init.c:/system/core/init/init.cpp

3Bootanimation相关文件:/frameworks/base/cmds/bootanimation/...

一、开机log的显示过程(初始化kernel时)

1、在3710/system/core/init/init.c下有这么一段源码:

    // Queue an action that waits for coldboot done so we know ueventd has set up all of /dev...

    am.QueueBuiltinAction(wait_for_coldboot_done_action, "wait_for_coldboot_done");

    // ... so that we can start queuing up actions that require stuff from /dev.

    ...

    am.QueueBuiltinAction(console_init_action, "console_init");

    

    说明:上述注释的大意就是等待冷启动(按下电源键开机)完成后,队列里的action会排队等待被执行,action是从启动脚本init.rc中解析得到的。当某个action需要被执行的时候,它会被添加到Queue列表中,以便init进程可以执行。我们知道,init进程最终会陷入一个无限的循环中,因此上述被添加到队列中的"console_init_action"会在init的循环过程中被执行。其中的“console_ini

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值