android开机动画多长时间_Android开机动画原理分析

android开机动画多长时间_Android开机动画原理分析Android系统开机动画,是由bootanimation进程将多桢的图片按次序循环播放,在屏幕上形成的动画效果。这里介绍一下bootanimation的原理。1.bootanimation启动bootanimation是一个本地进程,代码由c++编写,它由init进程启动/init.rcservicebootanim/system/bin/bootanimationclasscore…

大家好,又见面了,我是你们的朋友全栈君。

Android系统开机动画, 是由bootanimation进程将多桢的图片按次序循环播放,在屏幕上形成的动画效果。

这里介绍一下bootanimation的原理。

1. bootanimation启动

bootanimation是一个本地进程,代码由c++编写,它由init进程启动

/init.rc

service bootanim /system/bin/bootanimation class core

user graphics

group graphics audio

disabled

oneshot

可以看到bootanimation进程的的uid是graphics, gid是graphics和audio;

并且当init在开机解析init.rc文件时,这个进程是disable的,并不启动;bootanimation进程是oneshot的,也就是只启动一次,死掉后不会再重启。

在SurfaceFlinger.cpp启动时在初始化init()函数里会调用startBootAnim()

void SurfaceFlinger::startBootAnim() {

property_set(“service.bootanim.exit”, “0”);

property_set(“ctl.start”, “bootanim”);

}

这里设置了两个property。

其中init进程检测到ctl.start被设成bootanim后,就会再去init.rc里找bootanim的service,

然后启动/system/bin/bootanimation进程。

2. bootanimation实现

bootanimation代码目录在frameworks/base/cmds/bootanimation/里。功能实现主要在BootAnimation.cpp文件里。需要提醒一点,从bootanimation_main.cpp里可以看到,bootanimation进程其实也加入到了binder线程池当中,只不过对于这个进程来说,并没有用binder和其它进程通信。

Bootanimation继承于Thread(), 所以bootanimation显示的主要部分在threadLoop()函数里。

bool BootAnimation::threadLoop()

{

bool r; if (mZip == NULL) {

r = android();

} else {

r = movie();

}

… … return r;

}

mZip表示桢动画的zip文件对象,优先级依次是”/system/media/bootanimation-encrypted.zip”,

“/system/media/bootanimation-encrypted.zip”,”/system/media/bootanimation.zip”。

如果这三个文件全都不存在,就会调用android()函数,也就是”android”几个字母。

如果其中任何一个zip文件存在,则调用movie()函数,这里面会解压zip包,然后在一个while循环里显示,也就是看到的动画效果。

3. bootanimation退出

无论是”android”还是zip包,显示都是在一个死循环里,当系统启动完成之后,必须要退出bootanimation,

然后显示launcher桌面。

当Android系统启动完成发送boot_complete广播的同时,会调用SurfaceFlinger.cpp的bootFinished()函数:

void SurfaceFlinger::bootFinished()

{

… …

property_set(“service.bootanim.exit”, “1”);

}

在bootanimation进程的android()或者movie()里都会循环调用checkExit()函数检测“service.bootanim.exit”的值;

void BootAnimation::checkExit() { char value[PROPERTY_VALUE_MAX];

property_get(“service.bootanim.exit”, value, “0”); int exitnow =

atoi(value); if (exitnow) {

requestExit();

… …

}

}

当”service.bootanim.exit”的值为1时,调用requestExit()便会通知线程需要结束,也就退出了动画播放。

至此,Android系统开机动画就结束了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146611.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android在代码中四种设置控件背景颜色的方法(包含RGB)「建议收藏」

    android在代码中四种设置控件背景颜色的方法(包含RGB)

    2022年2月7日
  • javascript取整数几种方式

    javascript取整数几种方式Math.round(num)//四舍五入Math.floor(num)//小于等于num的整数Math.ceil()//大于等于num的整数parseInt(num)//小于等于num的整数,与floor的区别是parseInt参数可以是string类型,如’5abc’返回5。

    2022年6月17日
  • Linux下的压缩解压缩命令详解

    Linux下的压缩解压缩命令详解

    2021年8月28日
  • hive优化大全-一篇就够了[通俗易懂]

    hive优化大全-一篇就够了[通俗易懂]1.概述  在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题。下面开始本篇文章的优化介绍。2.介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题?数据量大不是问题,数据倾斜是个问题。jobs数比较多的作业运行效率相对比较低,比如即使有几百行的表,如果多次关联多次汇总,产生十几个jobs,耗时很长。原因是mapreduce作业初始化的时间是…

    2022年4月20日
  • leveldb多线程读写(大数据高并发解决方案)

    在并发写入的时候,leveldb巧妙的利用一个时间窗口做batch写入,这部分代码值得一读:StatusDBImpl::Write(constWriteOptions&options,WriteBatch*my_batch){  //partA  Writerw(&mutex_);  w.batch=my_batch;  w.sync=options.syn…

    2022年4月16日
  • ANSYS ICEM CFD——网格划分基础知识

    ANSYS ICEM CFD——网格划分基础知识1、网格划分技术在使用商用CFD软件的工作中,大约有80%的时间是花费在网格划分上的,可以说网格划分能力的高低是决定工作效率的主要因素之一。结构化网格和非结构化网格的比较FLUENT软件采用非结构网络与适应性网络相结合的方式进行网络划分。与结构化网络和分块结构网络相比,非结构网络划分便于处理复杂外形的网络划分,而适应性网格则便于计算流场参数变化剧烈、梯度很大的流动,同时这种划分方式也便于网络的细化或粗化,使得网络划分更灵活、简便。FLUENT划分网格的途径1、一种是用FLUENT提供的专用网络软件

    2022年5月26日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号