一、 修改化定制Android4.0系统

Android系统启动时,先加载Linux内核,在Linux的framebuffer驱动里可以定制开 机界面,Linux内核启动成功后,挂载根文件系统,启动Android系统,这个时候设备屏幕上开始出现滚动的Android动画,等全部的 Android服务启动完毕之后,开始启动Android的HOME界面,也就是桌面。

而在这个过程中,我们可以将开机界面和Android动画全部定制为自己需要的效果。

在整个开机过程中,屏幕上会出现三次内容:
        Ø Linux启动时画面,通常是个黄嘴的小企鹅
        Ø Android系统本地启动阶段画面,是“ANDROID”文字字样
        ØAndroid系统显示系统启动阶段动画,是滚动的ANDROID动画

我们下面将三个过程中的屏幕内容都进行个性化设置。

1. 定制手机开机界面

根据前面文章介绍,我们要在Linux的framebuffer驱动里修改一些代码,让屏幕上出现我们自己的一个开机图片,如下图所示效果。

在Linux系统中,LCD显示设备的驱动都是基于framebuffer的,framebuffer我们可以看成是Android的显存,只要我们向该显存里写入数据,这些数据就可以显示在LCD上。

根据不同的LCD所支持的颜色可以分为:16位色,24位色,32位色。

学过初中物理都知道,色彩由三元色:红(R),绿(G),蓝(B)组成。

Ó16位色:一个像素点由16bit表示,占两个字节,RGB组成分为:565或555二种

Ó24位色:一个像素点由24bit表示,占三个字节,RGB每个颜色由8位组成。

Ó32位色:一个像素点由32bit表示,占四个字节,除了RGB每个颜色8位外,还有8位的Alpha的透明度,共组成32位。

很明显,位数越高,可显示的色彩越丰富,相同像素的LCD占用的显存越大,现在手机和平板基本上都使用32位色的LCD。

Android模拟器里使用16位565格式显示驱动。

既然如此,那么出现在framebuffer里的应该是16位的具体颜色值,我们从怎么知道一个图片的RGB的值呢?

还好,我们使用一款叫Image2Lcd的软件,可以将一个指定的bmp位图格式图片转换成指定的RGB格式数据的数组中。

如下图所示:

选择好图片,设置好宽度和高度及颜色位数,保存成一个头文件mylogo.h,打开里面内容如下:

[cpp] view plaincopyprint?
                            1. const unsigned char bmp[307200] = { /* 0X00,0X10,0X40,0X01,0XE0,0X01,0X01,0X1B, */
                            2. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
                            3. …
                            4. };

那么我们可以直接将这个头文件拷贝到内核目录中,包含到驱动里,然后直接通过bmp数组名访问图片内容。

Ó修改goldfish的fb驱动文件:

drivers/video/goldfishfb.c

在里面添加一个绘制Logo图片函数draw_logo,如下所示:

[cpp] view plaincopyprint?
                            1. 191 // MichaelTang add for bootlogo
                            2. 192 #include "mylogo.h"
                            3. 193 static int draw_logo(struct goldfish_fb *fb)
                            4. 194 {
                            5. 195          int height = fb->fb.var.yres;
                            6. 196          int width = fb->fb.var.xres;
                            7. 197
                            8. 198          printk("---------> h = %d, w = %d\n", height, width);
                            9. 199          memcpy(fb->fb.screen_base, bmp, height*width*2);
                            10. 200          return 0;
                            11. 201 }

Ó在goldfish_fb_probe函数里调用我们刚才添加的draw_logo函数:

[cpp] view plaincopyprint?
                            1. 204 static int goldfish_fb_probe(struct platform_device *pdev)
                            2. {
                            3.            …
                            4. 312          // MichaelTang add for bootlogo
                            5. 313          draw_logo(fb);
                            6.            ...
                            7. }

重新编译goldfish内核,然后将模拟器的内核指定为新编译的内核,启动后效果如下图所示:

当然,这儿的实验只是在Android的模拟器上实现的,如果在真实设备上,其步骤和上述一样,只不过驱动文件可能不一样,修改的位置不太一样,其原理是一样的。不过最后苹果和三星专利大战再次敲响,希望苹果有一天别来找我,否则,卖肾都赔不起,现在肾也不值钱了。

