Android开机动画流程的启动主要是在Surfaseflinger里面完成的,具体代码如下:

/frameworks/native/services/surfaceflinger/StartPropertySetThread.cpp32  bool StartPropertySetThread::threadLoop() {
33      // Set property service.sf.present_timestamp, consumer need check its readiness
34      property_set(kTimestampProperty, mTimestampPropertyValue ? "1" : "0");
35      // Clear BootAnimation exit flag
36      property_set("service.bootanim.exit", "0");
37      // Start BootAnimation if not started
38      property_set("ctl.start", "bootanim");

通过property_set("ctl.start", "bootanim");启动bootanim服务,启动服务的过程不做详细介绍,可以参考链接:

https://blog.csdn.net/zcyxiaxi/article/details/79159094

bootanim服务会启动开机动画的二进制执行文件,代码目录位于

/frameworks/base/cmds/bootanimation/bootanim.rc1 service bootanim /system/bin/bootanimation
2     class core animation
3     user graphics
4     group graphics audio
5     disabled
6     oneshot
7     writepid /dev/stune/top-app/tasks

主要执行代码在/frameworks/base/cmds/bootanimation/BootAnimation.cpp文件中。

  bool BootAnimation::threadLoop()
358  {
359      bool r;
360      // We have no bootanimation file, so we use the stock android logo
361      // animation.
362      if (mZipFileName.isEmpty()) {
363          r = android();
364      } else {
365          r = movie();
366      }

该方法判断mZipFileName内容是否为空,如果为空的话,就会执行android()方法走原生开机动画流程,原生开机动画是通过在界面上加载字符的方式实现的, 如果不为空的话就会走如下流程:

 bool BootAnimation::movie()
817  {
818      Animation* animation = loadAnimation(mZipFileName);
..........
playAnimation(*animation);
.........
881      releaseAnimation(animation);
882
883      if (clockFontInitialized) {
884          glDeleteTextures(1, &animation->clockFont.texture.name);
885      }
886
887      return false;
888  }

先通过loadAnimation(mZipFileName)加载开机动画资源,然后playAnimation(*animation);播放开机动画,播放完以后通过releaseAnimation(animation);释放资源。

loadAnimation方法主要是传递资源路径,然后调用parseAnimationDesc方法处理动画资源,内容如下:

648  bool BootAnimation::parseAnimationDesc(Animation& animation)
649  {
650      String8 desString;
651
652      if (!readFile(animation.zip, "desc.txt", desString)) {//读取zip格式中的desc.txt内容并将值放到desString中,如果读取失败直接返回false。
653          return false;
654      }
655      char const* s = desString.string();
656
657      // Parse the description file
658      for (;;) {//for循环用来按行去读desc.txt里面的内容。
659          const char* endl = strstr(s, "\n");//搜索s字符串里面的话换行符,如果没有换行符的话直接返回NULL,搜索到换行符以后将返回换行符开始到字符串结尾的内容。
660          if (endl == NULL) break;
661          String8 line(s, endl - s);
662          const char* l = line.string();
663          int fps = 0;
664          int width = 0;
665          int height = 0;
666          int count = 0;
667          int pause = 0;
668          char path[ANIM_ENTRY_NAME_MAX];
669          char color[7] = "000000"; // default to black if unspecified
670          char clockPos1[TEXT_POS_LEN_MAX + 1] = "";
671          char clockPos2[TEXT_POS_LEN_MAX + 1] = "";
672  //将资源文件内读到的配置文件赋值到animation中。
673          char pathType;
674          if (sscanf(l, "%d %d %d", &width, &height, &fps) == 3) {
675              // ALOGD("> w=%d, h=%d, fps=%d", width, height, fps);
676              animation.width = width;
677              animation.height = height;
678              animation.fps = fps;
679          } else if (sscanf(l, " %c %d %d %s #%6s %16s %16s",
680                            &pathType, &count, &pause, path, color, clockPos1, clockPos2) >= 4) {
681              //ALOGD("> type=%c, count=%d, pause=%d, path=%s, color=%s, clockPos1=%s, clockPos2=%s",
682              //    pathType, count, pause, path, color, clockPos1, clockPos2);
683              Animation::Part part;
684              part.playUntilComplete = pathType == 'c';
685              part.count = count;
686              part.pause = pause;
687              part.path = path;
688              part.audioData = NULL;
689              part.animation = NULL;
690              if (!parseColor(color, part.backgroundColor)) {
691                  ALOGE("> invalid color '#%s'", color);
692                  part.backgroundColor[0] = 0.0f;
693                  part.backgroundColor[1] = 0.0f;
694                  part.backgroundColor[2] = 0.0f;
695              }
696              parsePosition(clockPos1, clockPos2, &part.clockPosX, &part.clockPosY);
697              animation.parts.add(part);
698          }
699          else if (strcmp(l, "$SYSTEM") == 0) {
700              // ALOGD("> SYSTEM");
701              Animation::Part part;
702              part.playUntilComplete = false;
703              part.count = 1;
704              part.pause = 0;
705              part.audioData = NULL;
706              part.animation = loadAnimation(String8(SYSTEM_BOOTANIMATION_FILE));
707              if (part.animation != NULL)
708                  animation.parts.add(part);
709          }
710          s = ++endl;//每次循环删除字符串第一行
711      }
712
713      return true;
714  }

文件desc.txt的内容格式如下面的例子所示:
                                                                600 480 24  
                                                                p   1   0   part1  
                                                                p   0   10  part2  
                                                                
第一行的三个数字分别表示开机动画在屏幕中的显示宽度、高度以及帧速(fps)。剩余的每一行都用来描述一个动画片断,
这些行必须要以字符“p”来开头,后面紧跟着两个数字以及一个文件目录路径名称。第一个数字表示一个片断的循环显示次数,
如果它的值等于0,那么就表示无限循环地显示该动画片断。第二个数字表示每一个片断在两次循环显示之间的时间间隔。这个时间间隔是以一个帧的时间为单位的。文件目录下面保存的是一系列png文件,这些png文件会被依次显示在屏幕中。
       
        以上面这个desct.txt文件的内容为例:                                                            
它描述了一个大小为600 x 480的开机动画,动画的显示速度为24帧每秒。这个开机动画包含有两个片断 part1 和 part2。片断part1只显示一次,它对应的png图片保存在目录part1中。片断part2无限循环地显示,其中,每两次循环显示的时间间隔为10 x (1 / 24)秒,它对应的png图片保存在目录part2中。

注意:开机动画资源制作成zip包的时候,压缩方式要注意一下,必须用存储的方式进行压缩,其他方式都不行,不然会导致无法正确读取desc.txt的资源而出现开机动画crash的情况,如下:

参考资料:https://blog.csdn.net/wangjun7121/article/details/88141376

Android 9.0 开关机动画流程分析相关推荐

  1. MTK Android 13平台开关机动画铃声客制化

    MTK Android 13平台开关机动画铃声客制化 Android T和S的差异很大 主要是MtkShutdownThread.java和ShutdownThread.java差异 未完,待更新,填 ...

  2. MTK平台Android 12自定义开关机动画铃声

    完整的patch见 https://download.csdn.net/download/a785722173/87036230 修改文件和Q平台大同小异 Android Q自定义开关机动画_a785 ...

  3. mtk使用android开关机动画,android MTK修改开关机动画

    一丶修改开机logo ① device/tangxun/tx6580_weg_m/ProjectConfig.mk   中BOOT_LOGO=hd720  可知开机的图标在hd720文件夹中(这个需要 ...

  4. Android 7.0 挂断电话流程分析

    1.图形显示 挂断电话分为本地挂断和远程对方挂断 2.本地挂断 1).点击按钮 先看按键的监听事件 CallCardFragment.java 中有对按钮的监听事件 @Overridepublic v ...

  5. Android 10.0添加关机动画和关机音乐

    最近客户提出要添加关机动画和关机音乐的需求,于是就来实现这一需求,和开机动画开机音乐一样要添加资源 先看BootAnimation.cpp来分析源码 frameworks\base\cmds\boot ...

  6. Android 7.0 APN 拨号上网流程分析

    1.前言 在前段时间的项目中遇到客户的设备出现APN断开的情况没有自动连接,后来折腾了一段时间解决了这个问题.现在用这篇博客记录一下APN的选择和连接流程. 2.名词解析 APN:APN指一种网络接入 ...

  7. Android 9.0 SystemUI 锁屏流程分析

    1.锁屏界面显示的流程 2.按键灭屏 -> 按键亮屏 对于Key事件,InputDispatcher在分发之前会先将事件上发到PhoneWindowManager中,可以进行拦截,故从Phone ...

  8. Android 8.0 开机动画,RK3326 android10.0(Q) 开机logo+开关机动画替换

    RK3326 android10.0(Q) 开机logo+开关机动画替换 2020年08月14日 | 萬仟网移动技术 | 我要评论 开机logouboot和kernel阶段的logo分别为开机显示的第 ...

  9. android 开关机动画

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

最新文章

  1. 美国计划让“人工智能”去搜寻外星人!
  2. 最近学习的 Node.js 之 http
  3. easyui js解析字符串_easyui的解析器Parser
  4. python 数据分析基础 day1-初窥内容
  5. 同一交换机的不同VLAN如何隔离?
  6. (X)HTML嵌套规则
  7. python判断字符串长度_Python|判断字符串是否符合日期要求
  8. 热式气体质量流量计检定规程_宁夏热式气体质量流量计价位,玻璃管液位计怎么样...
  9. python 无头浏览器_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...
  10. tf 矩阵行和列交换_tf.transpose函数的用法讲解
  11. python修改系统环境变量_Python实战—修改环境变量
  12. Bayes‘ theorem贝叶斯定理(基础理论+心理学小例子)
  13. selenium模拟登录163邮箱
  14. jdon(jdong)
  15. 网格化运维标书_运维网格化管理.ppt
  16. 文化袁探索专栏——消息分发机制
  17. Python 外星人入侵游戏(一):武装飞船(上)
  18. 中金公司:券商IT广阔天际 明月不出群星闪耀
  19. python泰坦尼克号案例分析_泰坦尼克Python经典案例
  20. 联想拯救者y7000充电一闪一闪,接触不良

热门文章

  1. 三元简化模型,助你加速团队成长
  2. PS改变图片像素大小(一寸照片变二寸)
  3. 全球与中国高尔夫旅游市场现状及未来发展趋势
  4. QPluginLoader 加载插件dll失败
  5. Windows 安装 Windows 版 iCloud 之后我的电脑里多了个 iCloud 照片图标
  6. mysql mmm 测试_mysql-mmm有关mmm_control 参数测试
  7. 照身帖、密钥,看古代人做实名认证有哪些招数?
  8. 舆情总结汇报撰写范文模板格式详介
  9. 启动jenkins解锁后,报错“Failed to update the default Update Site 'default'”
  10. 表白网页自助申请系统