当init子进程退出时,会产生SIGCHLD信号,并发送给init进程,通过socket套接字传递数据,调用到wait_for_one_process()方法,根据是否是oneshot,来决定是重启子进程,还是放弃启动。 所有的Service里面只有servicemanager ,zygote ,surfaceflinger这3个服务有onrestart关键字来触发其他service启动过程。 //zygote可触发media、netd...
此处会调用epoll_ctl设置keychord fd可读的回调函数queue_builtin_action(keychord_init_action,"keychord_init");//屏幕上显示Android静态Logo 【见小节1.3】queue_builtin_action(console_init_action,"console_init");//执行rc文件中触发器为on init的语句action_for_each_trigger("init...
通过在init.rc文件中定义recovery服务,init进程可以启动recovery模式并执行相关操作。而在recovery模式下,通过recovery.rc文件可以定义各种recovery模式下的操作。 代码示例: service recovery /system/bin/recovery class core user root group root disabled oneshot 1. 2. 3. 4. 5. 6. service recovery /sbin/recov...
解析并运行所有的init.rc相关文件 根据rc文件,生成相应的设备驱动节点 处理子进程的终止(signal方式) 提供属性服务的功能 接下来从main()方法说起。 1.1 main [-> init.cpp] staticintepoll_fd =-1;intmain(intargc,char** argv){ ...//设置文件属性0777umask(0);//初始化内核log,位于节点/dev/kmsg【见...
init进程是Android系统中用户空间的第一个进程,它被赋予了很多极其重要的工作职责,init进程相关源码位于system/core/init,本篇博客我们就一起来学习init进程(基于Android 7.0)。 init入口函数分析 init的入口函数为main,位于system/core/init/init.cpp 代码语言:javascript 代码运行次数:0 运行 AI代码解释 int main(int...
init.rc是系统配置文件,位于system/core/rootdir/init.rc,Android 7.0中对init.rc文件进行了拆分,每个服务一个rc文件。 init.rc文件是在init进程启动后执行的启动脚本,文件中记录着init进程需执行的操作。在Android系统中,使用init.rc和init.{ hardware }.rc两个文件。 其中init.rc文件在Android系统运行过程中用于...
user 表示将用户切换为,用户名已经定义好了,只能是system/rootgroup 表示将组切换为oneshot 表示这个service只启动一次class 指定一个要启动的类,这个类中如果有多个service,将会被同时启动。默认的class将会是“default”onrestart 在重启时执行一条命令Commandcomand主要包括:exec [ ]*执行一个指定的程序export ...
if ((flags_ & SVC_ONESHOT) && !(flags_ & SVC_RESTART)) { flags_ |= SVC_DISABLED; } ... //后续Init进程重启子进程会通过这个标志位来判断是否需要重启该子进程 flags_ |= SVC_RESTARTING; ... return; } 当init进程收到子进程意外终止SIGCHLD信号后,会根据对应进程Service对象的flags_标志位来判...
init语言在以.rc文件为扩展名的纯文本文件中描述,在Android系统中的多个地方通常存在多个这样的文件,/init.rc是第一个.rc文件,由init可执行文件在系统执行开始时加载,负责系统的初始设置。init会在加载/init.rc后立即加载/{system,,system_ext,vendor,odm,product}/etc/init/目录中包含的所有文件。这些目录的作用...
init进程执行完成后进入循环等待epoll_wait的状态。 1.2 log系统 此时android的log系统还没有启动,采用kernel的log系统,打开的设备节点/dev/kmsg, 那么可通过cat /dev/kmsg来获取内核log。 接下来,设置log的输出级别为KLOG_NOTICE_LEVEL(5),当log级别小于5时则会输出到kernel log, 默认值为3. ...