Android 12 开机动画代码与流程详解 您所在的位置:网站首页 安卓动画代码 Android 12 开机动画代码与流程详解

Android 12 开机动画代码与流程详解

2024-07-13 12:39| 来源: 网络整理| 查看: 265

开机动画分为三个部分:

 第一个开机画面是在内核启动的过程中出现的,它是一个静态的画面,在默认情况下,这个画面是不会出现的。

第二个开机画面是在init进程启动的过程中出现的,它也是一个静态的画面。

第三个开机画面是在系统服务启动的过程中出现的,它是一个动态的画面,就是使用比较多的bootanimation模块。

无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的。下图是开机动画从按下power键到开机动画结束的整个流程:

这个部分在代码中主要涉及的文件是:

/frameworks/base/cmds/bootanimation/Android.bp // 该模块的编译规则,在对系统进行全部编译的时候,会首先包含这个bp文件,然后等到编译这个模块时,根据bp文件中的定义,编译出指定的目标内容。

/frameworks/base/cmds/bootanimation/bootanim.rc       // rc文件,用于init主进程拉起该模块

/frameworks/base/cmds/bootanimation/BootAnimation.cpp// 该模块的核心代码

/frameworks/base/cmds/bootanimation/bootanimation_main.cpp // 该模块的主程序入口

/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp  //通过它启动与关闭开机动画

安卓开机的第一个用户进程是Init进程,与开机动画进程相关的init进程会完成三件事:1、孵化出ueventd,logd,healthd等用户守护进程;2、启动servicemanager,开机动画等重要服务;3、孵化Zygote进程。首先从bp文件开始解析:

一、Android.bp

一般都是使用bp文件来进行预编译,关于开机动画中的Android.bp中的主要操作是:编译出bootanimation模块的可执行文件并将bootanimation对应的bootanim.rc编译到/system/etc/init目录中。

二、bootanim.rc

bootanim.rc文件中代码如下:

service bootanim /system/bin/bootanimation //将该bin文件“挂载”到bootanim服务中,可以通过拉起bootanim服务,以执行该bin文件 class core animation //给服务指定为core和animation,这样方便操作多个服务同时启动或停止 user graphics //在执行此服务之前先切换用户名,当前默认root group graphics audio //切换用户组 disabled //服务不会自动运行,必须显式地通过服务器来启动 oneshot //当此服务退出时不会自动重启 ioprio rt 0 //设置IO优先级为最高 task_profiles MaxPerformance //添加挂载点

添加的挂载点如下: 

用来启动应用程序bootanimation的服务是disable的,即init进程在启动的时候,不会主动将应用程序bootanimation启动起来。

三、surfaceFlinger.rc

启动bootanimation是从surfaceFlinger这边来启动的。还是首先看到rc文件,因为init进程会根据这个rc文件规则,去启动位于目标设备/system/bin/surfaceflinger的可执行文件,该文件的内容如下:

四、main_surfaceflinger.cpp

该rc可执行文件的程序入口是surfaceflinger模块的main_surfaceflinger.cpp文件,其main函数,主要的时序图如下:

这部分主要工作就是新建一个SurfaceFlinger对象,然后调用其中的init函数,最后调用run函数。这个地方涉及了几个文件的方法调用,如下: 

 进入到SurfaceFlinger.cpp里的init()方法,可以看到开启了一个线程,进入这个线程文件/frameworks/native/services/surfaceflinger/StartPropertySetThread.cpp里的内容:

线程体中通过设置系统控制属性ctl.start为bootanim,来启动前面bootanim.rc中定义的bootanim服务:service bootanim /system/bin/bootanimation,以执行bootanimation可执行文件。而设置系统属性service.bootanim.exit为0,则是为了后面终止bootanimation程序做准备,这时就将应用程序bootanimation启动起来了。

(当系统属性发生改变,init进程就会接收到一个系统属性变化通知,这个通知最终是由在init进程中的函数handle_property_set_fd来处理的)

五、bootanimation_main.cpp

启动bootanimation可执行文件后,首先会执行到上面介绍过的bootanimation_main.cpp文件中的main函数: 

 里面的具体内容如下:

其中的bootAnimationDisabled()函数会检测系统属性,以获取是否播放开机动画的属性值并赋值给noBootAnimation,如果noBootAnimation 为false,则直接退出程序,不进行播放开机动画。否则接下来就会启动一个Binder线程池,并且创建一个BootAnimation对象。这个BootAnimation对象就是用来显示第三个开机画面的。由于BootAnimation对象在显示第三个开机画面的过程中,需要与SurfaceFlinger服务通信,因此,应用程序bootanimation就需要启动一个Binder线程池。调用在BootAnimationUtil.cpp文件中其中的 bootAnimationDisabled()方法如下:

waitForSurfaceFlinger()方法主要做的事是将binder客户端的消息传递给service manager再由service manager寻找一个等待与sufaceFlinger通信的服务。

六、BootAnimation.cpp

在bootAnimation_main中有一个关键的类BootAnimation,这个类属于BootAnimation.cpp文件,解析该文件可以看的BootAnimation类的主要调用关系如下:

BootAnimation类继承了Thread类和IBinder::DeathRecipient类,其中 mSession是BootAnimation类的一个成员变量,它的类型为SurfaceComposerClient,是用来和SurfaceFlinger执行Binder进程间通信。

1、开机动画的启动

onFirstRef()—— 属于其父类RefBase,该函数在强引用sp新增引用计数時调用,就是当有sp包装的类初始化的时候调用;



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有