最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Android修改开关机动画声音

IT圈 admin 33浏览 0评论

2024年1月24日发(作者:万问寒)

.

开机画面,按照国际惯例,一般是分为2屏,当然也有3屏的说法,不管怎样,我这里说得就是最后的一屏,按照bootanimation的字面意思翻译,大概也就是开机动画的意思,那这就不说第几屏了,直接用“开机动画”这词。

首先,开机动画的地址:。。。要修改开机动画就是修改bootanimation这个文件。如果说你的手机里没有这个文件,那就是说明你用的是官方原始版本的rom,开机动画没有被修改过,但这不碍事,没有就放一个进去,到时候想换回最原始的开机画面,也可以把bootanimation这个文件删了。官方最原始的开机动画在system etsimages里面,里面主要是2张图片,高手面可以去研究一下,说不定通过这个文件可以用代码实现动画的过程。

接下来,说说这个文件的结构。bootanimation里面主要包含一个以及N个文件夹。而文件夹里面放着的就是你要的开机动画的图片。的作用就是指导系统如何去执行你的开机画面。

下面继续说说这个文档要怎么写。

先看例子,如果我的开机动画要用到2个文件夹,分别是part1和part2,。。。。我希望开机的时候,先把part1里面的图片都播放一遍,然后再循环播放part2里面的文件,直到进入系统。那么文档的内容应该如下:

302 480 5

p 1 0 part1

p 0 0 part2

就这么多,现在解释一下这些命令吧。

Word 资料

.

第一行,320 480是代表你屏幕的分辨率,因为我们的胖6是320*480的,这就不多说了。后面的5是说,5帧每秒,不懂的可以这么理解,5是代表一秒钟播放5张图片。就这么简单。

第二行,p 1 0 part1。p应该是play吧,也就是播放的意思。1是播放一次。0是空指令,就是什么都不做。part1就是说,这条指令是针对part1这个文件夹的。整条指令的意思就是,播放part1里面的图片1次,然后什么都不做,马上进入下一条指令。

第三行,p 0 0 part2。p依然是播放。第一个0这里是代表循环播放,第二个0和上面第二条指令一样,代表什么也不做。part2也就不多说了。

至于为什么第一个0为什么是代表循环,只能这么说,这事国际惯例,就像用迅雷的时候,0代表不限制速度一样,系统规定的,你知道就好,别纠结。

总结公式如下

第一条指令:屏幕的分辨率(空格)播放频率

第二条指令:p(空格)播放次数(空格)后续操作(空格)作用文件夹

第三条指令:同上

第N条指令:同上

屏幕分辨率的格式是:宽(空格)高,胖6的就是320 480。。。播放频率,上面已经说清楚了,至于到底要用多大的数字,视你开机动画的张数而定,比如说,一共有100张图片,开机时间是20秒,那么100/20就是5。

播放次数,1是代表一次,0代表循环播放。如果要播放2次的话,就是就是打个2上去,应该是这样吧,反正我是没试过,只试过0和1.

后续操作,0代表什么都不做,直接进入下一条指令。10是代表稍作停顿。

Word 资料

.

至于文件夹里面的图片,比较简单,首先,纠正一个说法,之前说必须要是png格式,经过我试验证明,jpg格式的也可以,其他的有待试验,不过只支持静态图片这点应该是真的,动态图片同样有待试验。其次,关于图片的尺寸,是不做要求的,只要在txt文档里写好手机的分辨率即可,开机的时候系统会自动适配。其其次要按播放循序命名,建议用5位数字,比如说,第一张图片是00010,第二张就是00020.。。。。为什么要从00010开始,而不是00001?因为这事预防以后要在第一张和第二张中间再插一张图片进去的话,就可以把插进去的图片命名为00011,在00010之后,00020之前。就这么简单。至于图片那里来嘛,当然是自己网上找啦,也可以下载别人的bootanimation,然后修改一下。

最后就是压缩包了,把需要用到的part文件夹跟打包成zip格式,必须是zip,不能是rar,而且打包的时候压缩方式要选择“存储”模式。然后改名成为,复制到SD卡里,再通过RE文件管理器复制到systemmedia下面,重启。

要注意一下,bootanimation不能太大,大了会卡,一般不要超过3M,。

————————————————————————————————————————————————————————————————————————————————————

1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片);

2. Android平台启动初始化,出现"A N D R I O D"文字字样画面;

3. Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。

现在我们说的是第三种方式(基于模拟器):

android开机动画叫源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/或/system/media/里面的png图片以动画的形式播放出来。

首先,我们先来分析一下源码:

Word 资料

.

frameworks/base/cmds/bootanimation/

首先看一下定义的常量:

#define USER_BOOTANIMATION_FILE "/data/local/"

1

2

3

4

#define SYSTEM_BOOTANIMATION_FILE

"/system/media/"

#define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE

"/system/media/"

BootAnimation::readyToRun()

进入一个if判断语句

1 if ((encryptedAnimation &&

2 (access(SYSTEM_ENCRYPTED_BOOTANIMAT3 ION_FILE, R_OK) == 0) &&

4 ((SYSTEM_ENCRYPTED_BOOTANI5 MATION_FILE) == NO_ERROR)) ||

6

7

R_OK) == 0) &&

8

((USER_BOOTANIMATION_FILE)

9

== NO_ERROR)) ||

1

