android boot 从内在划分为 uboot, kernel, zygote, framework, app loadind等阶段,从外在划分为 logo1, logo2, bootanimation, homescreen的等界面。mtk平台开机分为第一次开机,正常开机,快速开机几种。
这几天学习了一些bootanimation的细节,记一下。
bootanimation是所谓的logo3阶段,它的图片放在data/local/bootanimation.zip和 system/media/bootanimation.zip里,我是先push到 system/media/目录下的,然后data/local下就有了。应该是有作copy吧(这里可能有误,没确认过)。这里需要学习下linux fs的内容,未研究。代码里是先到data/local/bootanimation.zip里去取,若取不到,则到system/media目录下取,从这里来看data/local象是保存用户设置开机动画的位置。
bootanimation.zip解压后是folder1,folder2,desc.txt 2个目录1个文件。folder1下有30帧图片,folder2下15帧,desc.txt里的内容是
540,960,100
p 1 0 folder1 400
p 0 20 folder2 5
这个文件在bootanimation.cpp的 movie目录里进行解析,结合代码,我知道了这些数字的含义。
540,960,100 //screen_width, screen_height, fps
p 1 0 folder1 400 //p是一个标识表示该行是该animation的一个part, 1表示该part循环次数,0是pause时间,即该part的某此播放和上次播放间隔的时间单位(单位是1/fps),400未做解析
p 0 20 folder2 5 //函数参考上行
说道这里,顺便把movie行数里几个关键变量列一下
pcount : part count ,有多少个part
part.count : part repeart count, part的循环次数
part.pause: pause time between part displaying, part的某此播放和上次播放间隔的时间单位
再列几个时间变量
animation.fps : 帧率,即一秒内刷几帧,当然这个只是希望的数值,实际刷几帧与每帧刷的速度有关
frameduration: 1秒除以fps得到的平均值
nTimeCost : 实际中上一帧到下一帧的时间,包含frame的播放时间加上delay时间
delay: frameduration - nTimeCost ,若 值为正,则在播放下一帧前会usleep(delay)这么长时间,若值为负,则直接开始开始播放下一帧。
知道了movie函数里面怎么解析desc.txt文件,我们就可以自由的配置我们的动画,甚至添加新的变量然后在代码里解析,使得我们能比较自由的控制动画的帧率,播放速度等等。比如我们可以添加更多的目录如folder3,比如分别为part1,part2设置不同的fps等。甚至设定每一帧之间的间隔。
我打印了一些数据,每帧基本上要播放50~120ms,若fps为100,则delay总是为负值。即没有delay,一帧接一帧播放。至于为啥都要几十ms,没有研究过,感觉很慢。
FAQ:
1.替换图片后黑屏
这个问题困扰了我好久,从log上看报错 no new line,即找不到\n,可以识别desc.txt文件。所以我一直以为是ubuntu下换行符格式的问题,使用各类工具,以及到windows下查看都是 OK的。后来网络上一篇刷机开机攻略给了我启发,我尝试了使用“存储”的无损压缩方式,这样可以了。若是压缩了,而代码里
size_t numEntries = zip.getNumEntries();
ZipEntryRO desc = zip.findEntryByName("desc.txt");
FileMap* descMap = zip.createEntryFileMap(desc);
这里没仔细研究过,createEntryFileMap可能是非解压方式读,所以识别不了'\n'.
总之,需要记住修改desc.txt后要无损存储。