2.定制Android启动字样

当Linux启动完毕之后,开始挂载根文件系统ramdisk.img,通过命令行指定Linux运行Linux系统里的第一个用户进程init:

init程序由system/core/init/目录下的源码编译而成,其入口文件为:init.c,console_init_action函数就是
用来打开console终端,然后在屏幕上打印“A N D R O I
D”字样的,如果想修改这个值,则直接将其内容修改了,重新编译init程序,然后重新生成system.img即可,不过,一般是将其内容注释掉。

[cpp] view plaincopyprint?
                            1. 538 static int console_init_action(int nargs, char **args)
                            2. 539 {
                            3.              …
                            4. 548      fd = open(console_name, O_RDWR);
                            5. 549      if (fd>= 0)
                            6. 550          have_console = 1;
                            7. 551      close(fd);
                            8. 552
                            9. 553      if( load_565rle_image(INIT_IMAGE_FILE) ) {
                            10. 554          fd = open("/dev/tty0", O_WRONLY);
                            11. 555          if (fd>= 0) {
                            12. 556              const char *msg;

                            13. 557                  msg = "\n"
                            14. 558              "\n"
                            15. 559              "\n"
                            16. 560              "\n"
                            17. 561              "\n"
                            18. 562              "\n"
                            19. 563              "\n" // console is 40 cols x 30 lines
                            20. 564              "\n"
                            21. 565              "\n"
                            22. 566              "\n"
                            23. 567              "\n"
                            24. 568              "\n"
                            25. 569              "\n"
                            26. 570              "\n"
                            27. 571              "              A N D R O I D ";
                            28. 572              write(fd, msg, strlen(msg));
                            29. 573              close(fd);
                            30. 574          }
                            31. 575      }
                            32. 576      return 0;
                            33. 577 }

修改完之后,操作步骤如下:

[cpp] view plaincopyprint?
                            1. $ source build/envsetup.sh
                            2. $ mmm system/core/init
                            3. $ make snod

重新启动模拟器,可以发现ANDROID字样发生了相应的改变。

3. 定制Android动画

Android系统过程中会滚动Android字样的一个动画,我们可以根据自己的需要,定制这个开机动画,如下图所示:

Android的开机动画是由Linux本地程序bootanimation控制实现的,其代码在:

frameworks/base/cmds/bootanimation/,通过分析源码可知,修改Android开机动画有两种方式:

Ø
替换frameworks/base/core/res/assets/images/目录下的两个图片文件:android-logo-
mask.png和android-logo-shine.png,android-logo-mask.png是镂空蒙板png图片,android-
logo-shine.png是镂空蒙板后面的闪光png图片

Ø在/data/local/或/system/media/目录创建bootanimation.zip文件

bootanimation.zip文件打包前的结构为:

[cpp] view plaincopyprint?
                            1. desc.txt 动画属性描述文件
                            2. part0/ 第一阶段动画图片的目录(动画是由一帧帧图片组成的)
                            3. part1/ 第二阶段动画图片的目录

bootanimation.zip文件是直接由这几个文件打包的,打包的格式是ZIP,并且要指定用压缩打包方式(就是在打包时的压缩方式选择为存储)。

desc.txt文件的格式为

[cpp] view plaincopyprint?
                            1. 480 250 15
                            2. p 1 0 part0
                            3. p 0 10 part1

其中各个参数的意义为:

480 250 15  
图片的宽 图片的高 每秒显示帧数  
p 1 0 part0
标识符 循环的次数 阶段切换间隔时间 对应图片目录
p 0 10 part1
标识符 循环的次数 阶段切换间隔时间 对应图片目录

注:
        标识符:p 是必须的。
        循环次数:指该目录中图片循环显示的次数,0表示本阶段无限循环。
        每秒显示帧数:就是每秒显示的图片数量,决定每张图片显示的时间。
        阶段切换间隔时间:指的是该阶段结束后间隔多长时间显示下一阶段的图片,其单位是每张图片显示的时间。
        对应图片目录:就是该阶段动画的系列图片,以图片文件目录的顺序显示动画,而且图片的格式必须要为PNG。

文章来源:华清远见嵌入式学院原文地址:http://www.embedu.org/Column/Column678.htm

