您的位置:首页 > 运维架构 > Linux

修改linux/Android启动logo

2013-02-20 11:25 483 查看
修改linux/Android启动logo/开机画面

转载请注明出处:/article/10553939.html

一、修改uboot显示开机logo

此处有两种情况,一种情况是通过uboot提供的logo显示功能显示开机logo,另一种情况是通过定制显示函数来进行logo的显示。

对于第一种情况,只需要在tools/logos目录下添加自己的logo图片xxx_logo.bmp(需要为bmp格式并且位深度为8),并修改tools目录下的makefile文件即可。在makefile文件中的相应位置加入如下代码:

ifeq ($(VENDOR),xxx)

LOGO_BMP= logos/xxx_logo.bmp

endif


对于第二种情况,一般需要自己将bmp文件保存到数组中,并在程序中将数组中的图片数据写入到lcd缓冲区进行logo的显示。

此时,按如下步骤进行操作:

1.制作一张logo,并保存为uboot_logo.bmp文件;

2.在linux操作系统中,执行命令:gzip -9 uboot_logo.bmp,对图片进行压缩并生成uboot_logo.bmp.gz文件;

3.执行xxd -i uboot_logo.bmp.gz > uboot_logo.h,压缩后的图片数据转化为数组并保存成.h文件;

4.利用uboot_logo.h文件里的数组进行logo的显示即可。

此处,需要将图片进行gzip压缩,否则可能会出现“Bad gzipped data uboot”的错误提示,并且无法显示logo。

二、修改由kernel显示的开机logo

1、安装pngtopnm

sudo apt-get install netpbm

安装完以后就会生成pngtopnm、pnmquant、pnmtoplainpnm三个工具。

2、制作logo图片

将logo图片保存为mylogo.png,注意扩展名为png。

3、制作.ppm格式的图片

pngtopnm mylogo.png > mylogo.pnm

pnmquant 224 mylogo.pnm > mylogo224.pnm

pnmtoplainpnm mylogo224.pnm > logo_linux_clut224.ppm

4.拷贝文件到相应目录

用logo_linux_clut224.ppm替换kernel/drivers/video/logo目录下的同名文件,删除对应的.o文件并重新编译内核即可。

5.内核的配置

内核中除了要选中 Graphics support项下的 Bootup logo配置项外,还要选中 Console display driver support配置项。否则kernel不会显示logo。

三、修改由Android系统显示的静态开机画面

1. 制作要显示的图片

使用PS制作一张和当前lcd分辨率相同的图片,保存时选“存储为 Web 所用格式”,然后在弹开的窗口上,“预设”项选择“PNG-24”,保存为android_logo.png。

2. 将图片转换为raw格式

使用linux下的ImageMagick自带的convert命令,进行raw格式转换,命令为:

convert -depth 8 android_logo.png rgb:android_logo.raw

如果当前系统没有安装该工具,可以执行下面的命令安装:

sudo apt-get install imagemagick

3. 将raw格式转化为rle文件

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

rgb2565 -rle < android_logo.raw > initlogo.rle

至此,需要显示的图像已经做好了,即initlogo.rle。

4.将initlogo.rle拷贝到文件系统中

将initlogo.rle拷贝到out\target\product\pantherboard\root下,并替换同名文件。然后重新制作文件系统映像并烧写即可。

5.特别说明

该图片是在system/core/init/init.c文件中显示的,具体函数调用过程如下:

console_init_action();

-> load_565rle_image(INIT_IMAGE_FILE) ;

-> unlink(fn);

函数中的宏在对应的头文件android/system/core/init/init.h中定义:

#define INIT_IMAGE_FILE "/initlogo.rle"

对于可读写型的文件系统而言,当第一次开机并显示logo后,上述unlink(fn)函数会将该logo删除,第二次开机时就不能再显示这一logo了。解决办法有两个,一是注释掉unlink(fn)函数,但是尽量不要修改源码。二是在out\target\product\xxxx\root目录下,拷贝initlogo.rle的副本,并命名为initlogo.rle.bak,直接用initlogo.rle.bak文件替换initlogo.rle也可以,不过原因还不清楚。

