BootAnimation简析

news/2024/10/4 5:35:34

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的大致结构和流程,并未细致的每一行代码分析,不过了解上面内容后,要具体分析其相关内容时会容易很多,不至于无从下手

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/44361.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Unreal RecastNavigation 开源项目详解

Recastnavigation是一个游戏AI导航库,像Unity,UE引擎中都集成了这个开源项目, HALO中使用的也是这个开源库。导航最重要的就是为NPC寻路,以及其他的寻路需求。0 前言 Recastnavigation是一个游戏AI导航库,像Unity,UE引擎中都集成了这个开源项目, HALO中使用的也是这个开…

编写单个函数的ROP链

什么是ROP链 在我初识栈溢出那篇博客已经详细的讲了函数的调用过程(基于X86框架),不了解的可以看一下,没有这个理论基础,是学不好ROP的。现在我们说一下什么是ROP。 ROP链就是通过返回地址的修改来完成的编程,调用特定的函数的一种编程模式。我们可以联想一下你做的最简单…

计组要我命第五天中

要命计组(6) 开始时间 2024-06-1612:38:07 结束时间 2024-06-16 15:01:11 前言:吃完饭,睡会觉,继续计组[fine]. 总结:中场休息!

聊聊育种大模型

从去年年末开始到现在,大语言模型(Large Language Models,LLM)热度依旧不减。 有实力烧钱的机构在训练自己的LLM,没实力想凑热闹的更聚焦在垂直领域的应用上,绝大多数企业属于后者。 每个行业多多少都有人在做基础模型的微调和打造私有知识库,以期不被时代抛弃。 医疗、…

MyBatis 的缓存机制

1. MyBatis 的缓存机制 @目录1. MyBatis 的缓存机制2. 准备工作3. MyBatis 的一级缓存3.1 一级缓存失效情况/条件4. MyBatis 的二级缓存5. MyBatis 集成 EhCache 第三方缓存6. 总结:7. 最后:缓存(Cache) 缓存的作用:通过减少 IO 的方式,来提高程序的执行效率 。 MyBatis …

KAN:使用 Microsoft 的 KubeAI Application Nucleus简化边缘 AI

我们需要的是在 Kubernetes 上构建和管理边缘机器学习应用程序的一致方法,一种可以加快开发和交付速度的方法。这就是 KAN 的作用,即 KubeAI Application Nexus。正如介绍性博客文章所指出的那样,这个名字来自一个普通话动词,翻译为“观看”或“看”。KAN 是一个开源项目,…

word中批量修改mathtype公式格式

1、打开一个公式,设置好格式、字体大小等 2、预置/公式预置/保持到文佳,假设保存文件命名为measurement.eqp 3、打开word,mathtype/格式化公式,选择保存的measurement.eqp文件,确定即可

lnmp

一、编译安装Nginx 1.前期准备#安装依赖 yum -y install pcre-devel zlib-devel gcc gcc-c++ make#创建用户 useradd -M -s /sbin/nologin nginx#获取源码包 wget https://nginx.org/download/nginx-1.24.0.tar.gzcd /opt tar xf nginx-1.24.0.tar.gz #解压2.开始编译安装cd …