Android --- Zygote和System进程启动过程简要分析

Android --- Zygote和System进程启动过程简要分析

在看过《Android情景源代码》的Zygote启动章节后,作如下简要总结。Zygote进程在init进程启动过程中被以service服务的形式启动:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

class main

socket zygote stream 660 root system

第一行表示zygote进程是以服务的形式启动的,其对应的可执行程序是/system/bin/app_process,后面四个参数是它的启动参数。第二名表示在Zygote启动过程中,要在其内部创建一个名为zygote的socket,它在Linux下的权限是666,即所有用户多可以对它进行读写。

因为Zygote是以service的形式启动,所以在init启动过程中,android-5.1.0_r3\android5.1\system\core\init\init.c的service_start()函数会被调用。

service_start函数的主要工作是:

  • 通过fork()方法创建一个新的子线程,即Zygote线程
  • 调用create_socket()函数创建启动脚本中的zygote socket,并保存该socket的int型的文件描述符。创建时,还会为此socket创建一个类型为AF_UNIX的Socket地址,并调用bind()方法将socket与此地址进行绑定。该socket还有一个对应的设备文件,/dev/socket/zygote。
  • 创建完socket后,会调用publish_socket()函数将该socket发布到系统中。采用环境变量的方式,ANDROID_SOCKET_zygote -- socket的文件描述符。
  • 调用execve(svc->args[0]),执行app_process的主程序app_main.cpp。此时,代码进入到native层。

app_main.cpp的main函数的主要工作是:

  • 通过调用AppRuntime::start()函数,通过JNI的方式,进一步启动Zygote:AppRuntime.start("com.android.internal.os.ZygoteInit", args);args是参数列表,其中较重要的是标记是否要启动System进程、记录socket名称。

ZygoteInit的main函数的主要工作是:

  • 调用registerZygoteSocket("zygote")函数获取到zygote socket文件描述,并根据此描述符创建一个本地服务Socket:LocalServerSocket。这个服务Socket是用来等待Activity管理服务ActivityManagerService请求Zygote进程创建新的应用程序进程的。
  • 调用startSystemServer()函数启动System进程,以便它可以将系统的关键服务启动起来。该方法中通过forkSystemServer()函数创建System进程,最后调用handleSystemServerProcess()进一步启动System进程("com.android.server.SystemServer",通过反射技术),"--runtime-init"表示需要提供Binder服务。
  • 调用runSelectLoop()来等待Activity管理服务ActivityManagerService请求Zygote进程创建新的应用程序进程。

SystemServer的main函数的主要工作是:

  • 启动一个线程,启动系统的关键服务。
时间: 2024-10-12 19:15:16

Android --- Zygote和System进程启动过程简要分析的相关文章

Android应用程序的Activity启动过程简要介绍和学习计划

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6685853 在Android系统中,Activity和Service是应用程序的核心组件,它们以松藕合的方式组合在一起构成了一个完整的应用程序,这得益 于应用程序框架层提供了一套完整的机制来协助应用程序启动这些Activity和Service,以及提供Binder机制帮助它们相互间进行通信.在前 面的文章Android进程间通信(IPC)机制B

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

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

Android应用程序启动过程源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6689748 前文简要介绍了Android应用程序的Activity的启动过程.在Android系统中,应用程序是由Activity组成的,因此,应用程 序的启动过程实际上就是应用程序中的默认Activity的启动过程,本文将详细分析应用程序框架层的源代码,了解Android应用程序的启动过程. 在上一篇文章Android应用程序的Activit

Zygote和System进程的启动过程

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha #Zygote和System进程的启动过程 ##init脚本的启动 +------------+ +-------+ +-----------+ |Linux Kernel+--> |init.rc+-> |app_process| +------------+ +-------+ +-----------+ create and public server socket linu

Android应用程序进程启动过程的源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址: http://blog.csdn.net/luoshengyang/article/details/6747696 Android 应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信 机制:这两个特点都是在进程的初始化过程中实现的,本文将详细分析Android应用程序进程创建过程中是如何实现这两个特点的. Android应用程序框架层创建的应用程序进程

Android系统启动流程(一)解析init进程启动过程

前言 作为"Android框架层"这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程. 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init.本文将基于Androi

从源码角度看Android系统SystemServer进程启动过程

copy frome :https://blog.csdn.net/salmon_zhang/article/details/93208135 SystemServer进程是由Zygote进程fork生成,进程名为system_server,主要用于创建系统服务. 备注:本文将结合Android8.0的源码看SystemServer进程的启动过程以及SystemServer进程做了哪些重要工作. 1. SystemServer进程启动的起点从<从源码角度看Android系统Zygote进程启动过

Android世界第一个activity启动过程

Android世界第一个activity启动过程 第一次使用Markdown,感觉不错. Android系统从按下开机键一直到launcher的出现,是一个怎样的过程,中间都做出了什么操作呢,带着这些疑问开始源码之旅. 像windows操作系统一样,每个系统的启动都会有一个引导程序,在linux中,当引导程序启动linux内核后,会加载各种驱动和数据结构,当有了驱动之后,开始加载Android系统,开始进入linux世界的第一个进程:init进程. 在init.c的main中: int main

0-Android应用程序的Activity启动过程简要介绍和学习计划

源码分析 之 Activity启动过程简要介绍和学习计划 来源: http://blog.csdn.net/luoshengyang/article/details/6685853 声明: RTFSC(Read the fucking source code)是Linus的名言,也是学习IT技术一个重要手段.学习android最好手段就是对android进行系统分析,关于android系统的源码,CSDN的老罗分析分析是最系统一个.但是老罗的分析源码的blog,有几点不够好: 1.废话太多,可能