开机动画(闪动的ANDROID字样的动画图片)
/Android 2.2版本:
surfaceflinger
SystemServer启动分为init1()和init2()两个阶段,在init1阶段获取属性字段system_init.startsurfaceflinger,如果字段值为1,那么就在这里启动surfaceflinger:
//@frameworks\base\cmds\system_server\library\system_init.cpp
char propBuf[PROPERTY_VALUE_MAX]; property_get("system_init.startsurfaceflinger", propBuf, "1"); if (strcmp(propBuf, "1") == 0) { |
surfaceflinger构造函数调用readyToRun函数,至于为什么会调用readyToRun函数(并没有显式的调用语句),主要是因为surfaceflinger是一个线程类,必须实现并会调用如下两个函数:一是readyToRun(),该函数定义了线程循环前需要初始化的内容;二是threadLoop(),每个线程都必须实现,该函数定义了线程执行的内容,如果该函数返回true,线程会继续调用threadLoop(),如果返回false,线程将退出。
surfaceflinger:readyToRun函数用于初始化整个显示系统。实现过程如下:
(1)执行new DisplayHardware(this,dpy),通过DisplayHardware初始化Framebuffer、EGL并获取OpenGL ES信息。
(2)创建共享的内存控制块。
(3)将EGL与当前屏幕绑定。
(4)初始化共享内存控制块。
(5)初始化OpenGL ES。
(6)显示开机动画。
其中显示开机动画是启动init..rc中的bootanim服务,语句如下:
//@Framework\base\libs\surfaceflinger\surfaceflinger.cpp
property_set("ctl.start", “bootanim”); |
停止开机动画业在surfaceflinger:bootFinished()中:
//@Framework\base\libs\surfaceflinger\surfaceflinger.cpp
property_set("ctl.stop", “bootanim”); |
bootanim
相关文件:
system/core/init/init.c
system/core/rootdir/init.rc
frameworks/base/cmds/bootanimation/BootAnimation.h
frameworks/base/cmds/bootanimation/BootAnimation.cpp
frameworks/base/cmds/bootanimation/bootanimation_main.cpp
frameworks/base/core/res/assets/images/android-logo-mask.png frameworks/base/core/res/assets/images/android-logo-shine.png
init.rc中定义服务:“service bootanim /system/bin/bootanimation”。
bootanim服务由readyToRun()(property_set("ctl.start", "bootanim");)执行开机动画;bootFinished()(property_set("ctl.stop", "bootanim");)执行停止开机动画。
(1)adb shell后,可以直接运行“bootanimation”来重新看开机动画,它会一直处于动画状态,而不会停止。
(2)adb shell后,命令“setprop ctl.start bootanim”执行开机动画;命令“getprop ctl.stop bootanim”停止开机动画。这两句命令分别对应SurfaceFlinger.cpp的两句语句:property_set("ctl.start", "bootanim");和property_set("ctl.stop", "bootanim");