we new

深入理解Android - Init

       (原文地址) init是是Linux系统中用户空间的第一个进程。由于Android是基于Linux内核的,所以init也是Android系统中用户空间的第一个进程,它的进程号是1。Init进程的两个比较重要的任务是:

  • Init进程负责创建系统中的几个关键进程,尤其是Zygote,它更是Java世界的开创者;
  • Android系统有很多属性,于是init就提供了一个property service(属性服务)来管理它们。

        Keywords: Init

init分析

init将动作执行的时间划分为四个阶段:early-init、init、early-boot、boot。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//init关注来自四个方面的事情。
ufds[0].fd= device_fd;//device_fd用于监听来自内核的Uevent事件
ufds[0].events = POLLIN;
ufds[1].fd = property_set_fd;//property_set_fd用于监听来自属性服务器的事件
ufds[1].events= POLLIN;
//signal_recv_fd由socketpair创建,它的事件来自另外一个socket。
ufds[2].fd = signal_recv_fd;
ufds[2].events = POLLIN;
fd_count = 3;
if(keychord_fd > 0) {
//如果keychord设备初始化成功,则init也会关注来自这个设备的事件。
ufds[3].fd = keychord_fd;
ufds[3].events = POLLIN;
fd_count++;
}

init的工作流程精简为以下四点:

  • 解析两个配置文件;
  • 执行各个阶段的动作,创建Zygote的工作就是在其中的某个阶段完成的;
  • 调用property_init初始化属性相关的资源,并且通过property_start_service启动属性服务;
  • Init进入一个无限循环,并且等待一些事情的发生。重点关注init如何处理来自socket和来自属性服务器相关的事情。

解析配置文件

在init中会解析两个配置文件,一个是系统配置文件init.rc,另外一个是和硬件平台相关的配置文件。对这两个配置文件进行解析,调用的是同一个parse_config_file函数。
parse_config会先找到配置文件的一个section,针对不同的section使用不同的解析函数来解析。
对init.rc进行分析:

  • 一个section的内容从这个标示section的关键字开始,到下一个标示section的地方结束。
  • init.rc中出现了名为boot和init的section,这里的boot和init,就是前面介绍的动作执行四个阶段中的boot和init。也就是说,在boot阶段执行的动作都是由boot这个section定义的。

解析service

解析函数

service解析时,用到了parse_service和parse_line_service两个函数:

  • parse_service函数只是搭建了一个service的架子,具体的内容尚需由后面的解析函数来填充;
  • parse_line_service将根据配置文件的内容填充service结构体。

    service属性

    service一共有六个属性,分别为:
  • SVC_DISABLED:不随class自动启动。
  • SVC_ONESHOT:退出后不需要重启,也就是这个service只启动一次就可以了。
  • VC_RUNNING:正在运行,这是service的状态。
  • SVC_RESTARTING:等待重启,这也是service的状态。
  • SVC_CONSOLE:该service需要使用控制台 。
  • SVC_CRITICAL:如果在规定时间内该service不断重启,则系统会重启并进入恢复模式。
    如果没有使用任何属性,如zygote,这表明它:会随着class的处理自动启动;退出后会由init重启;不使用控制台;即使不断重启也不会导致系统进入恢复模式。

    zygote解析结果


    从上图中可知:
  • service_list链表将解析后的service全部链接到了一起,并且是一个双向链表,前向节点用prev表示,后向节点用next表示。
  • socketinfo也是一个双向链表,因为zygote只有一个socket,所以画了一个虚框socket做为链表的示范。
  • onrestart通过commands指向一个commands链表,zygote有三个commands。

声明: 本文转载前需与作者联系并标明出处
分享到: