Init进程解析
在系统启动过程中
我们知道在拉起内核后,启动init进程
源码在
system/core/init/init.cpp
中
int main(int argc, char** argv) {
//添加环境
add_environment("PATH", _PATH_DEFPATH);
bool is_first_stage = (getenv("INIT_SECOND_STAGE") == nullptr);
//进行基本文件系统设置
mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
mount("devpts", "/dev/pts", "devpts", 0, NULL);
#define MAKE_STR(x) __STRING(x)
mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC));
chmod("/proc/cmdline", 0440);
gid_t groups[] = { AID_READPROC };
setgroups(arraysize(groups), groups);
mount("sysfs", "/sys", "sysfs", 0, NULL);
mount("selinuxfs", "/sys/fs/selinux", "selinuxfs", 0, NULL);
mknod("/dev/kmsg", S_IFCHR | 0600, makedev(1, 11));
mknod("/dev/random", S_IFCHR | 0666, makedev(1, 8));
mknod("/dev/urandom", S_IFCHR | 0666, makedev(1, 9));
//初始化属性服务
property_init();
//启动属性服务
start_property_service();
//解析init.rc
LoadBootScripts(am, sm);
}
static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_list) {
Parser parser = CreateParser(action_manager, service_list);
std::string bootscript = GetProperty("ro.boot.init_rc", "");
parser.ParseConfig("/init.rc");
}
Parser CreateParser(ActionManager& action_manager, ServiceList& service_list) {
Parser parser;
//解析service ServiceManager就是以服务形式解析的
parser.AddSectionParser("service", std::make_unique<ServiceParser>(&service_list, subcontexts));
parser.AddSectionParser("on", std::make_unique<ActionParser>(&action_manager, subcontexts));
parser.AddSectionParser("import", std::make_unique<ImportParser>(&parser));
return parser;
}
-
init进程主要就是设置文件系统
-
初始化并启动属性服务,用来设置属性
-
解析init.rc文件
-
源码位置
system/core/rootdir/init.rc
-
import /init.environ.rc import /init.usb.rc import /init.${ro.hardware}.rc import /vendor/etc/init/hw/init.${ro.hardware}.rc import /init.usb.configfs.rc import /init.${ro.zygote}.rc #调用 zygote start trigger zygote-start on post-fs # Load properties from # /system/build.prop, # /odm/build.prop, # /vendor/build.prop and # /factory/factory.prop load_system_props # 启动基本服务 servicemanager start logd start servicemanager start hwservicemanager start vndservicemanager # 在init.rc中调用zygote-start解除zygote的启动阻塞 on zygote-start && property:ro.crypto.state=unencrypted # A/B update verifier that marks a successful boot. exec_start update_verifier_nonencrypted start netd start zygote
-
init.rc中最主要就是做了这两件事
- 启动serviceManager(系统服务管家)
- 先说明下 内部打开了binderdriver(binder驱动)
- 将自己注册为Binder的上下文管理者,也就是服务管家ServiceManager
- zygote 进程中
systemServer
进程中注册的服务都要注册到serviceManager
中,后面client也是通过serviceManager来获取系统服务 - ServiceManager主要负责添加服务,获取服务,查找服务
- zygote 进程中
- 开启循环接收进程通讯的消息
- 启动Zygote
- serviceManager启动在Zygote之前,zygote 进程中
systemServer
进程中注册的服务都要注册到serviceManager
中,所以这里需要在zygote之前将Binder启动好
- serviceManager启动在Zygote之前,zygote 进程中
- 启动serviceManager(系统服务管家)
-