当前位置: 首页 > news >正文

android系统启动流程之zygote如何创建SystemServer进程

SystemServer:是独立的进程,主要工作是管理服务的,它将启动大约90+种服务Services.
它主要承担的职责是为APP的运行提供各种服务,像AMS,WMS这些服务并不是一个独立的进程,
它们其实都是SystemServer进程中需要管理的的众多服务之一。

下面分析zygote启动SystemServer进程的核心代码:

ZygoteInit.main():....//拿到的Runnable是for()出来之后的java app进程(包括SystemServer进程)//通过反射拿到带有main方法的Runnable对象,Runnable r = forkSystemServer(abiList, zygoteSocketName);-->Zygote.forkSystemServer();-->pid = nativeForkSystemServer(); //java的本地方法,需要进入JNI层去查找映射的native方法-->实际上调用的是com_android_internal_os_Zygote.cpp中的方法:-->com_android_internal_os_Zygote_nativeForkSystemServer():-->ForkCommon(); //里入native层的fork-->pid = fork(); //系统的api. 最终由它创建出SystemServer进程if(pid == 0){ //孩子进程}else{ //返回的pid是孩子进程的pid,表示这个是父进程,就是zygote进程本身,这是孩子告诉父亲Zgote它的pid号}return pid;return pid;//对应nativeForkSystemServer()层级,意味着nativeForkSystemServer也会返回2次。//对应forkSystemServer()层级//后面的代码也都会有2个进程执行,孩子 进程和父进程if(pid == 0) //孩子 进程{zygoteServer.closeServerSocket(); //关闭句柄,对孩子 进程来说,这个句柄没用了。return handleSystemServerProcess(); //孩子 进程就是SystemServer啦,返回的是Runnable对象。//创建SystemServer进程运行需要的各种参数-->cl = createPathClassLoader(systemServerClasspath, parsedArgs.mTargetSdkVersion);-->ClassLoaderFactory.createClassLoader(classpath, libraryPath...);-->ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,parsedArges.mDisabledCompatChanges,parsedArgs.mRemainingArgs, cl); //传入SystemServer中的各种参数-->RuntimeInit.commonInit();//初始化运行环境 ZygoteInit.nativeZygoteInit();//启动Binder//通过反射创建程序入口函数的Method对象,并返回 Runnable对象。return RuntimeInit.applicationInit(...) //启动SystemServer 系统app进程,其它普通app进程也是同样的方法-->m = cl.getMethod("main" new class[]{String[].class}) //目的未来通过反射执行java的main函数来启动java进程}else{ //父进程}r.run(); //在这里执行启动app进程(包括SystemServer) 

下面用一张图来表示上面的代码过程:

前面的流程是说明Zygote进程如何fork创建出SystemServer进程,需要知道的是SystemServer进程被fork()出来之后,到底是如何运行的,如果这个逻辑研究明白了,Zygote fork其它进程后,它们的运行逻辑也是相同的。linux程序在调用fork之后,如果创建成功,会返回两个pid, 其中一个是孩子的pid,上面代码在这个过程分析的时候需要特别注意

http://www.lryc.cn/news/142772.html

相关文章:

  • 【awd系列】Bugku S3 AWD排位赛-9 pwn类型
  • vcomp140.dll丢失的修复方法分享,电脑提示vcomp140.dll丢失修复方法
  • Docker file解析
  • 工作与身体健康之间的平衡
  • 算法和数据结构
  • 商城-学习整理-集群-K8S-集群环境部署(二十四)
  • 利用多种机器学习方法对爬取到的谷歌趋势某个关键词的每日搜索次数进行学习
  • ARL资产侦察灯塔 指纹增强
  • javaee spring 自动注入,如果满足条件的类有多个如何区别
  • sql语句中的ddl和dml
  • 学习JAVA打卡第四十一天
  • leetcode SQL题目
  • 计算机组成原理学习笔记-精简复习版
  • 聊一聊微前端框架的选型和实现 | 业务平台
  • Elasticsearch 集成---框架集成SpringData-集成测试-索引操作
  • 将Series序列中的缺失值用后一个值填充Series.bfill()
  • 用香港服务器域名需要备案吗?
  • 【项目经理】项目管理杂谈
  • 【算法总结篇】 笔面试常见题目
  • Java基础 数据结构一【栈、队列】
  • Spark on Yarn集群模式搭建及测试
  • vue 简单实验 v-on html事件绑定
  • c#设计模式-创建型模式 之 原型模式
  • 运放的分类、运放的参数
  • 手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率
  • 软件工程(二十) 系统运行与软件维护
  • 蓝蓝设计ui设计公司作品--泛亚高科-光伏电站控制系统界面设计
  • 软考高级系统架构设计师系列论文七十:论信息系统的安全体系
  • ​Softing dataFEED OPC Suite——助力数字孪生技术发展
  • LLaMA中ROPE位置编码实现源码解析