[记录]Android init

1. Linux第一个用户空间进程为init,init进程负责初始化log系统,解析init.project.rc文件,然后启动property service。

2. init.rc定义了一系列service和action,service通过parse_service解析出来,service中的option会定义其class、user、group、socket、oneshot以及on restart的action等。service和action都会被存储到单独的双向链表中。

3. 在init.rc定义了on boot的action,定义了class_start core和class_start main两个command会依次启动所有class为core(如service manager,adbd)和main(如zygote、netd、wild、installd、surfaceflinger等)的service。

4. Property service会初始化一块共享内存,然后从default.prop、system/build.prop等文件读取出属性初值存入共享内存。所有进程都可以通过共享内存直接进行读操作,但是所有写操作都需要通过指定的socket进行,从socket收到写property请求之后会依次更新文件和共享内存值,所以不同进程间可能出现写入值无法马上被其他进程读到而产生的不同步问题。


[附一]

Init.rc脚本使用的是一种初始化语言,其中包含了4类声明:
1)Action
2)Command
3)Service
4)Option
该语言规定,Action和Service是以一种“小节”(Section)的形式出现的,其中每个Action小节可以含有若干Command,而每个Service小节可以含有若干Option。

脚本中的Action大体上表示一个“行动”,它用一系列Command共同完成该“行动”。Action需要有一个触发器(trigger)来触发它,一旦满足了触发条件,这个Action就会被加到执行队列的末尾。Action的形式如下: 

on  <trigger>
 <command1>
 <command2>
    ......


Service表示一个服务程序,会在初始化时启动。因为init.rc脚本中描述的服务往往都是核心服务,所以(基本上所有的)服务会在退出时自动重启。Service的形式如下: 

service <name> <pathname> [<arguments>]*
 <option>
 <option>
  ......



[附二]

Init执行过程:

1.初始化log系统

2.解析/init.rc和/init.%hardware%.rc文件  

3. 执行 early-init action in the two files parsed in step 2.  

4. 设备初始化,例如:在 /dev 下面创建所有设备节点,下载 firmwares.  

5.初始化属性服务器,Actually the property system is working as a share memory.Logically it looks like a registry under Windows system.  

6. 执行 init action in the two files parsed in step 2.  

7. 开启 属性服务。

8. 执行 early-boot and boot actions in the two files parsed in step 2.  

9. 执行 Execute property action in the two files parsed in step 2.  

10.进入一个无限循环 to wait for device/property set/child process exit events.例如,如果SD卡被插入,init会收到一个设备插入事件,它会为这个设备创建节点。系统中比较重要的进程都是由init来fork的,所以如果他们他谁崩溃了,那么init 将会收到一个 SIGCHLD 信号,把这个信号转化为子进程退出事件, 所以在loop中,init 会操作进程退出事件并且执行*.rc 文件中定义的命令。
例如,在init.rc中,因为有:
service zygote /system/bin/app_process -Xzygote /system/bin –zygote –start-system-server
    socket zygote stream 666
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
所以,如果zygote因为启动某些服务导致异常退出会自动重启。


[附三]

Property读写:


[附四]

Android启动过程图:

image

[参考资料]

[深入理解Android卷一全文-第三章]深入理解init

http://blog.csdn.net/innost/article/details/47204675


Android4.4的init进程

https://my.oschina.net/youranhongcha/blog/469028


深入讲解Android Property机制

https://my.oschina.net/youranhongcha/blog/389640


Android系统init.rc分析

http://blog.csdn.net/zhenwenxian/article/details/7506392


Android的init过程(二):初始化语言(init.rc)解析

http://www.cnblogs.com/nokiaguy/p/3164799.html


Android 核心分析 之八------Android 启动过程详解

http://blog.csdn.net/maxleng/article/details/5508372






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值