Android系统初始化过程分析(Android 4.3)
在内核初始化完成后,最后会启动第一个用户空间进程,路径名为/init,它对应的代码是在/system/core/init/init.c。
下面将从main函数开始一步步分析其中的执行过程。
if (!strcmp(basename(argv[0]), "ueventd")) return ueventd_main(argc, argv); if (!strcmp(basename(argv[0]), "watchdogd")) return watchdogd_main(argc, argv); |
首先,watchdog和uevent命令已经集成到了init。/sbin/ueventd和/sbin/watchdogd是一个链接文件,它直接链接到/init,所以当执行/sbin/eventd或/sbin/watchdogd时,将会进入相应的ueventd_main或watchdogd_main入口点。ueventd伺服程序将解析/ueventd.rc文件,并创建相应的设备结点。watchdogd伺服程序是一个看门狗程序,它的任务就是定期向看门狗设备文件执行写操作,以判断系统是否正常运行。
接下来就是创建几个必须的目录,并挂载tmpfs,devpts,proc,sysfs文件系统,将通过创建文件"/dev/.booting"来表示目前正处于启动中的状态。
… /* clear the umask */ umask(0); /* Get the basic filesystem setup we need put * together in the initramdisk on / and then we'll * let the rc file figure out the rest. */ mkdir("/dev", 0755); mkdir("/proc", 0755); mkdir("/sys", 0755); mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755"); mkdir("/dev/pts", 0755); mkdir("/dev/socket", 0755); mount("devpts", "/dev/pts", "devpts", 0, NULL); mount("proc", "/proc", "proc", 0, NULL); mount("sysfs", "/sys", "sysfs", 0, NULL); /* indicate that booting is in progress to background fw loaders, etc */ close(open("/dev/.booting", O_WRONLY | O_CREAT, 0000)); … |
接下来,将创建两个设备结点:/dev/__null__以及/dev/__kmsg__,并打开标准输入流,输出流以及错误输出流,并将它们重定向到/dev/__null__,所以,此时是不能直接调用printf系列的函数直接打印Log输出,而是利用klog输出日志。
open_devnull_stdio(); klog_init(); property_init(); |
接下来,property_init初始化属性服务所需要的基本空间。首先创建一个/dev/__properties__文件,然后通过对应的文件描述映射一块共享内存,大小PA_SIZE(49152),映射的地址和相应的文件描述符保存在struct workspace中。
typedef struct { void *data; size_t size; int fd; } workspace; |
其中data记录了映射的共享内存的地址,而fd保存的是一个只读权限的文件描述符,size是这块映射的共享内存的大小。
接着获取硬件信息,将处理传递给内核的命令行参数
get_hardware_name(hardware, &revision); process_kernel_cmdline(); |
如果启用了SELinux机制,接下来将加载selinux策略,并初始化文件安全上下文以及属性安全上下文。
union selinux_callback cb; cb.func_log = klog_write; selinux_set_callback(SELINUX_CB_LOG, cb); cb.func_audit = audit_callback; selinux_set_callback(SELINUX_CB_AUDIT, cb); INFO("loading selinux policy\n"); if (selinux_enabled) { if (selinux_android_load_policy() < 0) { selinux_enabled = 0; INFO("SELinux: Disabled due to failed policy load\n"); } else { selinux_init_all_handles(); } } else { INFO("SELinux: Disabled by command line option\n"); } /* These directories were necessarily created before initial policy load * and therefore need their security context restored to the proper value. * This must happen before /dev is populated by ueventd. */ restorecon("/dev"); restorecon("/dev/socket"); restorecon("/dev/__properties__"); |
如果当前启动模式不是充电模式,将从/default.prop文件中加载默认的一些属性设置。
INFO("property init\n"); if (!is_charger) property_load_boot_defaults(); |
然后就是解析/init.rc文件中的一些action, service,等信息,并通过action_for_each_trigger执行相应的命令。同时queue_builtin_action也会增加一些内置的action,将在稍后逐条触发执行。
最后进入循环,逐条执行命令,并启动service_list中的所有服务,将其状态变为SVC_RUNNING, 最后将监听属性设置命令,按键请求以及信号等消息,并作相应处理。
转载于:https://my.oschina.net/fuyajun1983cn/blog/263939
Android系统初始化过程分析(Android 4.3)相关推荐
- 【Android 系统开发】 Android 系统启动流程简介
作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...
- [转] Android系统版本号和Android API level对应表
平时总会去查 Android系统版本号和Android API level对应关系,有时候上不了Google,网上搜的又不全.这里翻译记录下,顺便给出原文网址:https://developer.an ...
- android系统recovery模式,Android系统Recovery模式中文详细说明
Recovery具体功能: 1.刷系统:新下载好的rom,,直接放sd卡上刷(进nand),,无需windows! 2.像电脑的ghost,,允许用户随意将系统和里面的个人资料备份成一个文件,,并允许 ...
- Android系统系统升级过程分析之------update.zip包的制作
这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.我们先从update.zip包的制作开始,然后是And ...
- android系统关机广播,android关机方法汇总
有段时间做系统hook时需要用到系统重启,找了几种重启的方法,还有几种关机的方法,总结一下. 一,发送广播 Broadcast, Intent.ACTION_REQUEST_SHUTDOWN关机广播 ...
- 替换android系统字体颜色,Android替换系统字体
1.引言 最近老大安排一个任务,让我看看android 字体这块,将我们产品中的字体替换下.花了1.2天看懂,还得写篇文章,教程在组内进行分享.这次算是我进军Android系统的第一步.这篇文章基于A ...
- android系统应用程序,Android系统应用程序基本概念解读
经常关注我们51CTO的朋友们应该知道,在以前的文章中我们对Android这一手机系统有一个详细的跟踪介绍,方便大家学习应用这一新的功能强大的开源手机系统,比如对Android源码的编译的解析的解析等 ...
- 【Android 系统开发】Android框架 与 源码结构
一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...
- android系统应用功能,Android系统应用(12)
如何成为系统应用 方法一:在Manifest中声明android:sharedUserId的值为:android.uid.system,android.uid.phone,android.uid.lo ...
最新文章
- android适配右到左布局注意事项
- RHCE课程-RH253Linux服务器架设笔记三-Samba服务器配置(1)
- 笔记-项目进度管理-资源平衡和资源平滑
- 日期格式转换成时间戳格式php,php日期转时间戳,指定日期转换成时间戳
- kubernetes1.8.4安装指南 -- 3. 安装docker ce
- python inspect.stack() 的简单使用
- Redis 它是什么?它用来做什么?它的优势与短板如何?
- html设计网页技巧,网页设计技巧:网页表格设计技巧总结
- 没有梦想,你跟咸鱼有什么分别?
- aspjpeg已过期_Persits.Jpeg.1错误’800a0004′ AspJpeg组件过期解决方法 - YangJunwei
- linux下的C语言开发(线程等待)
- slam魔改的支持数据库动态虚拟墙,禁行线costmap_prohibition_layer
- FZU 2195 检查站点
- Python装饰器的原理与应用
- 棋盘上的麦粒c语言,棋盘上的麦粒
- arduino 智能车组装步骤_Arduino 智能避障智能小车制作图文教程
- 微信小程序 公众号 订阅消息 模板 正则 参数校验
- 腾讯云云服务器的地域和可用区有哪些?已购买的腾讯云服务器可以更换地域吗?
- 学田岛电脑绣花制版新人上手教程之一
- autojs之语音识别