((access(USER_BOOTANIMATION_FILE,

0 ((access(SYSTEM_BOOTANIMATION_FILE,

Word 资料

.

1R_OK) == 0) &&

1 ((SYSTEM_BOOTANIMATION_FILE)

== NO_ERROR))) {

mAndroidAnimation = false;

}

BootAnimation::threadLoop()

1 if (mAndroidAnimation) {

2 r = Android(); // 执行android字体闪动的图片

3 } else {

4 r = movie(); // 执行中提供的动画图片

5 }

1

==> BootAnimation::Android()会加载"images/"和"images/"

==> BootAnimation::movie()会加载中的内容

我们下载的源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面

所以如果你系那个用.zip的动画那么把你做好的动画拷贝到编译好对应的目录下即可,然后执行make snod整合进img包就可以看到效果了

如果你想修改android闪动的那两张图片的话,最简单的方法是直接替换图片,如果你懂openGL的话也可以自己做酷炫的动画

Word 资料

.

那两张图片放在./frameworks/base/core/res/assets/images 目录下,一张镂空的android图,一张发光效果,动画效果就是下面那张发光的效果图不断左右移动。

我是用Photoshop直接修改的

修改完后直接替换,然后再 mmm frameworks/base , make snod 即可

以下是我修改后的效果图:

看样子还想那么回事

接下来我们给系统添加开机声音

由于动画是在BootAnimation播放的,所以我们的声音肯定也在这个类中做,照猫画虎

Word 资料

.

首先在BootAnimation.h添加方法的声明和头文件的引用

1

2

#include

#include

添加方法 void bootMusic();

然后在中实现这个方法:

1 void BootAnimation::bootMusic()

2 {

Word 资料

.

3 int index;

4 MediaPlayer* mp = new MediaPlayer();

5 if (mp->setDataSource("/system/etc/", NULL)

6 == NO_ERROR) {

7 mp->setAudioStreamType(AUDIO_STREAM_ENFORCE8 D_AUDIBLE);

9 mp->prepare();

1 }

0 AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFOR1CED_AUDIBLE, &index);

1 if (index != 0) {

1 mp->seekTo(0);

2 mp->start();

1 }

3

14

15

请注意这个目录setDataSource("/system/etc/", NULL)

}

其实这个目录是随便写的,你想从哪个目录读这个文件就从哪个目录读好了,但是你要把这个文件放在对应的目录下

Word 资料

.

比如,这个目录是system/etc (这个目录是android系统的目录,不是源码的目录),这个文件夹是只有读权限而没有写权限的,所有你不用试adb shell了,没用的

其实system/etc这个目录对应的是我们编译后out文件夹下的xxx,然后在system/etc,所以你把放到这里就行了,当然如果你这时再emulaor 也同样是看不到效果的,因为你修改完还没有编译,和上面修改图片一样,make snod一下

然后和图上一样,你就会生成新的,当然你之前添加的也会自动被编译进去了

Word 资料

.

然后再修改bootanimation_这个文件,因为方法也申明了,也实现了,就是还没有调用,所以调用就在这里调

1 //play boot music -yp

2 BootAnimation *animation = new BootAnimation();

3 animation->bootMusic();

Word 资料

.

修改完这写以后还需要修改文件

因为播放声音还需要引入库

LOCAL_SHARED_LIBRARIES :=

libcutils

libutils

libbinder

libui

libskia

libEGL

libGLESv1_CM

Word 资料

.

libgui

libmedia

请注意,libmedia是新添加的;

完事后就ok了,当然还是需要编译的

mmm frameworks/base/cmds/bootanimation/

make snod

大功告成,这样你就成功的添加了开机音乐

也许有人会问,那android系统自带的那些音乐和铃声在什么地方呢?

源码目录在framworks/base/data/sounds

至于编译完成后放到什么地方了那是文件上配置的

不过这里叫

Word 资料

.

我们可以看到他又包含了很多mk文件,在同一目录下就可以找到,上图中就可以,我们随便打开一个看看

Word 资料

.

这下你们顿时明白了吧,这些资源编译后都去了神马地方

所以,在刚才添加的时候,其实可以直接把声音资源丢到framworks/base/data/sounds这个目录下

然后再mk文件中这样修改:

$(LOCAL_PATH)/:system/etc/

不用我说,当然是执行mmm还有make snod命令了

Word 资料

.

其实还有一种办法,如果你不想这么麻烦,你可以之际把 文件丢到./frameworks/base/core/res/assets/sounds下,用的时候怎么用呢?

加载的时候路径是什么呢?我们看看源码

我们可以看到之前我们修改的那两张图片是怎么被加载进来的

而这个方法的两个参数是:

是不是顿时又明白了?

原来精髓所在是有个Asset可以使用,这个和上层开发中是一样的,这个文件夹中的东西是不编译的。

1 Asset* asset = (name, Asset::ACCESS_BUFFER);

2 if (!asset)

3 return NO_INIT;

4 SkBitmap bitmap;

5 SkImageDecoder::DecodeMemory(asset->getBuffer(false),

Word 资料

.

6 asset->getLength(),

7 &bitmap, SkBitmap::kNo_Config,

8 SkImageDecoder::kDecodePixels_Mode);

asset->close();

delete asset;

所以按照这个方法就可以找到 这个文件了,然后修改下bootMusic的代码就可以了。

——————————————————————————————————————————————————————————————————————————————————

原创文章,转载请注明出处,谢谢。

系统通常默认支持开机动画,开机关机铃声服务倒是预先定义了,不过使用时需要在/sysytem/media/下添加相应的音频文件。长按Power键弹出关键选项,关机时也只是显示进度条,而不是我们期望的关机动画同时伴有关机铃声,当然在做二次开发的时候,这些都是可以定制的。下面将逐步分析如何实现这些定制化的需求。

一. 制作开机动画

开机画面是保存在/system/media的,下面分析系统开机画面的构成

文件名为 一定是这个不能修改,里面包含part1 part2文件夹 和,part 文件夹里面放的是动画拆分的图片,格式为png, 里面是播放的设置。

格式是这样的

480 800 15

p 1 0 part0

p 0 0 part1

Word 资料

.

480 800是指显示的分辨率 宽 高

15是一秒的帧数

p后面的数字是指播放次数 0为循环,N为播放N次

后面那位数字 一般为0(空指令), 表示播放一遍后稍作停顿的时间

part0,part1 为文件夹名

一般我们只使用part0目录

图片准备好了,里面的命令也准备好了,就可以把他们一起打包压缩成zip格式了。记住,是zip格式,而不是rar格式。另外压缩的时候注意一点,压缩的时候压缩方式要选择存储,否则开机时手机会不认的。当然不至于变砖,只是开机的时候会黑着没动画一直到进入桌面为止。

开机动画的替换也很简单,我们把做好的替换掉原来的/system/media/文件即可。关机动画其实和开机动画的制作一样,我们命名为,和放在同一目录下。

二. 开关机动画实现原理

Android系统在中定义了很多Servic,具体定义格式可以参考《Android Platform Developer’s Guide》中的“Android Init Language”。中定义的Service将会被Init进程创建,其中已经定义的服务就包含了开机动画,但没有关机动画的定义

service bootsound /system/bin/mplayer /system/media/bootsound

user media

group audio

oneshot

Word 资料

.

//开机铃声服务 /system/media/startupsound是铃声文件

service startupsound /system/bin/mplayer /system/media/startupsound

user media

group audio

disabled

oneshot

//关机铃声服务 /system/media/shutdownsound是关机铃声

service shutdownsound /system/bin/mplayer /system/media/shutdownsound

user media

group audio

disabled

oneshot

//定义了一个bootanim的服务,对应执行/system/bin/bootanimation

//disabled 表示init进程创建只是创建它,但不立刻执行

//oneshot 表示该服务只执行一次

service bootanim /system/bin/bootanimation

user graphics

group graphics

disabled

oneshot

当android系统boot时,开始加载动画和开机铃声,其代码位于

Word 资料

.

//源文件

status_t SurfaceFlinger::readyToRun() {

// start boot animation service

property_set("", "bootanim");//注

{

char value[PROPERTY_VALUE_MAX];

property_get("", value, "0");

if (atoi(value)== 0){

LOGI("start: is soundable");

// start startupsound service

property_set("","startupsound");//注

} else {

LOGI("start: is silent");

}

}

return NO_ERROR;

}

当Android完成boot后,关闭动画和开机铃声,代码位于

//源文件

void SurfaceFlinger::bootFinished() {

const nsecs_t now = systemTime();

Word 资料

.

const nsecs_t duration = now - mBootTime;

LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );

mBootFinished = true;

//stop bootanim service

property_set("", "bootanim");

char value[PROPERTY_VALUE_MAX];

property_get("", value, "0");

if (atoi(value)== 0){

LOGI("stop: is soundable");

//stop startupsound service

property_set("","startupsound");

} else {

LOGI("stop: is silent");

}

}

