详细分析Android-Zygote的启动过程

目录
  • 创建Socket
  • 启动SystemServer
  • 等待AMS

Android系统中,DVM,ART,应用程序进程和运行系统的关键服务的SystemServer进程都是Zygote创建的。他通过fork的形式来创建。由于Zygote在启动时会创建DVM或者ART,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM或者ART的实例副本。

在启动Zygote的时候,会根据ro.zygote属性来控制使用不同的Zygote启动脚本。启动脚本放在System/core/rootdir目录中。

Zygote在启动的时候会走到ZygoteInit的main方法,在这个方法中主要做了以下这些事:

  • 创建一个Server端的Socket
  • 预加载类和资源
  • 启动SystemServer进程
  • 等待AMS请求创建新的应用程序进程

通过JNI调用ZygoteInit的main方法后,Zygote便进入了java层,此前的所有代码都没有java层,Zygote开创了java框架层。

Zygote创建的Socket的name为zygote,用于等待ActivityManagerService请求Zygote创建新应用程序进程。

在启动了SystemServer进程后,系统的服务也会由SystemServer进程启动起来。

最后就会调用方法,等待AMS请求创建新的应用程序进程。

创建Socket

在创建Socket的时候,会创建一个名字,名字为【ANDROID_SOCKET_zygote】,通过这个名字获取环境变量的值,文件描符参数,最后创建一个文件描述符,在生成LocalServerSocket的时候传入。这个也就是服务端的Socket。Zygote将SystemServer进程启动后,就会在这个服务端的Socket上等待AMS的信号。

启动SystemServer

需要先创建一个args数组,用来保存启动SystemServer的启动参数。SystemServer进程的用户id和用户组id设置为1000,进程名字为system_server,启动的类名为:com.android.server.SystemServer。接着会调用Zygote的forkSystemServer方法,其内部会调用nativeForkSystemServer这个Native方法,最终通过fork函数在当前进程创建一个子进程,就是SystemServer进程。如果forkSystemServer方法返回的pid为0,表示当前代码运行在新创建的子进程中,则会执行handleSystemServerProcess来处理SystemServer进程。

等待AMS

获取到前面创建的Socket的fd字段的值,添加到一个fds列表中。接下来就无限循环等待AMS的请求。会有一个无限循环,在这个循环中会将fds的数据转移到pollFds数组上,然后对pollFds进行遍历,遍历的同时会判断当前Zygote进程是否与AMS建立了连接。如果建立了连接,调用acceptCommamdPeer方法得到ZygoteConnection类并添加到Socket连接列表peers中。然后将ZygoteConnection的fd添加到fds列表中,以便可以接收AMS发送过来的请求。如果在遍历pollFds的时候不是与AMS建立连接,那么就是创建应用的请求,回调用ZygoteConnection的runOnce方法创建一个新的应用程序进程,创建成功后会将这个Socket从peers和fds中清除。

Zygote进程启动总结:

  • 启动Zygote进程
  • 创建虚拟机,为Java虚拟机注册JNI方法
  • 通过JNI调用ZygoteInit的main函数,进入Java框架层
  • 通过registerZygoteSocket方法创建服务端Socket,通过funSelectLoop方法等待AMS请求。
  • 启动SystemServer进程

以上就是Android-Zygote启动过程详解的详细内容,更多关于Android-Zygote启动的资料请关注我们其它相关文章!

(0)

