Bootloader :
目前的LK(little kernel)中,没有统一的logo画面接口,一般在平台lcd_init后,会往framebuffer copy一幅图画内容,作为logo的初始化,已我使用的平台tcc8900, android2.1 为例:
./platform/tcc_shared/include/lcd/logo.h #以一个char型数组的形式,存放了待显示界面内容的RGB565内容。
跟换这个文件,就可以获取更换画面显示内容的效果。因此,我们要做的是:
一张选定的适合平台分辨率的图片 ---> RGB565数组
网上有很多类似的转换工具,多为bmp图片转换到rgb565数据,可以胜任上面的工作。
Kernel:
linux kernel 中对于logo的支持较为完整。首先,通过配置kernel来开启对logo显示的支持:
make menuconfig
Device Drivers --->
Graphics support --->
Bootup logo --->
standrad black and white Linux logo --->
standrad 16-color Linux logo --->
standrad 224-color Linux logo --->
可以选择 black and white or 16-color or 224-color 中的任意一种。下面就以 224-color 为选定配置,把一幅logo.bmp文件制作成启动logo(debian base pc):
- apt-get install netpbm
- bmptoppm logo.bmp > tmp1.ppm
- ppmquant 224 tmp1.ppm > tmp2.ppm
- pnmnoraw tmp2.ppm > logo.ppm
- rm mylinux/driver/video/logo/logo_linux_clut224.*
- cp logo.ppm mylinux/drivers/video/logo/logo_linux_clut224.ppm
- make
编译生成的linux kernel 在启动过程中,就会显示logo.bmp中的内容。
Android:
当linux kernel启动完成后,在android启动init.rc中的服务时,会运行/system/bin/bootanimation来读取动画图片。和bootanimation相关的源代码有
frameworks/base/cmds/bootanimation/bootanimation_main.cpp
frameworks/base/cmds/bootanimation/BootAnimation.cpp
通过阅读BootAnimation.cpp中BootAnimation的实现,我们可以得到这些信息:
- 程序会优先查找/data/local/bootanimation.zip动画包, 没找到则查找动画包/system/media/bootanimation.zip。
- 如果始终没有找到动画包,则播放默认动画 android-logo-mask.png 和 android-logo-shine.png
- 如果找到动画包,则解开动画包,并查找文件 desc.txt, 该文件描述了如何播放动画包。
所以,如果我们想更换开机动画, 需要制作一个bootanimation.zip动画包,并复制到/data/local 或者 /system/media/ 目录下, 一个最简单的bootanimation.zip至少包括3部分。
- desc.txt #播放动画的描述文件
- part0/ #背景图片集合
- part1/ #前景图片集合
desc.txt 文件内容解析, 一个简单的desc.txt文件实例如下:
320 480 30
p 1 0 part0
p 0 0 part1
其中:
- 320 480 分别为屏幕的 宽度 和 长度, 合起来也就是屏幕的分辨率
- 30 为显示帧数, 即每秒显示多少幅画面
- p 为标记字符, 不可更改,代码通过此标记识别该行的参数
- 1 循环次数, 1表示循环1次, 0表示无限循环
- 0 两次循环之间间隔的帧数, 0表示2次循环之间间隔0帧
- part0 目录名,目录中应含有所配置分辨率大小的png图片
当完成动画包之后, 通过下面命令打包:
zip -0 -r ../bootanimation.zip ./desc.txt ./part0 ./part1
资源:
图片格式转换工具:http://download.csdn.net/source/3241802
BMP -> RGB565:http://download.csdn.net/source/3241800