service 语句块下面可以赋予多种选项(option)用来指示服务进程的运行规则,以及进程死亡后的重启规则
下面是 .rc 文件中的典型阶段(按启动顺序排列),根据设备不同不同厂商可能对其进行定制:
列举 .rc 文件中支持的大部分命令,一部分和 shell 命令具有相同作用:
varible
mkdir(2)
SIGCHLD
fork()
exec()
可以看到它们之间的依赖关系:
在 init.rc 文件中查找這些服务组的启动时机:
看到 core 服务组在 boot 阶段被启动,优先与 main 服务组boot 由 late-init 阶段触发;main 服务组在 vold.decrypt 图片添加alt属性步骤被改变的多处时机被触发,这些图片添加alt属性步骤将在 vold 服务启动时的相关流程被触发
vold.decrypt
下面是 vold 服务的启动内容:
以 zygote 服务为出发点,分析启动一个服务的具体代码
臸于其他服务的启动,以此类推
到这里就分析完了 init 进程的整个流程,这对于了解之后的系统服务的启动流程奠定了基础
例如用户进程使用 recvfrom 系统调用,kernel 开始准备数据对于 Network IO,很多数据一开始没有到达需要等待,此时用户进程将被阻塞当 kernel 等到数据准备好的时候,将数据從内核空间拷贝到用户空间返回结果,此时用户进程解除 block 状态
recvfrom
和阻塞 IO 类似,在发出时会被阻塞但可以等待多个数据报就绪(datagram ready),即鈳以处理多个链接例如 select,它相当于一个代理用户进程调用后会被阻塞,此时 select 在内核空间会监听多个 datagram(如 socket 连接)如果启动一个数据就緒了就返回。
僵尸进程是指当子进程比父进程先结束而父进程又没有回收子进程,释放子进程的资源此时子进程将成为一个僵尸进程。如果父进程先退出则子进程被 init 进程接管,子进程退出后 init 会回收其占用的相关资源
系统会为僵尸进程保存一定的信息,包括 pid 和运行时間等系统所能使用的进程号是有限的,如果产生大量的僵尸进程将因为没有可用的进程号而导致系统不能产生新的进程。
wait
waitpid
SIG_IGN
fork
《最强 Android 书:架构大剖析》
按网上的方法不知是版本问题,还是什么就没有找着 Android_bluetooth_common.h 这个文件,自己来改