如何理解和系统属性?

每一项服务必须在/中定义.Android系统启动时,init守护进程将解析和启动属性服务,属性“ ”和“ ”是用来启动和停止服务的。一旦收到设置“ ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ .<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果。想更深入了解Android property系统可以参考博文《(翻译)Android属性系统》。

Word 资料

.

property_set("",ServiceName);就是启动ServiceName服务(在中定义);

property_set("",ServiceName)相对的是关闭ServiceName服务。

A启动动画服务

由于开机动画和关机动画除了播放的动画文件不同,其他的完全一致,这里重复利用/system/bin/bootanimation代码, 仿照开机动画服务,我们新定义关机动画

service shutdownanim /system/bin/bootanimation -shutdown

user graphics

group graphics

disabled

oneshot

唯一要注意的是关机动画使用的/system/bin/bootanimation带了-shutdown参数,这个参数用来区分加载的动画文件为开机还是关机动画。当bootanimation服务启动时,进入/frameworks/base/cmds/bootanimation/bootanimation_主函数main,

int main(int argc, char** argv)

{

#if defined(HAVE_PTHREADS)

setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);

#endif

char value[PROPERTY_VALUE_MAX];

property_get("animation", value, "0");

Word 资料

.

int noBootAnimation = atoi(value);

LOGI_IF(noBootAnimation, "boot animation disabled");

if (!noBootAnimation) {

sp proc(ProcessState::self());

ProcessState::self()->startThreadPool();

// create the animation object

sp boot = new BootAnimation();

//根据是否有参数,来设置动画对象的isShutdown属性

if (argc > 1) {

if (strcmp(argv[1], "-shutdown")==0) {

boot->isShutdown(true);

}

}

IPCThreadState::self()->joinThreadPool();

}

return 0;

}

new BootAnimation();时,如果有参数-shutdown, 则boot->isShutdown(true);方法isShutdown和isShutdown使我们新加的,所以先要在frameworks/base/cmds/bootanimation/bootanimation/BootAnimation.h头文件中申明为public,如下:

Word 资料

.

class BootAnimation : public Thread, public IBinder::DeathRecipient

{

public:

BootAnimation();

virtual ~BootAnimation();

sp session() const;

bool mShutdown;

void isShutdown(bool shutdown);

…………………………………………….

}

之后修改

//源码位于frameworks/base/cmds/bootanimation/bootanimation/

