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系统开机动画就结束了。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • springboot模型中Long转String 注解实现

    springboot模型中Long转String 注解实现springboot模型中Long转String注解实现@JsonSerialize(using=ToStringSerializer.class)@JsonSerialize(using=ToStringSerializer.class)

  • MAC电脑用adb命令安装APK

    MAC电脑用adb命令安装APK目录开始过程结果开始分别在命令行里面输入以下命令:touch.bash_profileopen-e.bash_profilesource.bash_profileadbversion过程这个时候会弹出一个这种框需要你配置路径比如我的路径是这个命令:exportPATH=${PATH}:–…

  • 单片机入门级视频教程「建议收藏」

    单片机入门级视频教程「建议收藏」对于入门级网友,向大家推荐郭天祥的《十天学会单片机c语言》,简单明了。想亲自做试验,不妨花点钱买他的实验板教程从电驴资源网就能下载

  • 子网划分和计算方法(附习题详解)

    子网划分和计算方法(附习题详解)一.子网划分作用1.计算网络号,通过网络号选择正确的网络设备连接终端设备1)清楚IP地址四点段点分十进制数和子网掩码,对应的网络号是什么2)交换机是用来连接相同网络的设备,路由器是用来连接不同网段的设备网络号一样的,即在相同网段,网络号不一样的,即不同网段3)计算方法把十进制数的IP地址换算成二进制数,把子网掩码也由十进制数换算成二进制数,两对二进制数对齐做“与”运算,即可得出网络号。2.根据网络的规模,可以对局域网(内网)进行网络地址规划二.IP地址格…

  • vs2010下载官方下载_怎样下载vs2010

    vs2010下载官方下载_怎样下载vs2010http://www.microsoft.com/downloads/en/results.aspx?freetext=Visual+Studio+2010&displaylang=en&am

  • debounce实现 js_javascript防抖函数debounce详解「建议收藏」

    debounce实现 js_javascript防抖函数debounce详解「建议收藏」定义及解读防抖函数debounce指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。假如我们设置了一个等待时间3秒的函数,在这3秒内如果遇到函数调用请求就重新计时3秒,直至新的3秒内没有函数调用请求,此时执行函数,不然就以此类推重新计时。举一个小例子:假定在做公交车时,司机需等待最后一个人进入后再关门,每次新进一个人,司机就会把计时器清零并重新开始计时,重新等…

发表回复

您的电子邮箱地址不会被公开。

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