android
开机画面是由应用程序bootanimation来负责显示的,主要类BootAnimation.cpp直接继承于android中定义的一个Thread,
接地继承了RefBase类,并且重写了RefBase类的成员函数onFirstRef,因此,当一个BootAnimation对象第一次被引用的时,这个BootAnimation对象的成员函数onFirstRef就会被调用。
当应用程序启动时,是先从main开始,具体代码如下:
sp<BootAnimation> boot = new BootAnimation();
//add video boot
memset(value,0,sizeof(value));
property_get("service.bootvideo", value, "0");
gUseBootVideo = (atoi(value) == 1 ? true : false);
if(gUseBootVideo){
// boot->setBootVolume();
/* modify,bootanimation path */
/*before modify code(property_set("service.bootvideo", "2");)*/
if (access(USER_BOOTVIDEO_FILE, R_OK) == 0) {
property_set("service.bootvideo", "2");
}else{
gUseBootVideo = false;
}
/*modify end */
}
如果access(USER_BOOTVIDEO_FILE, R_OK) == 0),即bootvideo文件存在则会执行property_set("service.bootvideo", "2"),则启动系统内的视频播放应用程序LibPlayer播放开机视频,同时gUseBootVideo =true代表bootanimation播放的是开机视频。否则播放开机动画。
所以当开机视频文件bootvideo存在时,应用程序bootanimation会做2件事情:
一:执行到sp<BootAnimation> boot = new BootAnimation();时会调用BootAnimation对象的成员函数onFirstRe,在onFirstRe里会执行线程的run方法,然后会调用动画的android或movie方法来显示动画(既然是为了播放开机视频,开机动画就没必要播放,后续在播放动画的方法中必须跳过GLES的绘图逻辑以免出现动画和视频同时出现的BUG)。
二:执行 到property_set("service.bootvideo", "2");时,则启动系统内的视频播放应用程序LibPlayer播放开机视频。
之前说到BootAnimation对象的成员函数onFirstRe执行后会经过一系列的调用最终执行到播放开机动画,具体流程如下:
1.在onFirstRe中调用 run("BootAnimation", PRIORITY_DISPLAY);创建线程

本文深入分析了基于Android 4.4系统的开机动画和开机视频的流程。通过 BootAnimation 类的 threadLoop 方法,详细解释了在启动过程中android() 和 movie() 两个关键部分的功能,揭示了开机动画的实现细节。

5051

被折叠的 条评论
为什么被折叠?