首先在构造函数中初始化mShutdown = false;表示默认是开机标志

BootAnimation::BootAnimation() : Thread(false)

{

mSession = new SurfaceComposerClient();

mShutdown = false;

}

实现isShutdown(bool shutdown);方法

void BootAnimation::isShutdown(bool shutdown)

{

Word 资料

.

mShutdown = shutdown;

}

修改status_t BootAnimation::readyToRun() 方法来根据mShutdown值加载动画文件,如

status_t BootAnimation::readyToRun() {

……………………………………

mAndroidAnimation = false;

if (!mShutdown) {

status_t err = ("/data/local/");

if (err != NO_ERROR) {

err = ("/system/media/");

if (err != NO_ERROR) {

mAndroidAnimation = true;

}

}

} else {

status_t err = ("/data/local/");

if (err != NO_ERROR) {

err = ("/system/media/");

if (err != NO_ERROR) {

mAndroidAnimation = true;

}

}

mShutdown = false;

Word 资料

.

}

return NO_ERROR;

}

以上是动画定制化C代码部分的全部修改。

B启动开机铃声服务

startupsound开机铃声服务,shutdownsound关机铃声服务

定义,service startupsound /system/bin/mplayer /system/media/startupsound

相当于用/system/bin/mplayer对象播放媒体文件/system/media/startupsound,

定义,service shutdownsound /system/bin/mplayer /system/media/shutdownsound

相当于用/system/bin/mplayer对象播放媒体文件/system/media/ shutdownsound.

到这里,开机动画和开机铃声是正常的,我们还需要修改的是关机时候的执行流程,因为默认的操作时关机确认后显示进度条。

C定制Android关机过程

在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。

我的目标是长按Power键,将会关机,弹出“设备将要关机”选择对话框。如果可以选择“是”关机,和“否”返回系统。

弹出对话框的代码位于:

frameworks

Word 资料

.

长按Power键显示对话框的代码如下:

Runnable mPowerLongPress = new Runnable() {

public void run() {

mShouldTurnOffOnKeyUp = false;

performHapticFeedbackLw(null, _PRESS, false);

sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);

showGlobalActionsDialog();

}

};

调用showGlobalActionsDialog方法将会显示上面提到的显示“飞行模式”,“静音”,“关机”,选项的对话框。

关机的代码位于:

frame

文件的createDialog方法中,有如下代码:

mItems = ayList(

// silent mode

mSilentModeToggle,

// next: airplane mode

mAirplaneModeOn,

// last: power off

new SinglePressAction(

_lock_power_off,

_action_power_off) {

Word 资料

.

public void onPress() {

// shutdown by making sure radio and power are handled accordingly.

wn(mContext, true);

}

public boolean showDuringKeyguard() {

return true;

}

public boolean showBeforeProvisioning() {

return true

}

});

从代码中我们可以看出,如果选择上述对话框的“关机”选项之后,将会调用ShutdownThread的shutdown方法来关机。shutdown方法的第二个参数标识是否弹出询问对话框。

ShutdownThread代码位于

frameworks/base/core/java/com/android/internal/app/

shutdown方法中有如下代码

public static void shutdown(final Context context, boolean confirm) {

// ensure that only one thread is trying to power down.

// any additional calls are just returned

synchronized (sIsStartedGuard){

if (sIsStarted) {

Word 资料

.

Log.d(TAG, "Request to shutdown already running, returning.");

return;

}

}

Log.d(TAG, "Notifying thread to start radio shutdown");

if (confirm) {

final AlertDialog dialog = new r(context)

.setIcon(_dialog_alert)

.setTitle(_off)

.setMessage(wn_confirm)

.setPositiveButton(,

new kListener() {

public void onClick(DialogInterface dialog, int which) {

beginShutdownSequence(context);

}

})

.setNegativeButton(, null)

.create();

dow().setType(_KEYGUARD_DIALOG);

if (!ources().getBoolean(

_sf_slowBlur)) {

Word 资料

.

dow().addFlags(_BLUR_BEHIND);

}

();

} else {

beginShutdownSequence(context);

}

}

确认关机后开始执行beginShutdownSequence(context),这里就是我们定制关机过程的关键。

修改beginShutdownSequence(context)方法,在方法开头打印Log之后增加如下代码:

//我们判断如果有关机动画文件,即显示关机动画,否则显示默认的进度条。

boolean showShutdownAnim = new File("/system/media/").exists();

if (showShutdownAnim) {

Log.d(TAG, "shutdownanim");

//设置前面说的android系统属性,即通知属性服务启动关机动画服务

("", "shutdownanim");

} else {

// throw up an indeterminate system dialog to indicate radio is

// shutting down.

ProgressDialog pd = new ProgressDialog(context);

le(t(_off));

sage(t(wn_progress));

Word 资料

.

eterminate(true);

celable(false);

dow().setType(_KEYGUARD_DIALOG);

if (!ources().getBoolean(

_sf_slowBlur)) {

dow().addFlags(_BLUR_BEHIND);

}

();

}

boolean playShutdownSound = new File("/system/media/shutdownsound").exists();

lean("_shutdownshound", false);

if (playShutdownSound) {

// play shutdown sound

Log.d(TAG, "shutdownsound");

("", "shutdownsound");

}

以上就是定制化实现的所有需要修改的地方,想更深入了解Android property系统可以参考博文《(翻译)Android属性系统。

Word 资料

2024年1月24日发(作者:万问寒)

.

开机画面,按照国际惯例,一般是分为2屏,当然也有3屏的说法,不管怎样,我这里说得就是最后的一屏,按照bootanimation的字面意思翻译,大概也就是开机动画的意思,那这就不说第几屏了,直接用“开机动画”这词。

