Android系统的开机画面显示过程分析(8)
- service bootanim /system/bin/bootanimation
- user graphics
- group graphics
- disabled
- oneshot
- void SurfaceFlinger::onFirstRef()
- {
- run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);
- // Wait for the main thread to be done with its initialization
- mReadyToRunBarrier.wait();
- }
- status_t SurfaceFlinger::readyToRun()
- {
- LOGI( "SurfaceFlinger's main thread ready to run. "
- "Initializing graphics H/W...");
- ......
- mReadyToRunBarrier.open();
- /*
- * We're now ready to accept clients...
- */
- // start boot animation
- property_set("ctl.start", "bootanim");
- return NO_ERROR;
- }
前面创建的线程用作SurfaceFlinger的主线程。这个线程在启动的时候,会对设备主屏幕以及OpenGL库进行初始化。初始化完成之后,接着就会调用SurfaceFlinger类的成员变量mReadyToRunBarrier所描述的一个Barrier对象的成员函数open来唤醒System进程的主线程,以便它可以继续往前执行。最后,SurfaceFlinger类的成员函数readyToRun的成员函数会调用函数property_set来将系统属性“ctl.start”的值设置为“bootanim”,表示要将应用程序bootanimation启动起来,以便可以显示第三个开机画面。
- void handle_property_set_fd()
- {
- prop_msg msg;
- int s;
- int r;
- int res;
- struct ucred cr;
- struct sockaddr_un addr;
- socklen_t addr_size = sizeof(addr);
- socklen_t cr_size = sizeof(cr);
- if ((s = accept(property_set_fd, (struct sockaddr *) &addr, &addr_size)) < 0) {
- return;
- }
- /* Check socket options here */
- if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cr, &cr_size) < 0) {
- close(s);
- ERROR("Unable to recieve socket options\n");
- return;
- }
- r = recv(s, &msg, sizeof(msg), 0);
- close(s);
- if(r != sizeof(prop_msg)) {
- ERROR("sys_prop: mis-match msg size recieved: %d expected: %d\n",
- r, sizeof(prop_msg));
- return;
- }
- switch(msg.cmd) {
- case PROP_MSG_SETPROP:
- msg.name[PROP_NAME_MAX-1] = 0;
- msg.value[PROP_VALUE_MAX-1] = 0;
- if(memcmp(msg.name,"ctl.",4) == 0) {
- if (check_control_perms(msg.value, cr.uid, cr.gid)) {
- handle_control_message((char*) msg.name + 4, (char*) msg.value);
- } else {
- ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n",
- msg.name + 4, msg.value, cr.uid, cr.pid);
- }
- } else {
- if (check_perms(msg.name, cr.uid, cr.gid)) {
- property_set((char*) msg.name, (char*) msg.value);
- } else {
- ERROR("sys_prop: permission denied uid:%d name:%s\n",
- cr.uid, msg.name);
- }
- }
- break;
- default:
- break;
- }
- }
init进程是通过一个socket来接收系统属性变化事件的。每一个系统属性变化事件的内容都是通过一个prop_msg对象来描述的。在prop_msg对象对,成员变量name用来描述发生变化的系统属性的名称,而成员变量value用来描述发生变化的系统属性的值。系统属性分为两种类型,一种是普通类型的系统属性,另一种是控制类型的系统属性(属性名称以“ctl.”开头)。控制类型的系统属性在发生变化时,会触发init进程执行一个命令,而普通类型的系统属性就不具有这个特性。注意,改变系统属性是需要权限,因此,函数handle_property_set_fd在处理一个系统属性变化事件之前,首先会检查修改系统属性的进程是否具有相应的权限,这是通过调用函数check_control_perms或者check_perms来实现的。
Android系统的开机画面显示过程分析(8)相关推荐
- Android系统的开机画面显示过程分析(13)
WindowManagerService类的成员函数performEnableScreen的实现如下所示: public class WindowManagerService extend ...
- Android系统的开机画面显示过程分析
提到Android系统的UI,我们最先接触到的便是系统在启动过程中所出现的画面了.Android系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段.本文将详细分析这三个开 ...
- 安卓linux开机画面,Android系统的开机画面显示过程分析(1)
好几个月都没有更新过博客了,从今天开始,老罗将尝试对Android系统的UI实现作一个系统的分析,也算是落实之前所作出的承诺.提到Android系统的UI,我们最先接触到的便是系统在启动过程中所出现的 ...
- Android系统的开机画面显示过程分析(5)
2. 第二个开机画面的显示过程 由于第二个开机画面是在init进程启动的过程中显示的,因此,我们就从init进程的入口函数main开始分析第二个开机画面的显示过程. init进 ...
- Android系统手机开机画面各个阶段代码执行流程分析(Part2)
3. 第三个开机画面的显示过程 第三个开机画面是由应用程序bootanimation来负责显示的.应用程序bootanimation在启动脚本init.rc中被配置成了一个服务,如下所示: servi ...
- Android系统定制开机logo和开机动画
定制开机logo和开机动画 开机logo 开机动画 bootanimation.zip 生成zip文件 添加新的开机动画 开机logo MTK ASOP中lk阶段的logo是开机后的第一个界面,也被称 ...
- Android系统手机开机画面各个阶段代码执行流程分析(Part1)
提到Android系统的UI,我们最先接触到的便是系统在启动过程中所出现的画面了.Android系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段.本文将详细分析这三个开 ...
- android系统修改开机动画
前提须知 开机动画是bootanimation.zip文件,包含part0和desc.txt两部分. part0文件夹:存放与屏幕分辨率相同的图片,图片命名数字递增. desc.txt文本:配置图片如 ...
- Android系统Surface机制的SurfaceFlinger服务的启动过程分析
在前面一篇文章中,我们简要介绍了Android系统Surface机制中的SurfaceFlinger服务.SurfaceFlinger服务是在System进程中启动的,并且负责统一管理设备的帧缓冲区. ...
最新文章
- 面试官:请简述一下vue-cli命令行工具,你能自己手写一个吗?
- eureka心跳_Eureka工作原理及心跳机制
- 二线城市的我,和北京的同学比成长
- 计算机Word应用程序,Word2007目录设置_计算机软件和应用程序_IT /计算机_信息
- 每天自动给自己发天气预报的脚本
- Ubuntu16.04 下 tensorRT安装
- 少数以太坊矿池正在联合抵制EIP-1559提案的实施
- 修改MySQL用户的host属性_如何快速修改MySQL用户的host属性
- java对数据库的基础知识
- Ext JS 6学习文档–第1章–ExtJS入门指南
- IE浏览器无法查看源文件的8大原因
- flash图形、影片剪辑、按钮区别
- Duplicate entry for key 'PRIMARY'
- 工作窃取算法 work-stealing
- 项目日志20190704
- 一个程序员的十年程序人生感悟
- fx3g485通讯模块_三菱模块FX3U-485ADP-MB MODBUS通信模块
- python基础知识整理13-正则re
- 我的input /不可能这么可爱
- VS2015 注释英文