android bootanimation 学习总结

来源:互联网 发布:卡通农场最新数据 编辑:程序博客网 时间:2024/06/05 23:02

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

fcount: frame count of a 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后要无损存储。


原创粉丝点击