zoukankan      html  css  js  c++  java
  • Android 9.0 Zygote进程启动源码分析指南二

    * 站在巨人的肩膀上可以看的更远 *

    直接参考博文:

    Android 9 Zygote进程启动源码分析指南二

    系统启动2——启动zygote

    系统启动3——Zygote的使命

     ===== 补充个人的一些儿笔记 =====

    一、zygote socket插曲

    参见init.zygoteXXXX.rc的内容

     在做rc文件解析时,Service解析过程中:

    http://androidxref.com/9.0.0_r3/xref/system/core/init/service.cpp#759

    >> Service::ParseLine == 解析每行的文字内容

      >> Service::OptionParserMap::FindFunction == 根据keyword(socket)找到对应的ParseSocket函数指针

        >> Service::ParseSocket == 构造SocketInfo到descriptors_中

    待Service:Start()被调用时:

    http://androidxref.com/9.0.0_r3/xref/system/core/init/service.cpp#873

    >> Service::Start()
        >> DescriptorInfo::CreateAndPublish
            >> SocketInfo::Create()
                >> util.cpp#CreateSocket()

    http://androidxref.com/9.0.0_r3/xref/system/core/init/descriptors.cpp#52

    void DescriptorInfo::CreateAndPublish(const std::string& globalContext) const {
      // Create
      const std::string& contextStr = context_.empty() ? globalContext : context_;
      int fd = Create(contextStr);
      if (fd < 0) return;
    
      // Publish
      std::string publishedName = key() + name_; //ANDROID_SOCKET_zygote 
      std::for_each(publishedName.begin(), publishedName.end(),
                    [] (char& c) { c = isalnum(c) ? c : '_'; });
    
      std::string val = std::to_string(fd); // socket句柄int值
      setenv(publishedName.c_str(), val.c_str(), 1); // 设置环境变量
    
      // make sure we don't close on exec
      fcntl(fd, F_SETFD, 0);
    }
    #define ANDROID_SOCKET_ENV_PREFIX "ANDROID_SOCKET_"
    #define ANDROID_SOCKET_DIR "/dev/socket"
    
    const std::string SocketInfo::key() const {
      return ANDROID_SOCKET_ENV_PREFIX;
    }

    setenv 对于SocketInfo而言设置的是环境变量 ANDROID_SOCKET_socket_name
    即,在Service启动时就同时创建了名为zygote的socket,具体的socket地址是:/dev/socket/zygote
    创建完成后,将socket句柄数据以环境变量的方式,放置在了 ANDROID_SOCKET_zygote 的key下。

    心有猛虎,细嗅蔷薇,生活就该无惧无悔..... PS:文章系作者工作学习总结,受作者知识水平的限制,文章难免有错误之处,仅供参考,转载请注明出处:http://www.cnblogs.com/roger-yu/
  • 相关阅读:
    doc
    doc
    doc
    doc
    doc
    doc
    doc
    doc
    java基础知识系列--- 反射,注解,泛型,内省
    CCProcxy代理服务器的配置使用
  • 原文地址:https://www.cnblogs.com/roger-yu/p/15033804.html
Copyright © 2011-2022 走看看