Android启动(二)init进程

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
        • serviceManager启动在Zygote之前,zygote 进程中systemServer进程中注册的服务都要注册到serviceManager中,所以这里需要在zygote之前将Binder启动好
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值