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

Android fork 进程 process(init/Zygote/SystemServer)

## Android的init/Zygote/SystemServer

  Android手机先开机,init/Zygote/SystemServer,然后启动Framework,然后启动Launcher;【安装APP(PMS),】然后启动APP(AMS)。所有的Android应用进程都是有Zygote进程fork出来的。

Android系统启动流程(一)解析init进程- http://blog.csdn.net/itachi85/article/details/54783506
Android系统进程Zygote启动过程的源代码分析- http://blog.csdn.net/luoshengyang/article/details/6768304
Framework启动过程浅析- https://blog.csdn.net/xsf50717/article/details/47167989
Android系统默认Home应用程序(Launcher)的启动过程源代码分析- http://blog.csdn.net/luoshengyang/article/details/6767736
Android应用程序安装过程(PMS)源代码分析- http://blog.csdn.net/luoshengyang/article/details/6766010
Android应用程序进程启动过程(AMS)的源代码分析- http://blog.csdn.net/luoshengyang/article/details/6747696

PackageManagerService启动流程源码解析- http://blog.csdn.net/u012124438/article/details/54882771
Android内核解读-应用的安装过程- http://blog.csdn.net/singwhatiwanna/article/details/19578947
Android apk动态加载机制的研究- http://blog.csdn.net/singwhatiwanna/article/details/22597587

Android源码分析-资源加载机制- http://blog.csdn.net/singwhatiwanna/article/details/24532419
Android窗口管理服务WindowManagerService - http://blog.csdn.net/luoshengyang/article/details/8462738

-- Android Fork进程,Fork Android App进程,Android 之 zygote 与进程创建。
  Android 的开机流程:init-> zygote-> system_service,这个很重要,学习这个过程,你可以学习到 Android 是一个分层的系统,对 Android 的整体架构会有了解。
  1. init->Zygote->SystemServer->启动App Activity;
  2. init-> Zygote->SystemServer-> AMS PMS等。

-- 在android运行环境中,Zygote进程是所有虚拟机进程的父亲,Zygote进程在开机初始化的时候会创建一个虚拟机,AMS发消息给Zygote创建的时候实际上是copy一份虚拟机的实例在子进程中。同时在初始化的时候还会注册一些android核心Jni的库放在虚拟机实例内提供上层api调用。fork出的虚拟机会共享这些jni类库。 那么实际上XPosed就是在root后对替换/system/bin/app_process并将注入XposedBridge.jar。app_process是用来控制Zygote的,通过替换成修改后的 app_process可以使Zygote进程加载到我们的XposedBridege.jar。而这个库就是用来做动态Hook java代码造成劫持的。

认识Zygote- 认识Zygote_zygote 是用什么写的-CSDN博客
  zygote主要用来孵化system_server进程和应用程序进程。在孵化出第一个进程system_server后通过runSelectLoopMode等待并处理消息,分裂应用程序进程仍由system_server控制。
  init 是 zygote的父进程, 而system_server和其他所有的com.xxx结尾的app应用程序都是从zygote fork 而来。
  系统中的两个重要服务PackageManagerService和ActivityManagerService,都是由SystemServer进程来负责启动的,而SystemServer进程本身是Zygote进程在启动的过程中fork出来的。
  在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。
  Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制。

-- 在android中,大部分的应用程序进程都是由zygote来创建的,为什么用大部分,因为还有一些进程比如系统引导进程、init进程等不是有zygote创建的。 在android中提到zygote,主要两块,一个是C/C++编写的zygote,主要用来为应用和SystemService fork进程的。一个是java编写的zygote接口,负责为应用和service调用C/C++ zygote的接口执行fork,从而创建VM进程。说明:在android中,service主要有NativeService和SystemService。SystemService主要是指系统中service,比如,InputMethodService、ActivityManagerService等。

-- Android fork process
 1.在android中SystemService的启动是在Zygote进程创建好后进行的,并且由Zygote进程建立好DVM运行环境,加载ZygoteInit的main函数,最终调用Zygote的本地方法forkSystemServer,并执行linux的fork方法创建SystemServer进程。
 2.应用程序的进程也是由Zygote创建的,在ActivityManagerService中的startProcessLocked中调用了Process.start()方法。并通过连接调用Zygote的native方法forkAndSpecialize,执行fork任务。
 3.应用进程和服务进程位于不同的进程中,他们之间是通过IPC进行数据传递的。

-- Android内核解读-Android系统的开机启动过程- http://blog.csdn.net/singwhatiwanna/article/details/19302593
  SystemServer作为zygote孵化的第一个Dalvik进程,其孵化过程在上面已经进行了描述,但是其和普通进程的启动略有不同,普通进程由Zygote.forkAndSpecialize来启动,而SystemServer由Zygote.forkSystemServer来启动,其次是SystemServer内部多创建了一个socket客户端。

-- Android源码解析之(八)-->Zygote进程启动流程- http://blog.csdn.net/qq_23547831/article/details/51104873
 init进程 –> Zygote进程 –> SystemServer进程 –>各种应用进程:
 1.init进程:linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程;
 2.Zygote进程:android系统的根进程,主要作用:可以作用Zygote进程fork出SystemServer进程和各种应用进程;
 3.SystemService进程:主要是在这个进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等等;
 4.各种应用进程:启动自己编写的客户端应用时,一般都是重新启动一个应用进程,有自己的虚拟机与运行环境;
 android系统中进程之间通讯的方式是Binder,但是有一个例外是SystemService进程与Zygote进程之间是通过Socket的方式进行通讯的。

  SystemServer进程主要的作用是启动各种系统服务,比如ActivityManagerService,PackageManagerService,WindowManagerService等服务,我们平时熟知的各种系统性的服务其实都是在SystemServer进程中启动的,而当我们的应用需要使用各种系统服务的时候其实也是通过与SystemServer进程通讯获取各种服务对象的句柄的进而执行相应的操作的。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于Java爬取微博数据(四) 获取 图片 or 视频
  • python手写了个简易的豆瓣影评爬虫
  • 【消息中间件】RabbitMQ
  • NC设计LFU缓存结构
  • 鸿蒙OS试题
  • three.js 着色器学习 聚集地
  • Ubuntu 20.04 源码编译安装OpenCV 4.5
  • stm32启动文件
  • 信贷业务流程优化与风控系统深度集成
  • popen和fgets函数
  • 一道ssrf题目--Web-ssrfme
  • vue3 composition 模式下watch object
  • 软考架构-构件技术
  • 高亮你的文字:CSS ::selection 伪元素的魔法
  • 关于springboot对接通义千问大模型的尝试(一)
  • 2017 年终总结 —— 在路上
  • Android Studio:GIT提交项目到远程仓库
  • Flex布局到底解决了什么问题
  • Java新版本的开发已正式进入轨道,版本号18.3
  • js
  • PermissionScope Swift4 兼容问题
  • React Transition Group -- Transition 组件
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • VUE es6技巧写法(持续更新中~~~)
  • zookeeper系列(七)实战分布式命名服务
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何编写一个可升级的智能合约
  • 深度学习在携程攻略社区的应用
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 用jQuery怎么做到前后端分离
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 在Unity中实现一个简单的消息管理器
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • # wps必须要登录激活才能使用吗?
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (3) cmake编译多个cpp文件
  • (C语言)fgets与fputs函数详解
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二)hibernate配置管理
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .gitignore文件忽略的内容不生效问题解决
  • .net core控制台应用程序初识
  • .Net IOC框架入门之一 Unity
  • .Net Memory Profiler的使用举例
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型