相关推荐

  • 代码实例分析android中inline hook

    以下内容通过1.实现目标注入程序,2.实现主程序,3.实现注入函数,4.thumb指令集实现等4个方面详细分析了android中inline hook的用法,以下是全部内容: 最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍,打算写几个博客把它们记录下来. 第一次介绍一下我感觉难度最大的inline hook,实现代码参考了腾讯GAD的游戏安全入门. inline hook的大致流程如下: 首先将目标指令替换为跳转指令,跳转地址为一段我们自己编写的汇编代码,这段汇编代码先是执行用户指定的

  • Android下hook点击事件的示例

    Hook是一种思想,也就是将原来的事件,替换到我们自己的事件,方便我们做一些切入处理.目的是不修改原来的代码,同时也避免遗漏的N多类里面处理. 最近需要在现有的app中设置统计埋点.去业务代码里埋的话似乎耦合度太高.所以决定使用hook的方法对事件进行埋点处理. 这里先记一下对点击事件hook的基本流程. 1.先建一个代理类实现View.OnClickListener,用来做点击后的后续处理. import android.view.View; /** * 实现点击监听 */ public cl

  • Android zygote启动流程详解

    对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并启动的. 作用 zygote进程在启动时,会创建一个Dalvik虚拟机实例,每次孵化新的应用进程时,都会将这个Dalvik虚拟机实例复制到新的应用程序进程里面,从而使得每个应用程序进程都有一个独立的Dalvik虚拟机实例. zygote进程的主要作用有两个: 启动SystemServer. 孵化应用

  • Hook实现Android 微信、陌陌 、探探位置模拟(附源码下载)

    Hook实现Android 微信.陌陌 .探探位置模拟 最近需要对微信,陌陌等程序进行位置模拟 实现世界各地发朋友圈,搜索附近人的功能,本着站在巨人肩膀上的原则 爱网上搜索一番. 也找到一些 代码和文章,但是代码大都雷同而且都有一个弊端 比如说 微信 对目标函数实现hook之后第一次打开微信 第一次定位是可以改变的 但是 我如果想更换地址的话 就需要重启手机了,重新加载hook了,试了很多次都是这样满足不了需求. 为了改进这个地方我们从gps定义的源代码流程开始看寻找hook系统函数的突破口 我

  • android的got表HOOK实现代码

    概述 对于android的so文件的hook根据ELF文件特性分为:Got表hook.Sym表hook和inline hook等. 全局符号表(GOT表)hook,它是通过解析SO文件,将待hook函数在got表的地址替换为自己函数的入口地址,这样目标进程每次调用待hook函数时,实际上是执行了我们自己的函数. Androd so注入和函数Hook(基于got表)的步骤: 1.ptrace附加目标pid进程; 2.在目标pid进程中,查找内存空间(用于存放被注入的so文件的路径和so中被调用的函

  • 详细分析Android中实现Zygote的源码

    概述 在Android系统中,所有的应用程序进程,以及用来运行系统关键服务的System进程都是由zygote进程负责创建的.因此,我们将它称为进程孵化器.zygote进程是通过复制自身的方式来创建System进程和应用程序进程的.由于zygote进程在启动时会在内部创建一个虚拟机实例,因此,通过复制zygote进程而得到的System进程和应用程序进程可以快速地在内部获得一个虚拟机实例拷贝. zygote进程在启动完成之后,会马上将System进程启动起来,以便它可以将系统的关键服务启动起来.

  • 分析Android Activity的启动过程

    分析Android Activity的启动过程 对于Android Activity 的启动过程,我在Android源码中读了好久的源码,以下是我整理出来的Activity启动过程和大家分享下: Activity作为Android的四大组件之一,也是最基本的组件,负责与用户交互的所有功能.Activity的启动过程也并非一件神秘的事情,接下来就简单的从源码的角度分析一下Activity的启动过程. 根Activity一般就是指我们项目中的MainActivity,代表了一个android应用程序

  • Android 系统服务TelecomService启动过程原理分析

    由于一直负责的是Android Telephony部分的开发工作,对于通信过程的上层部分Telecom服务以及UI都没有认真研究过.最近恰好碰到一个通话方面的问题,涉及到了Telecom部分,因而就花时间仔细研究了下相关的代码.这里做一个简单的总结.这篇文章,主要以下两个部分的内容: 什么是Telecom服务?其作用是什么? Telecom模块的启动与初始化过程: 接下来一篇文章,主要以实际通话过程为例,分析下telephony收到来电后如何将电话信息发送到Telecom模块以及Telecom是

  • 详细分析Android中onTouch事件传递机制

    onTach介绍 ontach是Android系统中整个事件机制的基础.Android中的其他事件,如onClick.onLongClick等都是以onTach为基础的. onTach包括从手指按下到离开手机屏幕的整个过程,在微观形式上,具体表现为action_down.action_move和action_up等过程. onTach两种主要定义形式如下: 1.在自定义控件中,常见的有重写onTouchEvent(MotionEvent ev)方法.如在开发中经常可以看到重写的onTouchEv

  • 简要分析linux系统的启动过程

    接触linux系统运维已经好几年了,常常被问到linux系统启动流程问题,刚好今天有空来梳理下这个过程: 一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下几步: 1)开机BIOS自检,加载硬盘. 2)读取MBR,进行MBR引导. 3)grub引导菜单(Boot Loader). 4)加载内核kernel. 5)启动init进程,依据inittab文件设定运行级别 6)init进程,执行rc.sysinit文件. 7)启动内核模块,执行不同级别的脚本

  • 详细分析android的MessageQueue.IdleHandler

    我们知道android是基于Looper消息循环的系统,我们通过Handler向Looper包含的MessageQueue投递Message, 不过我们常见的用法是这样吧? 一般我们比较少接触MessageQueue, 其实它内部的IdleHandler接口有很多有趣的用法,首先看看它的定义: 简而言之,就是在looper里面的message暂时处理完了,这个时候会回调这个接口,返回false,那么就会移除它,返回true就会在下次message处理完了的时候继续回调,让我们看看它有哪些有趣的用

  • 详解Android中的ActivityThread和APP启动过程

    ActiviryThread ActivityThread的初始化 ActivityThread即Android的主线程,也就是UI线程,ActivityThread的main方法是一个APP的真正入口,MainLooper在它的main方法中被创建. //ActivityThread的main方法 public static void main(String[] args) { ... Looper.prepareMainLooper(); ActivityThread thread = ne

  • 分析Android中应用的启动流程

    前言 在我们开始之前,希望您能最好已经满足以下条件: 1.有一份编译后的Android源码(亲自动手实践才会有更深入的理解) 2.对Binder机制有一定的了解 本文启动流程分析基于Android 5.1的源码.为什么是5.1的源码呢?因为手边编译完的代码只有这个版本-另外,用什么版本的源码并不重要,大体的流程并无本质上的区别,仅仅是实现细节的调整,找一个你熟悉的版本就好. 1.启动时序图 作为一个轻微强迫症的人,整理的时序图,相信大家按图索骥,一定能搞明白整个启动流程: 说明:为了让大家更清楚

  • Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    在前面一篇文章Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路中,介绍了在Android系统中Binder进程间通信机制中的Server角色是如何获得Service Manager远程接口的,即defaultServiceManager函数的实现.Server获得了Service Manager远程接口之后,就要把自己的Service添加到Service Manager中去,然后把自己启动起来,等待Client的请求.

  • 详细分析Android-Zygote的启动过程

    目录 创建Socket 启动SystemServer 等待AMS Android系统中,DVM,ART,应用程序进程和运行系统的关键服务的SystemServer进程都是Zygote创建的.他通过fork的形式来创建.由于Zygote在启动时会创建DVM或者ART,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM或者ART的实例副本. 在启动Zygote的时候,会根据ro.zygote属性来控制使用不同的Zygote启动脚本.启动脚本放在System/c

随机推荐