Android 开机会出现3个画面:
1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片);
2. Android平台启动初始化,出现"A N D R I O D"文字字样画面;
3. Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。

1、开机图片(Linux小企鹅) (Android 1.5及以上版本已经取消加载图片);
Linux Kernel引导启动后,加载该图片。
logo.c中定义nologo,在fb_find_logo(int depth)函数中根据nologo的值判断是否需要加载相应图片。
代码如下:
static int nologo;
module_param(nologo, bool, 0);
MODULE_PARM_DESC(nologo, "Disables startup logo");
/* logo's are marked __initdata. Use __init_refok to tell
* modpost that it is intended that this function uses data
* marked __initdata.
*/
const struct linux_logo * __init_refok fb_find_logo(int depth)
{
const struct linux_logo *logo = NULL;
if (nologo)
return NULL;
......
}
相关代码:
/kernel/drivers/video/fbmem.c
/kernel/drivers/video/logo/logo.c
/kernel/drivers/video/logo/Kconfig
/kernel/include/linux/linux_logo.h

2、开机文字("A N D R I O D")
Android 系统启动后,init.c中main()调用load_565rle_image()函数读取/initlogo.rle(一张565 rle压缩的位图),如果读取成功,则在/dev/graphics/fb0显示Logo图片;如果读取失败,则将/dev/tty0设为TEXT模式,并打开/dev/tty0,输出文本“A N D R I O D”字样。
定义加载图片文件名称
#define INIT_IMAGE_FILE "/initlogo.rle"
int load_565rle_image( char *file_name );
#endif
init.c中main()加载/initlogo.rle文件。

if( load_565rle_image(INIT_IMAGE_FILE) ) {//加载initlogo.rle文件    fd = open("/dev/tty0", O_WRONLY);//将/dev/tty0设为text模式    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);    }}
相关代码:
/system/core/init/init.c
/system/core/init/init.h
/system/core/init/init.rc
/system/core/init/logo.c
*.rle文件的制作步骤:
a. 使用GIMP或者Advanced Batch Converter软件,将图象转换为RAW格式;
b. 使用android自带的rgb2565工具,将RAW格式文件转换为RLE格式(如:rgb2565 -rle < initlogo.raw > initlogo.rle)。

3、开机动画(闪动的ANDROID字样的动画图片)
Android 1.5版本:Android的系统登录动画类似于Windows系统的滚动条,是由前景和背景两张PNG图片组成,这两张图片存在于手机或模拟器/system/framework/framework-res.apk文件当中,对应原文件位于/frameworks/base/core/res/assets/images/。前景图片(android-logo-mask.png)上的Android文字部分镂空,背景图片(android-logo-shine.png)则是简单的纹理。系统登录时,前景图片在最上层显示,程序代码(BootAnimation.android())控制背景图片连续滚动,透过前景图片文字镂空部分滚动显示背景纹理,从而实现动画效果。
相关代码:
/frameworks/base/libs/surfaceflinger/BootAnimation.h
/frameworks/base/libs/surfaceflinger/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 1.6及以上版本:
init.c解析init.rc(其中定义服务:“service bootanim /system/bin/bootanimation”),bootanim服务由SurfaceFlinger.readyToRun()(property_set("ctl.start", "bootanim");)执行开机动画、bootFinished()(property_set("ctl.stop", "bootanim");)执行停止开机动画。
BootAnimation.h和BootAnimation.cpp文件放到了/frameworks/base/cmds/bootanimation目录下了,增加了一个入口文件bootanimation_main.cpp。Android.mk文件中可以看到,将开机动画从原来的SurfaceFlinger里提取出来了,生成可执行文件:bootanimation。Android.mk代码如下:
//=============Android.mk======================
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
bootanimation_main.cpp /
BootAnimation.cpp
# need "-lrt" on Linux simulator to pick up clock_gettime
ifeq ($(TARGET_SIMULATOR),true)
ifeq ($(HOST_OS),linux)
LOCAL_LDLIBS += -lrt
endif
endif
LOCAL_SHARED_LIBRARIES := /
libcutils /
libutils /
libui /
libcorecg /
libsgl /
libEGL /
libGLESv1_CM /
libmedia
LOCAL_C_INCLUDES := /
$(call include-path-for, corecg graphics)
LOCAL_MODULE:= bootanimation
include $(BUILD_EXECUTABLE)
//==========================================
(1)adb shell后,可以直接运行“bootanimation”来重新看开机动画,它会一直处于动画状态,而不会停止。
(2)adb shell后,命令“setprop ctl.start bootanim”执行开机动画;命令“getprop ctl.start bootanim”停止开机动画。这两句命令分别对应SurfaceFlinger.cpp的两句语句:property_set("ctl.start", "bootanim");和property_set("ctl.stop", "bootanim");
相关文件:
/frameworks/base/cmds/bootanimation/BootAnimation.h
/frameworks/base/cmds/bootanimation/BootAnimation.cpp
/frameworks/base/cmds/bootanimation/bootanimation_main.cpp
/system/core/init/init.c
/system/core/rootdir/init.rc
参考文档:
图说Android开机画面和开机动画
http://www.shudoo.com/09/1030/15/13418431.html
initlogo.rle: display an image on boot
http://forum.xda-developers.com/showthread.php?t=443431

分析Android 根文件系统启动过程(init守护进程分析)
http://crazier9527.javaeye.com/blog/454635

更多相关文章

  1. 设置提示信息,输入值类型,输入框引入图片,设置输入框的形状
  2. android gif动画
  3. android数字证书-签名(步骤)
  4. android中九宫格布局的实现
  5. 开机动画(闪动的ANDROID字样的动画图片)
  6. Android图文详解属性动画
  7. Android的FrameLayout布局介绍
  8. 从Android读取Unity assets下的图片并保存为Bitmap格式
  9. android之AnimationDrawable

随机推荐

  1. Android adb 常用技巧
  2. android EditText控件自动获取焦点弹出键
  3. android中和activity生命周期相关的那些
  4. 离线安装 Android 4.0 SDK
  5. Android materialDesign 风格阴影 改变阴
  6. Android 软键盘弹出,界面整体上移
  7. 第七章 Android 动画机制与使用技巧
  8. react-nativeAndroid打包报错:Daemon: AAP
  9. html5写链接打开ios和android本地应用
  10. 【转】.Android-sharedUserId数据权限