大家好,又见面了,我是你们的朋友全栈君。
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.cn/146611.html原文链接:https://javaforall.cn