本帖最后由 zhangxu1005 2010-11-9 11:33 编辑

整个开机画面分为两个部分:开机画面和登录画面

开机画面修改:
system\core\init\Init.h中有一宏定义:
#define INIT_IMAGE_FILE "/initlogo.rle"

system\core\init\Init.c中有如下代码段:
if( load_565rle_image(INIT_IMAGE_FILE) ) {
    fd = open("/dev/tty0", O_WRONLY);
    if (fd >= 0) {
        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);


读取/initlogo.rle(一张565 rle 压缩的图片),如果成功则在/dev/graphics/fb0显示Logo,如果失败则将/dev/tty0设为TEXT模式并打开/dev/tty0,输出文本ANDROID字样。

修改步骤:1.处理一张rle的图片,使用android编译好的工具rgb2565out/host/linux-86/bin,命令 rgb2565 -rle <initlogo.raw> initlogo.rle
              2.将这张图片打包到ramdisk.img 的根目录中。个人方法:在code下加入了vender文件夹,将initlogo.rle放入此文件夹,在generic.mk中加入
                          PRODUCT_COPY_FILES := \
                                         vendor/initloge.rle:root/initloge.rle
              3.编译源码即可。
登录画面修改:

Android 的系统登录动画类似于Windows系统的滚动条,是由前景和背景两张PNG图片组成,这两张图片存在于/system/framework /framework-res.apk文件当中。前景图片(andr
oid-logo-mask.png)上的Android文字部分镂空,背景图片(android-logo-shine.png)则是简单的纹理。系统登录时,前景图片在最上层显示,程序代码控制背景图片连续滚动,透过前景图片文字镂空部分滚动显示背景纹理,从而实现动画效果。代码地址已给出,大家自己修改吧。(此段非原创

相关代码:
\frameworks\base\cmds\bootanimation\BootAnimation.h
\frameworks\base\cmds\bootanimation\BootAnimation.cpp

\frameworks\base\core\res\assets\images\android-logo-mask.png
Android默认的前景图片,文字部分镂空,大小256×64
\frameworks\base\core\res\assets\images\android-logo-shine.png
Android默认的背景图片,有动感效果,大小512×64
一、开机动画
Android开机时本身并不支持gif格式的图片,我们所看到的ANDROID发光动画的动态的效果是由前景和背景两张PNG图片组成。如果我们想替换这个动画的话,首先就需要将gif格式图片逐帧导出成png格式的图片。
使用AdobeImageReady来转换获得我们需要的png格式的图片,将它们按顺序命名并且放入part0文件夹中,之后需要建立一个动画属性的描述文件:。用来描述我们用什么方式来播放动画,里面的内容如下图所示 01.bmp
前两个数字是我们要显示图片的分辨率,320、240刚好使图片充满屏幕。4代表的是每秒钟显示的帧数,决定了动画播放的快
慢。第二行参数定义如下所示:02.bmp
循环次数为0时表示本阶段无限循环,之所以会提到本阶段,是因为我们有多个阶段来播放动画,这样就可以保证我们播放多段不同的动画。如果把描述文件更改为  03.bmp
就表示第一阶段和第二阶段的动画分别播放一遍,之后无限循环part2里面的动画。
我们还可以通过修改p后面的第二个参数来更改每个阶段的间隔时间,要注意它的单位是一
个帧的持续时间。下图的描述文件决定了两个阶段的间隔时间是2*(1/4)=0.5s
04.bmp
阶段切换间隔时间期间开机动画进程进入休眠,把CPU时间让给初始化系统使用。也就是间隔时间长启动会快,但会影响动画效果。
最后需要将以及part0、part1……打包成bootanimation.zip文件,要注意压缩等级一定要选择存储压缩,有了打包好的动画就需要把它放到一个合适的地方,将制作完成的bootanimation.zip文件放在工程的资源目录下,如frameworks/base/data/sounds目录下,打开改该目录下面的Android.mk文件可以看到这个makefile文件就是拷贝frameworks/base/data/sounds目录下面的铃声资源到media/audio文件夹下面,所以我们在Android.mk文件里面添加以下语句将该压缩包发送到data\local\路径下:
$(LOCAL_PATH)/bootanimation.zip:data/local/bootanimation.zip
至此我们就完成了开机动画的替换工作。05.bmp
启动过程中系统会在依次在data/local和system/media路径下面寻是否存在名为bootanimation.zip的文件,如果能到名为bootanimation.zip的文件,mAndroidAnimation的值就保持为false
06.bmp
mAndroidAnimation为false的时候,执行movie(),完成bootanimation.zip中的动画播放,mAndroidAnimation为true的时候,播放系统默认的开机动画。
07.bmp
完成初始化工作,将android-logo-mask.png和android-logo-shine.png两个文件mAndroid[0]和mAndroid[1]两个结构体中
08.bmp
OpenGL的一些东西,完成了清屏工作
09.bmp
设置绘制图片的坐标,保证图片居中显示
10.bmp
通过时间计算x坐标的偏移量,x = xc – offset 计算最终坐标位置
11.bmp
绘制背景图片
12.bmp
文字的绘制
13.bmp
控制刷新图片的速度
我们自己的动画在movie()函数里面
14.bmp
15.bmp
到文件并进行解析
sscanf()就是从一个字符串中读进与指定格式相符的数据。到字符串结尾”\n”的时候跳出循
canvas动画环,分别读取宽、高和帧数存入变量width, height, fps中,并将它们赋值给结构体animation中对应的变量
16.bmp
这里要求我们之前生成bootanimation.zip的时候要选择存储压缩,最终和android()方法类似也是利用一帧一帧的绘制来完成动画效果
二、开机默认壁纸
要把开机后Home Screen所显示的壁纸改为我们自己的壁纸,考虑到此壁纸是在Launcher启动时加载,所以会想到在Launcher里面加载壁纸的方法进而试图到壁纸的位置。里面看到带Wallpaper字样的方法startWallpaper(), 在这里面看到了管理壁纸的类WallpaperManager
在这个类的里面看到了带有default字样的方法getDefaultWallpaperLocked(Context context)
,里面有这样一段代码