平台信息:

内核:linux2.6/linux3.0

系统:android/android

平台:S5PV310(samsungexynos4210/4412)

作者:xubin341719(欢迎转载,请注明作者)

android开logo,这一块在工作改动的也是比较多的,也比较简单,不同的公司,不同型号的产品,开机的标识不一样。

我们平时目测的开机logo一般是两种:静态的和动画的。其实在实现logo的过程中,有四幅图片:(1)、uboot显示;(2)、kernel显示logo_linux_clut244.ppm;(3)、android第一幅intilogo.rle;(4)、android第二幅,bootanimation。前三幅一般我们做成相同的,(4)为动画显示。启动过程如下所示。

这篇重点说一下要用到的文件怎么生成,程序方面的就不再去深入,这一块的代码量也不小,一般不需要额什么改动。UBOOT的logo会影响开机的速度,我们也没有做这一块,UBOOT启动还是比较快,几秒钟的黑屏大家还是可以接受。下面从内核logo说起。

一、内核logo

** 1、内核目录中 make menuconfig ** Device Drivers ---->Graphics support ---->Bootup logo ----> Standard 224-color Linux logo

把开机LOGO图片保存为bmp或者png格式:如linux.png;linux.bmp通过linux工具把图片转化为:ppm格式。替换:driver/video/logo/logo_linux_clut244.ppm

下面命令需要安装netpbm的工具包 如果没有:sudo apt-get install netpbm

我做的实验,包括脚本可以在这里下载:android logo 脚本

(1)、png格式图片,执行下面命令

1
2
3

#pngtopnm linuxlogo.png> linuxlogo.pnm  //生成ppm
#pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm//转换成224颜色
#pnmtoplainpnm linuxlogo224.pnm > logo_linux_clut224.ppm //转换成ascii格式

可以把上面命令写成一个脚本,这样使用更方便:

kernelLogo_png.sh

1
2
3
4
5
6

pngtopnm $1 > linuxlogo.pnm        //$1为参数,这样不用每次改图片名称,后几步为执行过程
pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm
pnmtoplainpnm linuxlogo224.pnm > logo_linux_clut224.ppm
#删除过程中生成不需要的文件
rm -rf ./linuxlogo.pnm  ./linuxlogo224.pnm
rm -rf ./linuxlogo.pnm  ./linuxlogo224.pnm

如下图:①cat ./kenrelLogo_png.sh 查看脚本内容,如下面所解释

②./kenrelLogo_png.sh 执行脚本

③Ls查看到生成的logo_linux_clut224.ppm

(1)、bmp格式的图片

脚本为kenrelLogo_bmp.sh

1
2
3
4
5

convert $1 linuxlogo.png  //把bmp图片转换成png格式,下面过程和png格式图片相同
pngtopnm linuxlogo.png > linuxlogo.pnm
pnmquant 224 linuxlogo.pnm > linuxlogo224.pnm
pnmtoplainpnm linuxlogo224.pnm > logo_linux_clut224.ppm
rm -rf ./linuxlogo.pnm  ./linuxlogo224.pnm ./linuxlogo.png

把logo_linux_clut224.ppm拷贝到制作好的LOGO文件到 /drivers/video/logo 文件夹替换 logo_linux_clut224.ppm 文件,删除该文件夹下的logo_linux_clut224.o,编译烧录,就可以看到你所更改的图片。

二、android logo

1、android第一张logo

(1)找一张.png格式的图片,使用linux下的ImageMagick自带的convert命令,进行raw格式转换,命令为:

1

convert -depth 8 android_logo.pngrgb:android_logo.raw

(2)、需要用到android编译后的rgb2565工具,在android/out/host/linux-x86/bin目录下(android为当前源码所在目录),转换命令如下:

1

rgb2565 -rle < android_logo.raw >initlogo.rle

  注:ubuntu10.04 默认已经安装ImgageMagick工具,如果当前系统没有安装,可以执行下面的命令安装:

  sudo apt-getinstall imagemagick