首先,开机动画的地址:。。。要修改开机动画就是修改bootanimation这个文件。如果说你的手机里没有这个文件,那就是说明你用的是官方原始版本的rom,开机动画没有被修改过,但这不碍事,没有就放一个进去,到时候想换回最原始的开机画面,也可以把bootanimation这个文件删了。官方最原始的开机动画在system etsimages里面,里面主要是2张图片,高手面可以去研究一下,说不定通过这个文件可以用代码实现动画的过程。

接下来,说说这个文件的结构。bootanimation里面主要包含一个以及N个文件夹。而文件夹里面放着的就是你要的开机动画的图片。的作用就是指导系统如何去执行你的开机画面。

下面继续说说这个文档要怎么写。

先看例子,如果我的开机动画要用到2个文件夹,分别是part1和part2,。。。。我希望开机的时候,先把part1里面的图片都播放一遍,然后再循环播放part2里面的文件,直到进入系统。那么文档的内容应该如下:

302 480 5

p 1 0 part1

p 0 0 part2

就这么多,现在解释一下这些命令吧。

Word 资料

.

第一行,320 480是代表你屏幕的分辨率,因为我们的胖6是320*480的,这就不多说了。后面的5是说,5帧每秒,不懂的可以这么理解,5是代表一秒钟播放5张图片。就这么简单。

第二行,p 1 0 part1。p应该是play吧,也就是播放的意思。1是播放一次。0是空指令,就是什么都不做。part1就是说,这条指令是针对part1这个文件夹的。整条指令的意思就是,播放part1里面的图片1次,然后什么都不做,马上进入下一条指令。

第三行,p 0 0 part2。p依然是播放。第一个0这里是代表循环播放,第二个0和上面第二条指令一样,代表什么也不做。part2也就不多说了。

至于为什么第一个0为什么是代表循环,只能这么说,这事国际惯例,就像用迅雷的时候,0代表不限制速度一样,系统规定的,你知道就好,别纠结。

总结公式如下

第一条指令:屏幕的分辨率(空格)播放频率

第二条指令:p(空格)播放次数(空格)后续操作(空格)作用文件夹

第三条指令:同上

第N条指令:同上

屏幕分辨率的格式是:宽(空格)高,胖6的就是320 480。。。播放频率,上面已经说清楚了,至于到底要用多大的数字,视你开机动画的张数而定,比如说,一共有100张图片,开机时间是20秒,那么100/20就是5。

播放次数,1是代表一次,0代表循环播放。如果要播放2次的话,就是就是打个2上去,应该是这样吧,反正我是没试过,只试过0和1.

后续操作,0代表什么都不做,直接进入下一条指令。10是代表稍作停顿。

Word 资料

.

至于文件夹里面的图片,比较简单,首先,纠正一个说法,之前说必须要是png格式,经过我试验证明,jpg格式的也可以,其他的有待试验,不过只支持静态图片这点应该是真的,动态图片同样有待试验。其次,关于图片的尺寸,是不做要求的,只要在txt文档里写好手机的分辨率即可,开机的时候系统会自动适配。其其次要按播放循序命名,建议用5位数字,比如说,第一张图片是00010,第二张就是00020.。。。。为什么要从00010开始,而不是00001?因为这事预防以后要在第一张和第二张中间再插一张图片进去的话,就可以把插进去的图片命名为00011,在00010之后,00020之前。就这么简单。至于图片那里来嘛,当然是自己网上找啦,也可以下载别人的bootanimation,然后修改一下。

最后就是压缩包了,把需要用到的part文件夹跟打包成zip格式,必须是zip,不能是rar,而且打包的时候压缩方式要选择“存储”模式。然后改名成为,复制到SD卡里,再通过RE文件管理器复制到systemmedia下面,重启。

要注意一下,bootanimation不能太大,大了会卡,一般不要超过3M,。

————————————————————————————————————————————————————————————————————————————————————

1. Linux 系统启动,出现Linux小企鹅画面(reboot)(Android 1.5及以上版本已经取消加载图片);

2. Android平台启动初始化,出现"A N D R I O D"文字字样画面;

3. Android平台图形系统启动,出现含闪动的ANDROID字样的动画图片(start)。

现在我们说的是第三种方式(基于模拟器):

android开机动画叫源码位于frameworks/base/cmds/bootanimation下,这个程序会将/data/local/或/system/media/里面的png图片以动画的形式播放出来。

首先,我们先来分析一下源码:

Word 资料

.

frameworks/base/cmds/bootanimation/

首先看一下定义的常量:

#define USER_BOOTANIMATION_FILE "/data/local/"

1

2

3

4

#define SYSTEM_BOOTANIMATION_FILE

"/system/media/"

#define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE

"/system/media/"

BootAnimation::readyToRun()

进入一个if判断语句

1 if ((encryptedAnimation &&

2 (access(SYSTEM_ENCRYPTED_BOOTANIMAT3 ION_FILE, R_OK) == 0) &&

4 ((SYSTEM_ENCRYPTED_BOOTANI5 MATION_FILE) == NO_ERROR)) ||

6

7

R_OK) == 0) &&

8

((USER_BOOTANIMATION_FILE)

9

== NO_ERROR)) ||

1

