BootAnimation简析
BootAnimation是开机动画,其对应源码在frameworks\base\cmds\bootanimation(这里使用android12的代码查看,不同版本代码有差异,但大体逻辑一般都差别不大),其编译产物是个二进制可执行文件bootanimation,在开机过程中会执行播放开机动画,其目录中有个FORMAT.md文件有配置开机动画的简单介绍,BootAnimation代码中主要是解析开机动画资源包进行播放,然后在系统准备好后结束开机动画
BootAnimation入口是其main方法,在bootanimation_main.cpp中
这里可以看到其main方法中主要是创建了个BootAnimation的对象,并调用其run方法
首先查看下BootAnimation.h文件,可知BootAnimation继承了Thread和DeathRecipient(DeathRecipient继承了RefBase)
因为其继承的Thread和DeathRecipient
其重写了几个关键方法,其在创建其对象并调用run方法后会分别回调到
onFirstRef:继承自RefBase,其在创建对象和指针的时候会调用
readyToRun:继承自Thread,其在线程执行后会先调用
threadLoop:继承自Thread,其在线程执行时会调用
binderDied:继承自DeathRecipient,一般当binder异常结束时会调用
根据其main方法中代码,BootAnimation的onFirstRef、readyToRun、threadLoop方法会相继执行,这里简要分析这三个方法中的逻辑
onFirstRef
这里mSession是SurfaceComposerClient的对象,linkToComposerDeath是监听显示对端surfaceflinger异常退出,这里不细看
preloadAnimation主要是加载动画资源,做开机动画的准备动作
findBootAnimationFile
这里可以看到有好几个分支,而其代码都是相似的,分别对应不同场景生成一个字串列表,放入对应的字串,然后调用findBootAnimationFileInternal方法,如下可看到,这里的字串都是一些开机动画的资源压缩文件
这里根据一些配置项来进行区分判断,然后查看下findBootAnimationFileInternal方法:
在findBootAnimationFileInternal方法中会对传入的字串列表进行遍历,如果字串对应的文件存在且可访问,则会将其赋值给mZipFileName然后返回
所以从上述分析看findBootAnimationFile就是根据配置和预置的一些路径来查找动画资源,然后赋值给mZipFileName
loadAnimation
查看loadAnimation方法,这里创建了一个Animation对象,然后将之前找到的资源文件等信息添加到对象中,然后主要调用了parseAnimationDesc方法和preloadZip方法来解析资源包中的文件
parseAnimationDesc是解析资源包中的desc.txt文件,该文件中配置了播放动画的资源、大小等信息,可结合源码中FORMAT.md介绍和代码一起看,这里不细讲
preloadZip是结合解析的desc.txt的信息解析资源包中的其他文件信息
readyToRun
readyToRun的代码较多,这里主要是准备显示相关,因为bootanimation是c++编写的,所以没有一般意义上的Activity、窗口、控件等东西,而是直接通过显示相关接口调用到surfaceflinger创建对应图层,然后使用opengl接口进行绘制,这里也会做一些绘制相关的准备工作
threadLoop
可以看到threadLoop方法分两部分,一部分是具体的绘制等相关逻辑,其根据前面是否有找到资源包分别调用android和movie方法,然后则是结束绘制的相关逻辑
android和movie主要差异在于绘制的内容,其他逻辑相似,android因其资源问题肯定要简单一些,这里只看下android方法的逻辑
从上面代码可以看到,这里主要加载了两个图片文件,然后调用opengl接口进行绘制,这里不具体分析绘制逻辑
上面代码中具体绘制部分是在一个do-while循环中,这里查看下退出循环的相关逻辑,其主要在于checkExit和exitPending方法
checkExit
如上,checkExit方法会获取service.bootanim.exit配置项的值,如果为非0,则表示可以退出开机动画了,这里会调用requestExit方法,该方法是继承Thread的
如上。在调用requestExit方法后,exitPending方法即返回true,从而会结束开机动画
小结
上面主要介绍了BootAnimation的大致结构和流程,并未细致的每一行代码分析,不过了解上面内容后,要具体分析其相关内容时会容易很多,不至于无从下手
标签:动画,调用,这里,简析,开机,方法,BootAnimation From: https://www.cnblogs.com/luoliang13/p/18250705