为了方便,我们把rgb2565这个bin文件,拷贝到我们做动画的文件夹中。同上面也写一个脚本出来:

android_rle.sh

1
2

convert -depth 8 $1 rgb:logo.raw//转换成raw文件
rgb2565 -rle <logo.raw> initlogo.rle//生成我们要的rle文件,注意:rbg2565在android/out/host/linux-x86/bin目录拷过来。

启动需要显示的图像已经做好了,就是initlogo.rle,注意文件名必须是这个,如果想改文件名,需要修改android/system/core/init/init.h中的宏:

1

#define INIT_IMAGE_FILE "/initlogo.rle"

放到相的目录下就行了.

1、**android第二张图片(动画)

**(1)、开机动画文件为:/system/media/bootanimation.zip是一个标准的zip文件,不过设置压缩率时选择存储。

(2)、linux下用命令打包:

zip -r -X -Zstore ../bootanimation part*/*.png desc.txt

(3)、压缩包的结构:

①Part 这个文件夹中为我们所显示的png图片

②desc.txt中的内容我们要分析下,图片美工去做,我们要让正常显示就要在这里面写一些值。看下里面的内容

1
2
3
4
5
6
7
8
9

400 800 18
p 1 0 part0#400 800 为图片的分辨率 400*800
#18为每秒显示图片的张数,也就是18fps/S
#p代表定义一个部分。
#p后面的第一个数是重复播放这一部分次数。如果这个数为0,就无限循环播放
#p后面第二个数是播放下一个部分前的延迟帧数
#字符串定义了加载文件的路径

补充:initlogo.rle相关信息:

Androidinitlogo.rle

关键词:androidinitlogo.rle 开机画面

平台信息:

内核:linux2.6/linux3.0

系统:android/android4.0.3

平台:samsung exynos 4210、exynos 4412 、exynos 5250

作者:xubin341719(欢迎转载,请注明作者)

相应代码下载链接:initlogo 32bpp更改代码

平台比较极品,initlogo.rle这个图片都显示不正常,要改一些代码,你说急这点事,他们做BSP的时候为什么不完善??牢骚归牢骚,事情还是要做的。

我们的现象是:在加载initlogo.rle时,显示两个小图片(本来设计的是一个),下面我们从代码分析是怎么实现的。

一、initlogo.rle在console_init_action这个函数中实现

路径android/system/core/init/init.c

 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

static int console_init_action(int nargs, char **args)
{………………if( load_565rle_image(INIT_IMAGE_FILE) ) {//1、显示第二张logo;fd = open("/dev/tty0", O_WRONLY);if (fd >= 0) {//2、如果不行,显示“android”字样;const char *msg;msg = "n""n""n""n""n""n""n"  // console is 40 cols x 30 lines"n""n""n""n""n""n""n""             A N D R O I D ";write(fd, msg, strlen(msg));close(fd);}}return 0;
}

1、显示第二张logo;

load_565rle_image(INIT_IMAGE_FILE):

(1)、INIT_IMAGE_FILE

在android/system/core/init/init.h中定义,就是指定我们生成图片的路径;

1
2

#define INIT_IMAGE_FILE "/initlogo.rle"
int load_565rle_image( char *file_name );

(2)、load_565rle_image这个函数的实现,这个里面牵扯到一个数据格式的问题,16bpp,32bpp……如果不对照,显示的是花屏。

2、如果不行,显示“android”字样;

如果load_565rle_image失败,则只显示android字样;

二、下面我们重点分析load_565rle_image这个函数

android/system/core/init/logo.c

 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

int load_565rle_image(char *fn)
{struct FB fb;struct stat s;unsigned short *data, *ptr;unsigned count, max;int fd;if (vt_set_mode(1))
//1、这部分对fb的操作,这里就不详细说了;return -1;fd = open(fn, O_RDONLY);if (fd < 0) {ERROR("cannot open '%s'n", fn);goto fail_restore_text;}if (fstat(fd, &s) < 0) {goto fail_close_file;}data = mmap(0, s.st_size, PROT_READ, MAP_SHARED, fd, 0);if (data == MAP_FAILED)goto fail_close_file;if (fb_open(&fb))goto fail_unmap_data;max = fb_width(&fb) * fb_height(&fb);//2、得到屏幕最大的缓存空间;ptr = data;count = s.st_size;if (fb_bpp(&fb) == 16) {//3、16bppuint16_t *bits = (uint16_t*) fb.bits;while (count > 3) {unsigned n = ptr[0];if (n > max)break;android_memset16(bits, ptr[1], n << 1);bits += n;max -= n;ptr += 2;count -= 4;}} else if (fb_bpp(&fb) == 32) {//4、32bppuint32_t *bits = fb.bits;//32bpp这部分代码加入的while (count > 3) {unsigned n = ptr[0];if (n > max)break;uint32_t data32 = (0xff << 24) | (((ptr[1]>>11)&0x1f)<<19) | (((ptr[1]>>5)&0x3f)<<10) | (( ptr[1]&0x1f)<<3);android_memset32(bits, data32, n << 2);bits += n;max -= n;ptr += 2;count -= 4;}}munmap(data, s.st_size);
//5、显示完成,释放内存;fb_update(&fb);fb_close(&fb);close(fd);unlink(fn);return 0;
fail_unmap_data:munmap(data, s.st_size);
fail_close_file:close(fd);
fail_restore_text:vt_set_mode(0);return -1;
}

1、这部分对fb的操作,这里就不详细说了;

2、得到屏幕最大的缓存空间;

1

   max = fb_width(&fb) * fb_height(&fb);

获取屏幕的参数;

3、16bpp;

 123456789
10
11
12

    if (fb_bpp(&fb) == 16) {uint16_t *bits = (uint16_t*) fb.bits;while (count > 3) {unsigned n = ptr[0];if (n > max)break;android_memset16(bits, ptr[1], n << 1);bits += n;max -= n;ptr += 2;count -= 4;}

4、32bpp;

 123456789
10
11
12
13

if (fb_bpp(&fb) == 32) {uint32_t *bits = fb.bits;while (count > 3) {unsigned n = ptr[0];if (n > max)break;uint32_t data32 = (0xff << 24) | (((ptr[1]>>11)&0x1f)<<19) | (((ptr[1]>>5)&0x3f)<<10) | (( ptr[1]&0x1f)<<3);android_memset32(bits, data32, n << 2);bits += n;max -= n;ptr += 2;count -= 4;}

5、显示完成,释放内存;

声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息

原文作者: haojunming

原文地址: http://my.eoe.cn/111464/archive/19182.html

转载于:https://www.cnblogs.com/jasonleeee/p/3698811.html

[转]android logo:内核、android开机动画相关推荐

  1. android logo界面,Android开机界面logo

    Android 开机会出现3个画面: a. Bootloader启动,出现小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片): b. Android平台启动初始化,出现&q ...

  2. Android 9.0 延时开机动画解决首次开机黑屏和去掉android正在启动的提示框

    1.概述 在9.0的系统产品rom定制化开发中,在一些产品中会出现在首次开机的时候,由于在开机动画播放完以后会出现几秒短暂的黑屏情况,然后进入默认Launcher,这在产品体验上 也是感觉到有点差,所 ...

  3. android rk3288 卡在android界面 卡在开机动画

    大概率是系统数据出了问题,建议清楚数据,实在不行再恢复出厂设置. 执行 adb reboot recovery 会出现这样的界面 单机屏幕会向下,长按会选择. 选择wipe cache partiti ...

  4. android 开机动画尺寸,Android开机Logo动画制作

    开机Logo制作 1.准备Logo图片 准备一张符合尺寸要求(例如:1280x720)的图片,最好是png或jgp. 2.用Hitool工具制作镜像文件 海思芯片使用的是Hitool工具,打开Hito ...

  5. 基于Q的Android开机动画

    背景 项目中需要处理Android的原生开机动画,一定条件下还需要做到静默重启(android系统启动进入到桌面前,屏幕保持完全没有亮度的状态).因为项目是基于Android Q做的,顺势探索了一波开 ...

  6. Android开机动画流程

    Android系统在启动过程中,最多可以出现三个画面.第一个开机画面是在内核启动的过程中出现,是一个静态的画面:第二个画面是在init进程启动的过程中出现的,也是一个静态的画面:第三个画面是在系统服务 ...

  7. 手机android怎么开机画面,安卓开机动画特效软件下载

    欢迎来到Android上最好的开机动画经理.这个程序包含了比任何其他的应用程序更多的功能和开机动画!请检查ROM的工具箱Pro来得到这个程序加得多. 此应用程序需要的busybox和root访问权限. ...

  8. ATV 开发 一、ATV 开机动画定制 android 开机动画

    定制ATV开机动画 谷歌ATV的开机动画必须符合如下要求: 必须遵循以下顺序: 第一屏logo画面修改:允许客户修改 ATV 允许添加自己的开机动画. Android TV 谷歌原生开机动画,此动画不 ...

  9. Android 开机动画启动、播放、退出流程(android 10)

    Android 开机动画启动流程 (android 10) 1 开机动画启动流程 我们先来看一下开机动画是如何启动,并开始播放的. 通过系统启动流程分析可以得知,在系统内核启动后,会启动第一个init ...

  10. Android 开机动画流程介绍

    前言 简单介绍了安卓开机动画流程 流程 [开机动画启动流程]: // Bootanim.rc (frameworks\base\cmds\bootanimation)service bootanim ...

最新文章

  1. 米勒罗宾素性测试(Miller–Rabin primality test)
  2. aop的四种增强以及JDK动态代理、Cglib动态代理
  3. .NET Core IdentityServer4实战-开篇介绍与规划
  4. 《系统集成项目管理工程师》必背100个知识点-47质量保证人员(QA)的主要工作...
  5. Winform中实现Excel导入、表格展示、多选获取值、生成二维码、打印流程(附代码下载)
  6. matlab中if语句多个_科学计算 | MATLAB程序设计基础
  7. Azkaban编译和安装模式
  8. android r.java 原理,深入理解Android消息处理系统原理
  9. Longest Palindrome CodeForces - 1304B(思维)
  10. db2 springboot 整合_[SpringBoot]快速配置多数据源(整合MyBatis)
  11. 蓝色三角_叶子长得像韭菜,花朵开得像个糖三角的鸢尾,用这3个方法拍摄它...
  12. [转载] python中的type和object详解
  13. SSD——样本正负比控制+多尺度检测 (目标检测)(one-stage)(深度学习)(ECCV 2016)
  14. MSP430G2333下位机乘法运算需要注意的一个问题
  15. 从0到1实现VueUI库思路
  16. 服务器迁入虚拟主机的好处,服务器迁入虚拟主机的好处
  17. 博途运行软件仿真步骤
  18. 开源中国正式挂牌,新三板首家软件众包平台
  19. java九宫格案例讲解_Java实现九宫格的教程详解
  20. c语言第二版第三章答案,C语言程序设计(第2版) 刘克威,张凌晓著 习题答案-第三章...

热门文章

  1. 微信小程序进度条详解 progress 自定圆形进度条
  2. MySql 你知道事务隔离是怎么回事吗?
  3. 一条SQL查询语句是如何执行的? MySql杂谈
  4. Flutter延时任务、Flutter通过Future与Timer实现延时任务
  5. 八、spring生命周期之BeanPostProcessor
  6. jQuery each、节点操作、动画演示、尺寸操作、扩展方法
  7. 嘉汇舞台工程材料列表(全部自有设备)
  8. NodeJS 正则路由匹配
  9. 纯css3制作的几个社交媒体网站的图标
  10. JavaScript 面向对象编程(一) —— 面向对象基础