首页 > 其他分享 >BootAnimation简析

BootAnimation简析

时间:2024-06-16 15:54:00浏览次数:22  
标签:动画 调用 这里 简析 开机 方法 BootAnimation

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

相关文章

  • Kprobes(Kernel Probes)简析
    一、kprobes是什么kprobes是一种基于动态插桩的底层机制,它能动态地插入几乎任何kernel路径,不修改分析对象源码地情况下,来收集debug和性能数据。你可以通过kprobes陷入几乎所有kernel函数地址[1],当该kernel函数被调用时,如果已经定义了一个与之绑定handler,那么handler函数也会同时......
  • stm32系统时钟RCC简析
    一概念STM32本身十分复杂,外设非常多  但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费  并且,同一个电路,时钟越快功耗越快,同......
  • pcm5102芯片接口音频格式简析
    1.I2S,leftjustified中文,左对齐(MSB)标准,和stm32的SAI_I2S_MSBJUSTIFIED格式对应:具体含义:在LRCLK发生翻转的同时开始传输数据。该标准较少使用。注意此时LRCLK为1时,传输的是左声道数据,这刚好与I2SPhilips标准相反。左对齐(MSB)标准时序图如下所示:  ......
  • [转帖]国产主流数据库存储类型简析
    https://blog.csdn.net/solihawk/article/details/137807944国产数据库在技术架构上主要分为集中式、基于中间件分布式和原生分布式架构,衍生出集中式架构和分布式架构。那么在这些部署架构中,从数据分布的视角来看,在数据库中数据分布的形态是怎样的。本文将简要分析OceanBas......
  • 岩土工程监测中振弦采集仪的布设方案及实施步骤简析
    岩土工程监测中振弦采集仪的布设方案及实施步骤简析岩土工程监测中,河北稳控科技振弦采集仪是一种常用的地下水位和土层压缩性监测工具。它通过采集振弦的振动信号来确定地下水位和土层的压缩性,为岩土工程的设计、施工和监测提供重要的数据支持。下面将对振弦采集仪的布设方案和实......
  • 简析智慧灯杆一键告警功能的实用场景
    随着城市人口持续增长,城区面积持续扩大,社会公共安全面临的挑战也与日俱增。智慧路灯杆是一种兼具智能化和多功能的新型物联网基础设施,通过搭载一键告警对讲盒,能够大大丰富安防及报警求助资源,实现对事件现场的精确定位、实时音视频采集传输、人员快速调遣等功能,对提升城市的安全性......
  • 2024蓝桥杯省赛C/C++程序设计A组题目简析
    2024蓝桥杯省赛C/C++程序设计A组题目简析A题意:计算一段区间内日期的中文表达的总笔画数>50的天数按照题意枚举即可。注意个位数字前面需要加一个“零”,也就是多13笔。B题意:\(5\times5\)的棋盘下五子棋,最终下满棋盘并和棋的情况数dfs或者遍历二进制去枚举棋子位置的情况均可......
  • 汇编语言和C语言得优势和劣势简析
    汇编语言和C语言各自具有不同的优势和劣势,适用于不同的编程场景和需求。以下是对两者的一些比较:汇编语言的优势:硬件接近性:汇编语言直接对应机器指令,可以精确控制硬件,非常适合底层硬件编程和系统级编程。例如,在编写操作系统内核、设备驱动程序或实时系统时,汇编语言可以确保对......
  • Wireshark过滤基础语法简析
    1.简介Wireshark是一款强大的网络分析工具,它可以捕获和显示网络上的数据包,并提供多种过滤功能,让用户可以快速地找到自己感兴趣的数据包。Wireshark的过滤功能分为两种:捕获过滤和显示过滤。捕获过滤是在数据包进入Wireshark之前就对其进行筛选,只保留符合条件的数据包,从而减少捕......
  • 简析Go SSTI利用
    简析GoSSTI利用目录GoSSTI基础模版渲染ActionPipelinesVariablegin.context的利用方式Hgame2024Week2梅开二度总结Gossti的xss利用简单来说就是可以利Go的模版注入,来绕过Cookie的HTTPOnly安全限制GoSSTI基础参考go官方文档templatepackage-text/templ......