Android O 8.0 自定义开机动画/开机铃声

1.  制作bootanimation.zip

参考解压的一个bootanimation.zip, 里面有两个文件夹一个desc.txt描述文件

两个文件夹都是开机动画的图片,desc.txt:

1080 1920 10

p 1 0 part1

p 0 0 part2

1080 1920 为分辨率, 10表示10帧每秒

p 1 0 part1 :p就是play。1是播放一次,0是无限次。0代表阶段间隔帧数为0,也就是帧动画形式播放图片。part1指定了要播放的第一个文件夹为part1(也可以取别的名称,做相应修改即可)

p  0  0  part2:第一个0表示循环播放。第二个0表示每张图片间隔帧数为0(和上面指令一样)。part2表示要循环播放的文件夹

将制作好的文件打包成bootanimation.zip即可,注意:必须是zip格式,且包的大小最好不要超过3M。然后放入/system/media/目录下即可。

最近在制作开机动画过程中发现添加开机动画后其一直不能显示,经过千辛万苦的寻找最终得出如下结论:

开机动画zip的压缩尽量在linux环境下进行,在windows或者ubuntu的UI界面下压缩 bootanimation.zip可能会造成开机动画不能显示,在linux下,进入素材目录,执行压缩命令:

zip-Z store bootanimation.zip part0/*.pngpart1/*.pngdesc.txt

Windows下打包ZIP也需要进入素材目录。例如:选中part0,part1,desc.txt三个文件,右键选择”添加到压缩文件”,选择”ZIP”压缩,“存储”模式即可。

2. 定制到系统

开机动画一般放在系统 device/xx/xx/media/bootanimation.zip,并且要在具体的项目mk文件中声明:

PRODUCT_COPY_FILES += device/xxx/$(TARGET_PRODUCT)/media/bootanimation.zip:system/media/bootanimation.zip

我们可以看出这句配置的目的是把bootanimation.zip拷贝到系统system/meida目录下.

3. 跟踪源码

surfaceflinger.rc 下启动surfaceflinger

service surfaceflinger /system/bin/surfaceflinger

-------------------------------------------------------------------------------------------------------------------

SurfaceFlinger.cpp启动动画

startBootAnim() -> mStartPropertySetThread->Start();

/frameworks/native/services/surfaceflinger/StartPropertySetThread.cpp

bool StartPropertySetThread::threadLoop() {

    // Set property service.sf.present_timestamp, consumer need check its readiness

    property_set(kTimestampProperty, mTimestampPropertyValue ? "1" : "0");

    // Clear BootAnimation exit flag

    property_set("service.bootanim.exit", "0");

    // Start BootAnimation if not started

    property_set("ctl.start", "bootanim");

    // Exit immediately

    return false;

}

其中先将”service.bootanim.exit”标志为 0,这个标志用于在bootanim进程中检测开机动画是否结束,

然后通过发”ctl.start”请求给init进程,启动”bootanim”服务.

-------------------------------------------------------------------------------------------------------------------

frameworks/base/cmds/bootanimation/bootanimation_main.cpp 中的main函数启动BootAnimation.cpp

onFirstRef -> readyToRun

在readyToRun 中 会有获取动画的判断 getAnimationFileName

/** Get bootup Animation File

* Parameter:

* 1.defaultfile: system default media file

* 2.isShutdown : is shutdown or boot status

* Return Value : Animation File path

**/

const char *BootAnimation::getAnimationFileName(const char * defaultfile,bool isShutdown)

{

    // Load animations of Carrier through regionalization environment

    if (Environment::isSupported()) {

        Environment* environment = new Environment();

        int isShutdownState = Environment::BOOT_STATUS;

        if (isShutdown) {

          isShutdownState = Environment::SHUTDOWN_STATUS;

        }

        const char* animFile = environment->getMediaFile(

                Environment::ANIMATION_TYPE, isShutdownState);

        ALOGE("Get Carrier Animation type: %d,status:%d", Environment::ANIMATION_TYPE,isShutdown);

        if (animFile != NULL && strcmp(animFile, "") != 0) {

          return animFile;

        }else{

          ALOGD("Get Carrier Animation file: %s failed", animFile);

        }

        delete environment;

    }

    return defaultfile;

}

-------------------------------------------------------------------------------------------------------------------

继续跟踪 environment->getMediaFile

在frameworks/base/libs/regionalization/Environment.cpp 我们发现 getMediaFile方法中的BOOT_SHUTDOWN_FILE 常量

static const char* BOOT_SHUTDOWN_FILE[2][2] = {

        {"/system/media/bootanimation.zip", "/system/media/shutdownanimation.zip"},

        {"/system/media/boot.wav", "/system/media/shutdown.wav"} };

就是我们对应的配置。

-------------------------------------------------------------------------------------------------------------------

后续就是对动画的播放BootAnimation.threadLoop 当mZipFileName

if(mZipFileName.isEmpty()) {

      r = android(); //播放Android系统默认的开机动画

  }

android() 播放的是系统原生动画,“android”字样加上不断移动的光影效果。

movie() 则是读取bootanimation.zip 中的帧动画,一张一张的轮播,形成动画效果。

检测到 “service.bootanim.exit” 的值被修改成1 之后,就调用 requestExit() 结束动画

期间会走到wms的enableScreenAfterBoot() ,最后调用SurfaceFlinger::bootFinished()完成开机.

---------------------------------------------分割线--------------------------------------------------

最近又多了一些增加开机铃声的需求。

这个有多种改法:1.自己添加播放 2直接使用bootAnimation

第二种比较简单:

首先我们要看下 frameworks/base/cmds/bootanimation这个目录:


我们需要添加一个audio.wav 的开机铃声.

把它放在bootanimation/part0/ 中, 然后在bootanimation/中执行打包命令:

zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip *.txt part*

会生成一个bootanimation.zip然后执行

adb push bootanimation.zip /system/media

这些东西可以参考FORMAT.md 这个文件。

如果直接用的话,上述步骤已经足够,参考代码给个传送门:

https://download.csdn.net/download/zghlezh/10474732

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容