在内核初始化完成后,最后会启动第一个用户空间进程,路径名为/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)相关推荐

  1. 【Android 系统开发】 Android 系统启动流程简介

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...

  2. [转] Android系统版本号和Android API level对应表

    平时总会去查 Android系统版本号和Android API level对应关系,有时候上不了Google,网上搜的又不全.这里翻译记录下,顺便给出原文网址:https://developer.an ...

  3. android系统recovery模式,Android系统Recovery模式中文详细说明

    Recovery具体功能: 1.刷系统:新下载好的rom,,直接放sd卡上刷(进nand),,无需windows! 2.像电脑的ghost,,允许用户随意将系统和里面的个人资料备份成一个文件,,并允许 ...

  4. Android系统系统升级过程分析之------update.zip包的制作

    这篇及以后的篇幅将通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.我们先从update.zip包的制作开始,然后是And ...

  5. android系统关机广播,android关机方法汇总

    有段时间做系统hook时需要用到系统重启,找了几种重启的方法,还有几种关机的方法,总结一下. 一,发送广播 Broadcast, Intent.ACTION_REQUEST_SHUTDOWN关机广播 ...

  6. 替换android系统字体颜色,Android替换系统字体

    1.引言 最近老大安排一个任务,让我看看android 字体这块,将我们产品中的字体替换下.花了1.2天看懂,还得写篇文章,教程在组内进行分享.这次算是我进军Android系统的第一步.这篇文章基于A ...

  7. android系统应用程序,Android系统应用程序基本概念解读

    经常关注我们51CTO的朋友们应该知道,在以前的文章中我们对Android这一手机系统有一个详细的跟踪介绍,方便大家学习应用这一新的功能强大的开源手机系统,比如对Android源码的编译的解析的解析等 ...

  8. 【Android 系统开发】Android框架 与 源码结构

    一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...

  9. android系统应用功能,Android系统应用(12)

    如何成为系统应用 方法一:在Manifest中声明android:sharedUserId的值为:android.uid.system,android.uid.phone,android.uid.lo ...

最新文章

  1. android适配右到左布局注意事项
  2. RHCE课程-RH253Linux服务器架设笔记三-Samba服务器配置(1)
  3. 笔记-项目进度管理-资源平衡和资源平滑
  4. 日期格式转换成时间戳格式php,php日期转时间戳,指定日期转换成时间戳
  5. kubernetes1.8.4安装指南 -- 3. 安装docker ce
  6. python inspect.stack() 的简单使用
  7. Redis 它是什么?它用来做什么?它的优势与短板如何?
  8. html设计网页技巧,网页设计技巧:网页表格设计技巧总结
  9. 没有梦想,你跟咸鱼有什么分别?
  10. aspjpeg已过期_Persits.Jpeg.1错误’800a0004′ AspJpeg组件过期解决方法 - YangJunwei
  11. linux下的C语言开发(线程等待)
  12. slam魔改的支持数据库动态虚拟墙,禁行线costmap_prohibition_layer
  13. FZU 2195 检查站点
  14. Python装饰器的原理与应用
  15. 棋盘上的麦粒c语言,棋盘上的麦粒
  16. arduino 智能车组装步骤_Arduino 智能避障智能小车制作图文教程
  17. 微信小程序 公众号 订阅消息 模板 正则 参数校验
  18. 腾讯云云服务器的地域和可用区有哪些?已购买的腾讯云服务器可以更换地域吗?
  19. 学田岛电脑绣花制版新人上手教程之一
  20. autojs之语音识别

热门文章

  1. AS3 中强制类型转换方法
  2. .net中窗体之间的数据交换总结
  3. Mybatis 缓存系统源码解析
  4. 一些还能记住的面试题
  5. 先给自己定个小目标,比如写个爬虫程序
  6. 通过shell脚本定期更新elasticsearch数据
  7. 博为峰Java技术题 ——JavaEE Servlet 国际化Ⅲ
  8. Android得到视频缩略图
  9. PMBOK学习笔记二-项目管理过程
  10. varnish Cconfigure