1. system进程在启动过程中会调用SurfaceFlinger类的静态成员函数instantiate来启动SurfaceFlinger服务。启动过程中,首先创建一个SurfaceFlinger实例,此实例会被一个SP 指针引用。当一个对象被一个智能指针第一次引用的时候,该类的onFirstRef方法将被调用:

void SurfaceFlinger::onFirstRef()

{

mEventQueue.init(this);

}

2. SurfaceFlinger类继承自Thread类,因此当它的run方法被调用的时候,系统就会创建一个新的线程。这个线程在第一次运行之前,会调用该类的readToRun方法。并且调用mReadyToRunBarrier的wait让主线程(init进程)处于等待状态。readyToRun方法会进行主屏幕以及openGL库的初始化,完成后会调用mReadyToRunBarrier的open来唤醒主线程。紧接着开始启动动画:

void SurfaceFlinger::startBootAnim() {

// start boot animation

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

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

}

3. 当系统属性发生改变时,init进程就会收到一个系统属性变化的通知,这个通知最终由在init进程中的函数handle_property_set_fd来处理。由于此系统属性是以ctrl.开头的控制类型的属性,因此当属性变更时会启动一个名字为“bootanim”的服务。通过这个名字,可以找到对应的应用程序为/system/bin/bootanimation。于是应用程序的入口函数main函数将被调用:

int main()

{

setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_DISPLAY);

char value[PROPERTY_VALUE_MAX];

property_get("debug.sf.nobootanimation", value, "0");

int noBootAnimation = atoi(value);

ALOGI_IF(noBootAnimation, "boot animation disabled");

if (!noBootAnimation) {

sp proc(ProcessState::self());

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

// create the boot animation object

sp boot = new BootAnimation();

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

}

return 0;

}

4. 由于BootAnimation对象在显示动画时需要与SurfaceFlinger服务通信,因此,应用程序bootanimation就需要启动一个binder线程池。当一个BootAnimation对象第一个被一个只能智能指针引用的时候,BootAnimation的onFirstRef方法将被调用:

void BootAnimation::onFirstRef() {

status_t err = mSession->linkToComposerDeath(this);

ALOGE_IF(err, "linkToComposerDeath failed (%s) ", strerror(-err));

if (err == NO_ERROR) {

run("BootAnimation", PRIORITY_DISPLAY);

}

}

在init.rc中声明的服务此时将被启动

service bootanim /system/bin/bootanimation

class core

user graphics

group graphics audio

disabled

oneshot

5. BootAnimation类继承自Thread类,当它的run方法被调用时,将会调用该类的readToRun方法。在/data/local/bootanimation.zip、/system/media/bootanimation.zip、/system/media/bootanimation-encrypted.zip(加密动画)查找是否存在相应的动画压缩包,若存在则使用用户自定义的动画,否则使用android默认的开机动画

status_t BootAnimation::readyToRun() {

mAssets.addDefaultAssets();

.......

.......

.......

if (encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0)) {

mZipFileName = SYSTEM_ENCRYPTED_BOOTANIMATION_FILE;

}

else if (access(OEM_BOOTANIMATION_FILE, R_OK) == 0) {

mZipFileName = OEM_BOOTANIMATION_FILE;

}

else if (access(USER_BOOTANIMATION_FILE, R_OK) == 0) {

mZipFileName = USER_BOOTANIMATION_FILE;

}

else if (access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) {

mZipFileName = SYSTEM_BOOTANIMATION_FILE;

}

return NO_ERROR;

}

6. 当线程准备好运行时,其threadLoop方法会被调用,完整动画zip的解析显示。

7. 停止动画。当系统启动完成时,会调用SurfaceFlinger中的bootFinished方法,通过设定系统参数的方式结束动画的播放

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

android 9.0 开机动画,Android bootanim开机动画启动流程相关推荐

  1. Android 8.0系统学习(19)--- SystemUI启动流程

    Android 8.0系统学习(19)--- SystemUI启动流程 systemui属于系统级应用,在开机过程中就会启动.具体来讲是在SystemServer进程中startOtherServic ...

  2. android AVB2.0(三)Init阶段安全启动流程

    概要 前提: 本篇android AVB2.0学习总结系统的第三篇,前面两篇分别介绍了AVB2.0的配置,和Uboot中的AVB校验流程. 本篇将介绍Android Init阶段如何校验,以及相关会涉 ...

  3. Android 系统(169)---Android 7.0 插卡后APN信息的加载流程

    Android 7.0 插卡后APN信息的加载流程.UI界面编辑APN的流程及Android中APN配置相关的漏洞 终端中有一个apns-config.xml文件,负责定义各个运营商规定的默认APN参 ...

  4. android ramdisk.img 编译,韦东山-tiny4412(android 5.0.2)编译生成的 ramdisk.img 无法启动 - 百问网嵌入式问答社区...

    tiny4412(android 5.0.2)编译生成的 ramdisk.img 无法启动 [    3.760726] dm962x:  [Analysis.2] 0xF2, D[5] 0 EP1: ...

  5. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(中)

    目录 一.背景 1.1.刷新的整体调用流程 1.2.本文解读范围 二.调用后处理器 2.1.调用在上下文中注册为beanFactory的后置处理器 2.2.invokeBeanFactoryPostP ...

  6. Alian解读SpringBoot 2.6.0 源码(七):启动流程分析之准备应用上下文

    目录 一.背景 1.1.run方法整体流程 1.2.本文解读范围 二.准备应用上下文 2.1.整体流程 2.2.设置环境 2.3.应用上下文进行后置处理 2.4.应用所有初始化器 2.5.发布应用上下 ...

  7. Alian解读SpringBoot 2.6.0 源码(十):启动流程之自动装配原理

    目录 一.背景 1.1.主类的加载 1.2.后置处理器的获取 二.配置类后处理器 2.1.获取配置类 2.2. 2.3.解析主类 2.3.1.整体解析过程 2.3.2.核心解析过程 2.3.3.延迟导 ...

  8. Alian解读SpringBoot 2.6.0 源码(六):启动流程分析之创建应用上下文

    目录 一.背景 1.1.run方法整体流程 1.2.本文解读范围 二.创建应用上下文 2.1.初始化入口 2.2.初始化AbstractApplicationContext 2.3.初始化Generi ...

  9. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(下)

    目录 一.背景 1.1.刷新的整体调用流程 1.2.本文解读范围 二.初始化特定上下文子类中的其他特殊bean 2.1.初始化主体资源 2.2.创建web服务 三.检查监听器bean并注册它们 四.实 ...

  10. Alian解读SpringBoot 2.6.0 源码(九):启动流程分析之应用上下文刷新后处理(启动完成事件,Runner运行器,就绪事件)

    目录 一.背景 1.1.run方法整体流程 1.2.本文解读范围 二.应用上下文刷新后置处理 三.时间信息.输出日志记录执行主类名 四.发布应用上下文启动完成事件 4.1.ApplicationSta ...

最新文章

  1. 细粒度语义分割:ICCV2019论文解析
  2. [codevs 1904] 最小路径覆盖问题
  3. Android WebRTC视频旋转问题
  4. disconf(二):服务端使用总结
  5. 2019年java安装步骤_win10的JAVA(jdk)2020年最新版安装教程心得
  6. WPF 开源项目 【watcher】 守望者,一款监控,统计,分析你每天在自己电脑上究竟干了什么的软件...
  7. Tcl8.6原生支持oop了
  8. html中div的居中
  9. 极域课堂管理系统软件V6.0 2016 豪华版
  10. 计算机教案.doc免费,TOP16[定稿]计算机基础教案33412.doc文档免费在线阅读
  11. 社招的我,在酷家乐的野蛮生长
  12. python读写文件——文件指针操作
  13. 贪心算法之田忌赛马问题
  14. 程序员成功之路 ——The road ahead for programmer(演讲稿)
  15. 【windows】Webstorm2021安装教程
  16. 百度地图坐标转成腾讯地图坐标
  17. 援引Yaphets的话:我又不淡定了
  18. Unity碰撞检测/触发器触发问题
  19. 农村经济与科技杂志农村经济与科技杂志社农村经济与科技编辑部2022年第9期目录
  20. GameFramework篇:类自动生成工具的使用

热门文章

  1. crtmpserver系列(二):搭建简易流媒体直播系统
  2. 相机光学(五)——对运动物体的曝光时间的计算
  3. 【leetcode-字符串】:重复的子字符串(是否由它的一个子串重复多次构成)
  4. 尚硅谷JDBC学习笔记
  5. vue项目强制清除页面缓存
  6. Redux:优点和缺点
  7. 麻省理工python公开课 pdf_MIT麻省理工学院公开课:计算机科学及编程导论 Python 笔记1-3...
  8. 耦合是什么?如何做到解耦?
  9. 能上QQ不能上浏览器处理方法(win11版)
  10. 《数据结构教程》(第5版)学习笔记(一)