Android 9.0 开关机动画流程分析
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方法主要是传递资源路径,然后调用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 }
注意:开机动画资源制作成zip包的时候,压缩方式要注意一下,必须用存储的方式进行压缩,其他方式都不行,不然会导致无法正确读取desc.txt的资源而出现开机动画crash的情况,如下:
参考资料:https://blog.csdn.net/wangjun7121/article/details/88141376
Android 9.0 开关机动画流程分析相关推荐
- MTK Android 13平台开关机动画铃声客制化
MTK Android 13平台开关机动画铃声客制化 Android T和S的差异很大 主要是MtkShutdownThread.java和ShutdownThread.java差异 未完,待更新,填 ...
- MTK平台Android 12自定义开关机动画铃声
完整的patch见 https://download.csdn.net/download/a785722173/87036230 修改文件和Q平台大同小异 Android Q自定义开关机动画_a785 ...
- mtk使用android开关机动画,android MTK修改开关机动画
一丶修改开机logo ① device/tangxun/tx6580_weg_m/ProjectConfig.mk 中BOOT_LOGO=hd720 可知开机的图标在hd720文件夹中(这个需要 ...
- Android 7.0 挂断电话流程分析
1.图形显示 挂断电话分为本地挂断和远程对方挂断 2.本地挂断 1).点击按钮 先看按键的监听事件 CallCardFragment.java 中有对按钮的监听事件 @Overridepublic v ...
- Android 10.0添加关机动画和关机音乐
最近客户提出要添加关机动画和关机音乐的需求,于是就来实现这一需求,和开机动画开机音乐一样要添加资源 先看BootAnimation.cpp来分析源码 frameworks\base\cmds\boot ...
- Android 7.0 APN 拨号上网流程分析
1.前言 在前段时间的项目中遇到客户的设备出现APN断开的情况没有自动连接,后来折腾了一段时间解决了这个问题.现在用这篇博客记录一下APN的选择和连接流程. 2.名词解析 APN:APN指一种网络接入 ...
- Android 9.0 SystemUI 锁屏流程分析
1.锁屏界面显示的流程 2.按键灭屏 -> 按键亮屏 对于Key事件,InputDispatcher在分发之前会先将事件上发到PhoneWindowManager中,可以进行拦截,故从Phone ...
- Android 8.0 开机动画,RK3326 android10.0(Q) 开机logo+开关机动画替换
RK3326 android10.0(Q) 开机logo+开关机动画替换 2020年08月14日 | 萬仟网移动技术 | 我要评论 开机logouboot和kernel阶段的logo分别为开机显示的第 ...
- android 开关机动画
开机画面,按照国际惯例,一般是分为2屏,当然也有3屏的说法,不管怎样,我这里说得就是最后的一屏,按照bootanimation的字面意思翻译,大概也就是开机动画的意思,那这就不说第几屏了,直接用&qu ...
最新文章
- 美国计划让“人工智能”去搜寻外星人!
- 最近学习的 Node.js 之 http
- easyui js解析字符串_easyui的解析器Parser
- python 数据分析基础 day1-初窥内容
- 同一交换机的不同VLAN如何隔离?
- (X)HTML嵌套规则
- python判断字符串长度_Python|判断字符串是否符合日期要求
- 热式气体质量流量计检定规程_宁夏热式气体质量流量计价位,玻璃管液位计怎么样...
- python 无头浏览器_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...
- tf 矩阵行和列交换_tf.transpose函数的用法讲解
- python修改系统环境变量_Python实战—修改环境变量
- Bayes‘ theorem贝叶斯定理(基础理论+心理学小例子)
- selenium模拟登录163邮箱
- jdon(jdong)
- 网格化运维标书_运维网格化管理.ppt
- 文化袁探索专栏——消息分发机制
- Python 外星人入侵游戏(一):武装飞船(上)
- 中金公司:券商IT广阔天际 明月不出群星闪耀
- python泰坦尼克号案例分析_泰坦尼克Python经典案例
- 联想拯救者y7000充电一闪一闪,接触不良
热门文章
- 三元简化模型,助你加速团队成长
- PS改变图片像素大小(一寸照片变二寸)
- 全球与中国高尔夫旅游市场现状及未来发展趋势
- QPluginLoader 加载插件dll失败
- Windows 安装 Windows 版 iCloud 之后我的电脑里多了个 iCloud 照片图标
- mysql mmm 测试_mysql-mmm有关mmm_control 参数测试
- 照身帖、密钥,看古代人做实名认证有哪些招数?
- 舆情总结汇报撰写范文模板格式详介
- 启动jenkins解锁后,报错“Failed to update the default Update Site 'default'”
- 表白网页自助申请系统