Bootanimation
Bootanimation是个服务,在init.rc中,通过init进程启动。 构造函数被调用。
由于继承 /system/core/libutils/Threads.cpp,在创建时会调用
readyToRun() ,即创建线程执行,找到bootanimation.zip,然后找到解析desc_zh_ui.txt/desc_zh_tv.txt/desc.txt
threadLoop() 中for循环播放动画,每次都会调用checkExit 函数中,判断property(service.bootanim.exit)值是否为1,如果1就跳出循环。开机动画完成。
for (int r=0 ; !part.count|| r<part.count; r++) count 为0 无限循环。
如果是已经设置了无限循环,而没有无限循环。有可能是desc.txt写的有问题。
desc.txt最后一行要加换行。
--------------------
surfaceflinger
surfaceflinger是个bin文件,在init.rc中启动,SurfaceFlinger 启动 设置property(service.bootanim.exit) 值为0。而此时开机动画已经启动,标准android会等待这个值。
在bootfinish函数中设置property(service.bootanim.exit) 值为1。
----------------------
进程启动
init.rc{
import /init.environ.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
{
import /init.mtk_common.rc
import /init.mtk_rm.rc
import /init.pre_dtv_driver.rc
import /init.dtv_driver.rc
import /init.device.rc
import /init.build_type.rc
import /init.build_cfg.rc
import /init.hybrid_cfg.rc -> 启动 dtv_bootanimation
import /init.android_two_worlds.rc
import /init.${ro.coredump}.rc
import /init.${ro.coredump}_folder.rc
import /init.sdcard.rc
}
import /init.trace.rc
surfaceflinger启动
}
----------------------
desc.txt 解析
desc.txt是动画的配置文件,保存格式为ANSI,用于设置这个动画的分辨率,帧数,播放次数,文件夹名称等;
其格式一般如下(参数用空格隔开):
480 800 10
p 1 0 part0
p 0 0 part1
480 800是指显示的分辨率 宽 高
10是帧数,就是每秒播放的图片数
p为标志符,不可修改,不必理会
p后面的数字是指播放次数, 0为循环播放, 1为播放一次
p 1 0 part0 第二个零代表动画间隔时间为0
part0 part1 为文件夹名,名称可以自定义,只有一个文件夹也可。
大致意思就是,系统开机时就会把名为part0的文件夹内的图片按照每秒10张的速度播放一遍,然后把part1文件夹内的图片也按照每秒10张的速度循环播放,直致开机完成。
为什么要用两个文件夹呢? 一般 :part0是播放一遍的,part1是循环播放直到开机。
其格式一般如下(参数用空格隔开):
480 800 10
p 1 0 part0
p 0 0 part1
480 800是指显示的分辨率 宽 高
10是帧数,就是每秒播放的图片数
p为标志符,不可修改,不必理会
p后面的数字是指播放次数, 0为循环播放, 1为播放一次
p 1 0 part0 第二个零代表动画间隔时间为0
part0 part1 为文件夹名,名称可以自定义,只有一个文件夹也可。
大致意思就是,系统开机时就会把名为part0的文件夹内的图片按照每秒10张的速度播放一遍,然后把part1文件夹内的图片也按照每秒10张的速度循环播放,直致开机完成。
为什么要用两个文件夹呢? 一般 :part0是播放一遍的,part1是循环播放直到开机。
文件夹里的图片必须是PNG格式,图片名称按顺序排放。
--------------------