更多相关嵌入式免费资料查看华清远见讲师博文>>

深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM的更多相关文章

  1. 深入浅出 - Android系统移植与平台开发(一)

    深入浅出 - Android系统移植与平台开发(一) 分类: Android移植2012-09-05 14:16 16173人阅读 评论(12) 收藏 举报 androidgitgooglejdkub ...

  2. 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码(转)

    2.3编译Android源码 Android源码体积非常庞大,由Dalvik虚拟机.Linux内核.编译系统.框架代码.Android定制C库.测试套件.系统应用程序等部分组成,在编译Android源 ...

  3. 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器

    作者:唐老师,华清远见嵌入式学院讲师. 1.   编译Android模拟器 在Ubuntu下,我们可以在源码里编译出自己的模拟器及SDK等编译工具,当然这个和在windows里下载的看起来没有什么区别 ...

  4. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)

    第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...

  5. 深入浅出 - Android系统移植与平台开发(十一)- Android系统的定制(瘋耔修改篇一)

    首先非常感谢原文作者为我们提供的知识库,因为有你们的贡献,我们的开发难度更显简单 原文 :   http://blog.csdn.net/mr_raptor/article/details/30113 ...

  6. 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制

    第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...

  7. 深入浅出 - Android系统移植与平台开发(二) - 准备Android开发环境

    作者:唐老师,华清远见嵌入式学院讲师. 编译Android源码 关于android系统的编译,Android的官方网站上也给出了详细的说明.http://source.android.com/sour ...

  8. 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速

    作者:唐老师,华清远见嵌入式学院讲师. Android的启动速度一直以来是他的诟病,虽然现在Android设备的硬件速度越来越快,但是随着新 版本的出现,其启动速度一直都比较慢,当然,作为程序员,我们 ...

  9. 深入浅出 - Android系统移植与平台开发(七)- 初识HAL

    作者:唐老师,华清远见嵌入式学院讲师. 1. HAL的module与stub HAL(Hardware AbstractLayer)硬件抽象层是Google开发的Android系统里上层应用对底层硬件 ...

随机推荐

  1. hdu 1247:Hat’s Words(字典树,经典题)

    Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  2. ASP.NET 5探险(8):利用中间件、TagHelper来在MVC 6中实现Captcha

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于ASP.NET 5及MVC 6是一个微软全新重新的Web开发平台,之前一些现有的验 ...

  3. 使用Visual Studio Code开发AngularJS应用

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:VSC发布之后,尤其最近刚刚更新到0.3之后,社区出现了很多介绍VSC使用的好文章.比 ...

  4. c中malloc的用法

    转自:http://blog.sina.com.cn/s/blog_966f8e8501010if7.html Malloc 向系统申请分配指定size个字节的内存空间.返回类型是 void* 类型. ...

  5. java调用shell获取返回值

    转自:http://blog.csdn.net/tengdazhang770960436/article/details/12014839 1.shell文件return.sh echo 1 echo ...

  6. OpenMesh 之向量操作

    OpenMesh 提供了许多可供使用的向量操作函数,使用特别方便. 计算距离: 从官方文档可以看到OpenMesh提供了5个函数,分别为 Scalar length() const        // ...

  7. 使用Aspose.Cell.dll导出Excel总结

    这两天项目上用Aspose导出Excel来着.开始感觉挺简单的,但是实际操作起来还是挺复杂的,调试占的时间很长.主要是动态生成列.合并单元格.调样式占了很长时间,还是总结一下吧. 基础操作: //EX ...

  8. 【java IO File】统计项目代码总共多少行

    统计项目代码总共有多少行 思想: 1.首先将不需要迭代的文件夹,保存在集合中,不满足的就是需要迭代的文件夹 2.将需要进行统计行数的代码文件保存在集合中,满足的就是需要计算文件行数的文件 3.迭代方法 ...

  9. hashlib加密操作模块

    import hashlib#加密操作obj=hashlib.md5(bytes("hasdfghjklcxz",encoding="utf-8"))#加密操作 ...

  10. PHP之数据类型

    1.PHP字符串(String):一个字符串是一串字符的序列,就像"Hello world!":可以将任何文本放在单引号和双引号中: <?php $x="Hello ...