四、修改由Android显示的“android”文字开机动画

此处所说的“android”文字开机动画是官方最原始的开机动画,用两张png图片实现,通过多张图片实现的开机动画的实现在下面一项进行说明。

用winRAR 打开android\out\target\product\xxxx\system\framework目录下的framework-res.apk文件,用预显示的图片替换assets\images下相应的图片即可。

按上述方法能够改变开机logo,但是由于修改的是out目录下生成的文件,改动对android源码并没有影响,因此,若清除编译的目标文件并重新编译时,修改过的logo又被源码中的固有logo覆盖了。所以要修改源码中与logo有关的部分。具体做法是,修改/frameworks/base/core/res/assets/images/目录下的png图片,修改后再重新编译就依然是我们修改后的logo了。

显示此开机动画的程序为由init进程解析init.rc脚本时创建的bootanimation服务,该服务的源代码位于frameworks/base/cmds/bootanimation/目录下的bootanimation.cpp文件中,具体函数如下所示:
bool BootAnimation::android()
{
initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png");
initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png");

// clear screen
glShadeModel(GL_FLAT);
glDisable(GL_DITHER);
glDisable(GL_SCISSOR_TEST);
glClearColor(0,0,0,1);
glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(mDisplay, mSurface);

glEnable(GL_TEXTURE_2D);
glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

const GLint xc = (mWidth  - mAndroid[0].w) / 2;
const GLint yc = (mHeight - mAndroid[0].h) / 2;
const Rect updateRect(xc, yc, xc + mAndroid[0].w, yc + mAndroid[0].h);

glScissor(updateRect.left, mHeight - updateRect.bottom, updateRect.width(),
updateRect.height());

// Blend state
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

const nsecs_t startTime = systemTime();
do {
nsecs_t now = systemTime();
double time = now - startTime;
float t = 4.0f * float(time / us2ns(16667)) / mAndroid[1].w;
GLint offset = (1 - (t - floorf(t))) * mAndroid[1].w;
GLint x = xc - offset;

glDisable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);

glEnable(GL_SCISSOR_TEST);
glDisable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, mAndroid[1].name);
glDrawTexiOES(x,                 yc, 0, mAndroid[1].w, mAndroid[1].h);
glDrawTexiOES(x + mAndroid[1].w, yc, 0, mAndroid[1].w, mAndroid[1].h);

glEnable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, mAndroid[0].name);
glDrawTexiOES(xc, yc, 0, mAndroid[0].w, mAndroid[0].h);

EGLBoolean res = eglSwapBuffers(mDisplay, mSurface);
if (res == EGL_FALSE)
break;

// 12fps: don't animate too fast to preserve CPU
const nsecs_t sleepTime = 83333 - ns2us(systemTime() - now);
if (sleepTime > 0)
usleep(sleepTime);

checkExit();
} while (!exitPending());

glDeleteTextures(1, &mAndroid[0].name);
glDeleteTextures(1, &mAndroid[1].name);
//add to stop boot music
this->stopBootMusic();
return false;
}


五、修改“bootanimation.zip”逐帧动画

之所以叫做逐帧动画,是因为动画是由一帧一帧的图片的构成的。/system/media/bootanimation.zip里面储存着显示动画效果所需要的图片文件。
修改里面的文件即可实现修改开机动画的目的。源代码和4中所述的一样,也位于frameworks/base/cmds/bootanimation/目录下。

判断是显示“Android文字”动画还是显示“movie”动画:
bool BootAnimation::threadLoop()
{
if(!mBootVideo)
{
bool r;
if (mAndroidAnimation) {
r = android();
} else {
r = movie();
}

// No need to force exit anymore
property_set(EXIT_PROP_NAME, "0");

eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglDestroyContext(mDisplay, mContext);
eglDestroySurface(mDisplay, mSurface);
mFlingerSurface.clear();
mFlingerSurfaceControl.clear();
eglTerminate(mDisplay);
IPCThreadState::self()->stopProcess();
return r;
}
else
{
return true;
}
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: