当前位置: 首页 > news >正文

Android系统开机启动画面显示过程简要说明

开机启动会显示三个画面:

  1. Linux内核的启动画面,静态画面
  2. Init进程启动过程中出现的静态画面
  3. 系统服务启动过程中出现的动态画面

这些画面的显示的过程不同,但最终是通过framebuffer显示的,每层对它显示的过程进行了封装。即无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的。

Framebuffer是对硬件显示设备的抽象,屏蔽底层不同的显示设备。对framebuffer上进行写操作即可得到对应的画面。

 

第一个启动画面:显示一只企鹅

比较直接的使用framebuffer,通过最终的info->fbops->fb_imageblit(info, image);  调用实现画面的显示,回调函数fb_imageblit就是用来在指定的帧缓冲区硬件设备渲染指定的图像的。

 

第二个启动画面

也相对比较简单,调用load_565rle_image(INIT_IMAGE_FILE)来显示画面,最终调用framebuffer中的接口fb_open来打开设备文件/dev/graphics/fb0,打开了设备文件/dev/graphics/fb0之后,我们就可以将文件/initlogo.rle的内容输出到帧缓冲区硬件设备中去了。

 

第三个启动画面

比较复杂,涉及到系统服务SurfaceFlinger。 

由应用程序bootanimation来负责显示的。应用程序bootanimation在启动脚本init.rc中被配置成了一个服务。

 

当SurfaceFlinger服务启动的时候,它会通过修改系统属性ctl.start的值来通知init进程启动应用程序bootanimation,以便可以显示第三个开机画面,而当System进程将系统中的关键服务都启动起来之后,ActivityManagerService服务就会通知SurfaceFlinger服务来修改系统属性ctl.stop的值,以便可以通知init进程停止执行应用程序bootanimation,即停止显示第三个开机画面。

SurfaceFlinger::init() –> startBootAnim()->property_set("ctl.start", "bootanim");

 

SurfaceFlinger::init()中首先对设备主屏幕以及OpenGL库进行初始化,初始化完成后调用startBootAnim(),startBootAnim()中调用property_set("ctl.start", "bootanim");,属性改变,init进程就会接收到一个系统属性变化通知,这个通知最终是由在init进程中的函数handle_property_set_fd来处理的。

最终会调用bootanimation服务,此服务中通过EGL来初始化OpenGL,为OpenGL显示画面做准备。最后利用openGL接口进行画面的渲染,通过glSwapBuffers(mDisplay, mSurface)显示画面。

转载于:https://www.cnblogs.com/OUSUO/p/4040417.html

相关文章:

  • 团队项目准备工作
  • JavaScript中的闭包理解
  • ubuntu nginx卸载和安装
  • mysql dump
  • 【转】link_to中delete无效的问题解决
  • Java里泛型有什么作用
  • matlab向量的排序(自写函数)
  • 在eclipse中新建一个maven项目
  • 使用 jquery 获取当前时间的方法
  • Chrome浏览器桌面通知提示设置
  • Python——网络编程,如何避免死锁?
  • 页游框架
  • 如何催促Apple进行App审核
  • JPA联合主键@EmbeddedId使用详解附查询例子
  • jQuery源码笔记——四
  • Google 是如何开发 Web 框架的
  • @angular/forms 源码解析之双向绑定
  • Android优雅地处理按钮重复点击
  • avalon2.2的VM生成过程
  • es6要点
  • java8 Stream Pipelines 浅析
  • Koa2 之文件上传下载
  • overflow: hidden IE7无效
  • Python利用正则抓取网页内容保存到本地
  • 读懂package.json -- 依赖管理
  • 浮动相关
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 线上 python http server profile 实践
  • 赢得Docker挑战最佳实践
  • 自定义函数
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​iOS安全加固方法及实现
  • #define 用法
  • #Spring-boot高级
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .gitignore
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net mvc部分视图
  • .Net 垃圾回收机制原理(二)
  • .NET中winform传递参数至Url并获得返回值或文件
  • .skip() 和 .only() 的使用
  • @angular/cli项目构建--Dynamic.Form
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ffmpeg] 定制滤波器
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [HackMyVM]靶场Crossbow
  • [hdu4622 Reincarnation]后缀数组
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口