((access(USER_BOOTANIMATION_FILE,

0 ((access(SYSTEM_BOOTANIMATION_FILE,

Word 资料

.

1R_OK) == 0) &&

1 ((SYSTEM_BOOTANIMATION_FILE)

== NO_ERROR))) {

mAndroidAnimation = false;

}

BootAnimation::threadLoop()

1 if (mAndroidAnimation) {

2 r = Android(); // 执行android字体闪动的图片

3 } else {

4 r = movie(); // 执行中提供的动画图片

5 }

1

==> BootAnimation::Android()会加载"images/"和"images/"

==> BootAnimation::movie()会加载中的内容

我们下载的源码里默认是没有那些个.zip动画的,所以总会跳到android字体闪动的画面

所以如果你系那个用.zip的动画那么把你做好的动画拷贝到编译好对应的目录下即可,然后执行make snod整合进img包就可以看到效果了

如果你想修改android闪动的那两张图片的话,最简单的方法是直接替换图片,如果你懂openGL的话也可以自己做酷炫的动画

Word 资料

.

那两张图片放在./frameworks/base/core/res/assets/images 目录下,一张镂空的android图,一张发光效果,动画效果就是下面那张发光的效果图不断左右移动。

我是用Photoshop直接修改的

修改完后直接替换,然后再 mmm frameworks/base , make snod 即可

以下是我修改后的效果图:

看样子还想那么回事

接下来我们给系统添加开机声音

由于动画是在BootAnimation播放的,所以我们的声音肯定也在这个类中做,照猫画虎

Word 资料

.

首先在BootAnimation.h添加方法的声明和头文件的引用

1

2

#include

#include

添加方法 void bootMusic();

然后在中实现这个方法:

1 void BootAnimation::bootMusic()

2 {

Word 资料

.

3 int index;

4 MediaPlayer* mp = new MediaPlayer();

5 if (mp->setDataSource("/system/etc/", NULL)

6 == NO_ERROR) {

7 mp->setAudioStreamType(AUDIO_STREAM_ENFORCE8 D_AUDIBLE);

9 mp->prepare();

1 }

0 AudioSystem::getStreamVolumeIndex(AUDIO_STREAM_ENFOR1CED_AUDIBLE, &index);

1 if (index != 0) {

1 mp->seekTo(0);

2 mp->start();

1 }

3

14

15

请注意这个目录setDataSource("/system/etc/", NULL)

}

其实这个目录是随便写的,你想从哪个目录读这个文件就从哪个目录读好了,但是你要把这个文件放在对应的目录下

Word 资料

.

比如,这个目录是system/etc (这个目录是android系统的目录,不是源码的目录),这个文件夹是只有读权限而没有写权限的,所有你不用试adb shell了,没用的

其实system/etc这个目录对应的是我们编译后out文件夹下的xxx,然后在system/etc,所以你把放到这里就行了,当然如果你这时再emulaor 也同样是看不到效果的,因为你修改完还没有编译,和上面修改图片一样,make snod一下

然后和图上一样,你就会生成新的,当然你之前添加的也会自动被编译进去了

Word 资料

.

然后再修改bootanimation_这个文件,因为方法也申明了,也实现了,就是还没有调用,所以调用就在这里调

1 //play boot music -yp

2 BootAnimation *animation = new BootAnimation();

3 animation->bootMusic();

Word 资料

.

修改完这写以后还需要修改文件

因为播放声音还需要引入库

LOCAL_SHARED_LIBRARIES :=

libcutils

libutils

libbinder

libui

libskia

libEGL

libGLESv1_CM

Word 资料

.

libgui

libmedia

请注意,libmedia是新添加的;

完事后就ok了,当然还是需要编译的

mmm frameworks/base/cmds/bootanimation/

make snod

大功告成,这样你就成功的添加了开机音乐

也许有人会问,那android系统自带的那些音乐和铃声在什么地方呢?

源码目录在framworks/base/data/sounds

至于编译完成后放到什么地方了那是文件上配置的

不过这里叫

Word 资料

.

我们可以看到他又包含了很多mk文件,在同一目录下就可以找到,上图中就可以,我们随便打开一个看看

Word 资料

.

这下你们顿时明白了吧,这些资源编译后都去了神马地方

所以,在刚才添加的时候,其实可以直接把声音资源丢到framworks/base/data/sounds这个目录下

然后再mk文件中这样修改:

$(LOCAL_PATH)/:system/etc/

不用我说,当然是执行mmm还有make snod命令了

Word 资料

.

其实还有一种办法,如果你不想这么麻烦,你可以之际把 文件丢到./frameworks/base/core/res/assets/sounds下,用的时候怎么用呢?

加载的时候路径是什么呢?我们看看源码

我们可以看到之前我们修改的那两张图片是怎么被加载进来的

而这个方法的两个参数是:

是不是顿时又明白了?

原来精髓所在是有个Asset可以使用,这个和上层开发中是一样的,这个文件夹中的东西是不编译的。

1 Asset* asset = (name, Asset::ACCESS_BUFFER);

2 if (!asset)

3 return NO_INIT;

4 SkBitmap bitmap;

5 SkImageDecoder::DecodeMemory(asset->getBuffer(false),

Word 资料

.

6 asset->getLength(),

7 &bitmap, SkBitmap::kNo_Config,

8 SkImageDecoder::kDecodePixels_Mode);

asset->close();

delete asset;

所以按照这个方法就可以找到 这个文件了,然后修改下bootMusic的代码就可以了。

——————————————————————————————————————————————————————————————————————————————————

原创文章,转载请注明出处,谢谢。

系统通常默认支持开机动画,开机关机铃声服务倒是预先定义了,不过使用时需要在/sysytem/media/下添加相应的音频文件。长按Power键弹出关键选项,关机时也只是显示进度条,而不是我们期望的关机动画同时伴有关机铃声,当然在做二次开发的时候,这些都是可以定制的。下面将逐步分析如何实现这些定制化的需求。

一. 制作开机动画

开机画面是保存在/system/media的,下面分析系统开机画面的构成

文件名为 一定是这个不能修改,里面包含part1 part2文件夹 和,part 文件夹里面放的是动画拆分的图片,格式为png, 里面是播放的设置。

格式是这样的

480 800 15

p 1 0 part0

p 0 0 part1

Word 资料

.

480 800是指显示的分辨率 宽 高

15是一秒的帧数

p后面的数字是指播放次数 0为循环,N为播放N次

后面那位数字 一般为0(空指令), 表示播放一遍后稍作停顿的时间

part0,part1 为文件夹名

一般我们只使用part0目录

图片准备好了,里面的命令也准备好了,就可以把他们一起打包压缩成zip格式了。记住,是zip格式,而不是rar格式。另外压缩的时候注意一点,压缩的时候压缩方式要选择存储,否则开机时手机会不认的。当然不至于变砖,只是开机的时候会黑着没动画一直到进入桌面为止。

开机动画的替换也很简单,我们把做好的替换掉原来的/system/media/文件即可。关机动画其实和开机动画的制作一样,我们命名为,和放在同一目录下。

二. 开关机动画实现原理

Android系统在中定义了很多Servic,具体定义格式可以参考《Android Platform Developer’s Guide》中的“Android Init Language”。中定义的Service将会被Init进程创建,其中已经定义的服务就包含了开机动画,但没有关机动画的定义

service bootsound /system/bin/mplayer /system/media/bootsound

user media

group audio

oneshot

Word 资料

.

//开机铃声服务 /system/media/startupsound是铃声文件

service startupsound /system/bin/mplayer /system/media/startupsound

user media

group audio

disabled

oneshot

//关机铃声服务 /system/media/shutdownsound是关机铃声

service shutdownsound /system/bin/mplayer /system/media/shutdownsound

user media

group audio

disabled

oneshot

//定义了一个bootanim的服务,对应执行/system/bin/bootanimation

//disabled 表示init进程创建只是创建它,但不立刻执行

//oneshot 表示该服务只执行一次

service bootanim /system/bin/bootanimation

user graphics

group graphics

disabled

oneshot

当android系统boot时,开始加载动画和开机铃声,其代码位于

Word 资料

.

//源文件

status_t SurfaceFlinger::readyToRun() {

// start boot animation service

property_set("", "bootanim");//注

{

char value[PROPERTY_VALUE_MAX];

property_get("", value, "0");

if (atoi(value)== 0){

LOGI("start: is soundable");

// start startupsound service

property_set("","startupsound");//注

} else {

LOGI("start: is silent");

}

}

return NO_ERROR;

}

当Android完成boot后,关闭动画和开机铃声,代码位于

//源文件

void SurfaceFlinger::bootFinished() {

const nsecs_t now = systemTime();

Word 资料

.

const nsecs_t duration = now - mBootTime;

LOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );

mBootFinished = true;

//stop bootanim service

property_set("", "bootanim");

char value[PROPERTY_VALUE_MAX];

property_get("", value, "0");

if (atoi(value)== 0){

LOGI("stop: is soundable");

//stop startupsound service

property_set("","startupsound");

} else {

LOGI("stop: is silent");

}

}

如何理解和系统属性?

每一项服务必须在/中定义.Android系统启动时,init守护进程将解析和启动属性服务,属性“ ”和“ ”是用来启动和停止服务的。一旦收到设置“ ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ .<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果。想更深入了解Android property系统可以参考博文《(翻译)Android属性系统》。

Word 资料

.

property_set("",ServiceName);就是启动ServiceName服务(在中定义);

property_set("",ServiceName)相对的是关闭ServiceName服务。

A启动动画服务

由于开机动画和关机动画除了播放的动画文件不同,其他的完全一致,这里重复利用/system/bin/bootanimation代码, 仿照开机动画服务,我们新定义关机动画

service shutdownanim /system/bin/bootanimation -shutdown

user graphics

group graphics

disabled

oneshot

唯一要注意的是关机动画使用的/system/bin/bootanimation带了-shutdown参数,这个参数用来区分加载的动画文件为开机还是关机动画。当bootanimation服务启动时,进入/frameworks/base/cmds/bootanimation/bootanimation_主函数main,

int main(int argc, char** argv)

{

#if defined(HAVE_PTHREADS)

setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);

#endif

char value[PROPERTY_VALUE_MAX];

property_get("animation", value, "0");

Word 资料

.

int noBootAnimation = atoi(value);

LOGI_IF(noBootAnimation, "boot animation disabled");

if (!noBootAnimation) {

sp proc(ProcessState::self());

ProcessState::self()->startThreadPool();

// create the animation object

sp boot = new BootAnimation();

//根据是否有参数,来设置动画对象的isShutdown属性

if (argc > 1) {

if (strcmp(argv[1], "-shutdown")==0) {

boot->isShutdown(true);

}

}

IPCThreadState::self()->joinThreadPool();

}

return 0;

}

