首先修改开机logo要从哪里入手呢?先看看源码
void display_image_on_screen()
2 {
3 struct fbimage default_fbimg, *fbimg;
4 bool flag = true;
5
6 fbcon_clear();
7 fbimg = fetch_image_from_partition(); //从splash镜像分区抓取图片
8 if(fbimg){
9 dprintf(CRITICAL, "zbzhuang### ->fetch_image_from_partition\n");
10 }
11
12 if(!fbimg) { //如果splash.img分区的内容不存在或者被擦除则从splash.h头文件从获取要显示图像的数组
13 dprintf(CRITICAL, "zbzhuang### ->not fetch_image_from_partition\n");
14 flag = false;
15 fbimg = &default_fbimg;
16 fbimg->header.width = SPLASH_IMAGE_HEIGHT;
17 fbimg->header.height = SPLASH_IMAGE_WIDTH;
18 #if DISPLAY_TYPE_MIPI
19 fbimg->image = (unsigned char *)imageBuffer_rgb888;
20 #else
21 fbimg->image = (unsigned char *)imageBuffer;
22 #endif
23 }
24
25 fbcon_putImage(fbimg, flag);
26 }
由源码可以知道修改开机logo有两种方式:
方法一:利用工具根据图像生成splash.img镜像之后,使用fastboot重新刷splash.img分区。
方法二:利用工具将图片重新生成splash.h头文件的数据,替换相应的头文件就OK
通过验证可以知道方法一适用用于高分辨率的图片,也能适用于小分辨率的图片,而方法二只适用于小分辨率的图片,所有基本上不使用方法二。
方法一:
利用工具根据图像生成splash.img镜像之后,使用fastboot重新刷splash.img分区。
现在基本上平板,手机都是高清显示屏了,所以准备一张1920*1080的图片和生成splash.img镜像的脚本工具—>logo_gen.py。
脚本路径device\qcom\common\display\logo\logo_gen.py
(1)先把图片和脚本文件放在同一目录。
(2) sudo apt-get install python-imaging
安装python成功后运行如下脚本:(现在基本的linux系统都已经装好了,可以直接用)
(3) python ./logo_gen.py snapdragon.png
这样就可在当前目录下生成splash.img。
烧写 splash.img
1 adb reboot bootloader //进入bootloader模式
2 fastboot flash splash_v splash.img //将镜像刷入相应分区(分区名字可能各个厂商的名字不一样)
3 fastboot reboot //重启平板电脑
方法二:
准备一张png图片logo.png,分辨率不要超过320*200,在ubuntu下敲如下三行命令,要事先安装好conver xxd等工具 。logo_new.png 图片。
convert logo.png -recolor "0 0 1,0 1 0,1 0 0" logo_new.png //将图片重新着色BRG转C成rgb
convert -depth 8 logo_new.png rgb:logo_raw.raw //将png格式转成raw图片格式
xxd -c16 -i logo_raw.raw > splash.h //生成对于的splash.h头文件的数组
用splash.h文件中数组的内容替换bootable/bootloader/lk/platform/msm_shared/include/splash.h中的数组imageBuffer_rgb888,同时修改分辨率。
#define SPLASH_IMAGE_WIDTH 320
#define SPLASH_IMAGE_HEIGHT 200
然后重编lk,将生成的emmc_appsboot.mbn烧进单板即可。
注意:方法二需要保证splash分区为空,splash分区非空,方法二是不起作用的,所以用方法二之前,最好先擦除splash分区。原因如下
我通过aboot.c的源码发现在进入fastboot模式之后显示的图片也是splash.h文件中数组的内容,所有我们想要修改fastboot显示图片也可以通过第二种方法进行修改。
一.Android默认开机动画是显示“android”字样的图片,想要替换掉“android”,需要用到bootanimation.zip.
二.原生Android系统中好像没有bootanimation.zip,可以把bootanimation.zip文件放到设备system/media目录下(需要root权限)。放到此目录下后,开机会自动加载该文件里的图片,作为动画。
三.有的厂商自己做了开机动画,所以我们也可以通过adb pull 命令从system/media 目录下把bootanimation.zip文件下载到电脑上,因为这些文件都是只读文件,所以我们需要在dos界面获取root权限。然后设置’systen’为可写。
adb root //获取root权限,adb remount 需要root权限
adb remount //将 'system' 部分置于可写入的模式 ,默认 'system' 部分是只读的
有时候会存在adb remount 失败的情况
C:\Users\wpp>adb remount
remount of /system failed: Read-only file system
remount failed
当出现这种情况我们需要在adb remount 之前输入adb disable-verity
C:\Users\wpp>adb disable-verity
Verity disabled on /system
Now reboot your device for settings to take effect
C:\Users\wpp> adb reboot
C:\Users\wpp> adb root
C:\Users\wpp> adb remount
remount succeeded
这时候我们就能把system/media 里面的文件拿出来和写入文件了
四.bootanimation.zip内容和制作
1.当我们有现成的bootanimation.zip文件的时候,我们可以解压该文件一般会得到
part0 part1 两个文件夹和1个desc.txt文件
2.上面的文件夹里面存放的就是开机要显示的图片。一般来说,最后那个文件夹存放一张照片,然后设置成循环播放,就可以在进入系统界面之前一直有画面,不会出现黑屏的情况(所有动画都做完了,但是还没进入到系统界面就会出现黑屏)。
3.part0里面保存的必须是和desc.txt中分辨率相同的图片(后面会说desc.txt文件怎么看分辨率),可以替换成自己想用的一组图片,一般为.jpg .png 格式的图片。
4.desc.txt里面的内容,比如是这样的:
1920 1080 60
p 1 0 part0
p 0 0 part1
第一行的1920 1080 60前面两个数据代表像素,即:1920*1080;
第一行第三个数据:60代表的是每秒播放多少帧;
第二行第一个字母 “p”不知道什么玩意儿,固定以他为开头;
第二行第二个数字1,代表重复播放多少次,"1”即代表播放1次(0侧代表无限循环播放,应该是直到代码里面设置的动画时间耗完为止);
第二行第三个数字“0”代标的是前后两帧之间间隔时间/帧数(比如每秒播放10帧,如果这个数字设为10,则延迟1秒了,待确认);
第二行第四个参数,这就是上文说到的和文件夹名称对应的了,如果是folder~则文件夹名称也是这个,我的5.1里面只设置了一个part0,修改的时候我也将他默认为part0了。
第三行也是一样的。
不过这里有个严重问题一定要注意,编写完成保存之前要记得换行,即敲回车键!!!分成如我上面显示的那样,因为用记事本打开是在一行显示的,要不然在替换原生动画之后会只是一个图片。切记,我在这个地方大意了,搞了很久。
5.最后就是压缩了,压缩一定要选仅存储的方式进行压缩(这里要注意,有的人可能在做好文件夹和编写好txt文件后准备压缩,但是又添加了一层文件夹,这会导致识别不了动画资源,在从logo进入到动画的时候就是一片黑屏,直到Android系统启动后才OK)。
最后使用adb push命令把生成好的bootanimation.zip文件 push到 /system/media/ 目录下,再开机就可以显示新的开机画面了。