new BootAnimation();时,如果有参数-shutdown, 则boot->isShutdown(true);方法isShutdown和isShutdown使我们新加的,所以先要在frameworks/base/cmds/bootanimation/bootanimation/BootAnimation.h头文件中申明为public,如下:

Word 资料

.

class BootAnimation : public Thread, public IBinder::DeathRecipient

{

public:

BootAnimation();

virtual ~BootAnimation();

sp session() const;

bool mShutdown;

void isShutdown(bool shutdown);

…………………………………………….

}

之后修改

//源码位于frameworks/base/cmds/bootanimation/bootanimation/

首先在构造函数中初始化mShutdown = false;表示默认是开机标志

BootAnimation::BootAnimation() : Thread(false)

{

mSession = new SurfaceComposerClient();

mShutdown = false;

}

实现isShutdown(bool shutdown);方法

void BootAnimation::isShutdown(bool shutdown)

{

Word 资料

.

mShutdown = shutdown;

}

修改status_t BootAnimation::readyToRun() 方法来根据mShutdown值加载动画文件,如

status_t BootAnimation::readyToRun() {

……………………………………

mAndroidAnimation = false;

if (!mShutdown) {

status_t err = ("/data/local/");

if (err != NO_ERROR) {

err = ("/system/media/");

if (err != NO_ERROR) {

mAndroidAnimation = true;

}

}

} else {

status_t err = ("/data/local/");

if (err != NO_ERROR) {

err = ("/system/media/");

if (err != NO_ERROR) {

mAndroidAnimation = true;

}

}

mShutdown = false;

Word 资料

.

}

return NO_ERROR;

}

以上是动画定制化C代码部分的全部修改。

B启动开机铃声服务

startupsound开机铃声服务,shutdownsound关机铃声服务

定义,service startupsound /system/bin/mplayer /system/media/startupsound

相当于用/system/bin/mplayer对象播放媒体文件/system/media/startupsound,

定义,service shutdownsound /system/bin/mplayer /system/media/shutdownsound

相当于用/system/bin/mplayer对象播放媒体文件/system/media/ shutdownsound.

到这里,开机动画和开机铃声是正常的,我们还需要修改的是关机时候的执行流程,因为默认的操作时关机确认后显示进度条。

C定制Android关机过程

在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。

我的目标是长按Power键,将会关机,弹出“设备将要关机”选择对话框。如果可以选择“是”关机,和“否”返回系统。

弹出对话框的代码位于:

frameworks

Word 资料

.

长按Power键显示对话框的代码如下:

Runnable mPowerLongPress = new Runnable() {

public void run() {

mShouldTurnOffOnKeyUp = false;

performHapticFeedbackLw(null, _PRESS, false);

sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);

showGlobalActionsDialog();

}

};

调用showGlobalActionsDialog方法将会显示上面提到的显示“飞行模式”,“静音”,“关机”,选项的对话框。

关机的代码位于:

frame

文件的createDialog方法中,有如下代码:

mItems = ayList(

// silent mode

mSilentModeToggle,

// next: airplane mode

mAirplaneModeOn,

// last: power off

new SinglePressAction(

_lock_power_off,

_action_power_off) {

Word 资料

.

public void onPress() {

// shutdown by making sure radio and power are handled accordingly.

wn(mContext, true);

}

public boolean showDuringKeyguard() {

return true;

}

public boolean showBeforeProvisioning() {

return true

}

});

从代码中我们可以看出,如果选择上述对话框的“关机”选项之后,将会调用ShutdownThread的shutdown方法来关机。shutdown方法的第二个参数标识是否弹出询问对话框。

ShutdownThread代码位于

frameworks/base/core/java/com/android/internal/app/

shutdown方法中有如下代码

public static void shutdown(final Context context, boolean confirm) {

// ensure that only one thread is trying to power down.

// any additional calls are just returned

synchronized (sIsStartedGuard){

if (sIsStarted) {

Word 资料

.

Log.d(TAG, "Request to shutdown already running, returning.");

return;

}

}

Log.d(TAG, "Notifying thread to start radio shutdown");

if (confirm) {

final AlertDialog dialog = new r(context)

.setIcon(_dialog_alert)

.setTitle(_off)

.setMessage(wn_confirm)

.setPositiveButton(,

new kListener() {

public void onClick(DialogInterface dialog, int which) {

beginShutdownSequence(context);

}

})

.setNegativeButton(, null)

.create();

dow().setType(_KEYGUARD_DIALOG);

if (!ources().getBoolean(

_sf_slowBlur)) {

Word 资料

.

dow().addFlags(_BLUR_BEHIND);

}

();

} else {

beginShutdownSequence(context);

}

}

确认关机后开始执行beginShutdownSequence(context),这里就是我们定制关机过程的关键。

修改beginShutdownSequence(context)方法,在方法开头打印Log之后增加如下代码:

//我们判断如果有关机动画文件,即显示关机动画,否则显示默认的进度条。

boolean showShutdownAnim = new File("/system/media/").exists();

if (showShutdownAnim) {

Log.d(TAG, "shutdownanim");

//设置前面说的android系统属性,即通知属性服务启动关机动画服务

("", "shutdownanim");

} else {

// throw up an indeterminate system dialog to indicate radio is

// shutting down.

ProgressDialog pd = new ProgressDialog(context);

le(t(_off));

sage(t(wn_progress));

Word 资料

.

eterminate(true);

celable(false);

dow().setType(_KEYGUARD_DIALOG);

if (!ources().getBoolean(

_sf_slowBlur)) {

dow().addFlags(_BLUR_BEHIND);

}

();

}

boolean playShutdownSound = new File("/system/media/shutdownsound").exists();

lean("_shutdownshound", false);

if (playShutdownSound) {

// play shutdown sound

Log.d(TAG, "shutdownsound");

("", "shutdownsound");

}

以上就是定制化实现的所有需要修改的地方,想更深入了解Android property系统可以参考博文《(翻译)Android属性系统。

Word 资料

发布评论

评论列表 (0)

  1. 暂无评论