1.基本过程

  1. init脚本的启动Zygote
  2. Zygote进程的启动
  3. System进程的启动
  4. Android应用进程启动过程

2.init脚本的启动

+------------+    +-------+   +-----------+
|Linux Kernel+--> |init.rc+-> |app_process|
+------------+ +-------+ +-----------+
create and public
server socket

  linux内核加载完成后,运行init.rc脚本

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666
  • /system/bin/app_process Zygote服务启动的进程名
  • --start-system-server 表明Zygote启动完成之后,要启动System进程。
  • socket zygote stream 666 在Zygote启动时,创建一个权限为666的socket。此socket用来请求Zygote创建新进程。socket的fd保存在名称为“ANDROID_SOCKET_zygote”的环境变量中。

3.Zygote进程的启动过程

 create rumtime
+-----------+ +----------+
|app_process+----------> |ZygoteInit|
+-----------+ +-----+----+
|
|
| registerZygoteSocket()
|
+------+ startSystemServer() |
|System| <-------+ |
+------+ fork | runSelectLoopMode()
|
v

3.1 app_process进程

  /system/bin/app_process 启动时创建了一个AppRuntime对象。通过AppRuntime对象的start方法,通过JNI调用创建了一个虚拟机实例,然后运行 com.android.internal.os.ZygoteInit类的静态main方法,传递true(boolean startSystemServer)参数。

3.2 ZygoteInit类

  ZygoteInit类的main方法运行时,会通过registerZygoteSocket方法创建一个供 ActivityManagerService使用的server socket。然后通过调用startSystemServer方法来启动System进程。最后通过runSelectLoopMode来等待AMS的 新建进程请求。

  • 在registerZygoteSocket方法中,通过名为ANDROID_SOCKET_zygote的环境获取到zygote启动时创建的socket的fd,然后以此来创建server socket。
  • 在startSystemServer方法中,通过Zygote.forkSystemServer方法创建了一个子进程,并将其用户和用户组的ID设置为1000。
  • 在runSelectLoopMode方法中,会将之前建立的server socket保存起来。然后进入一个无限循环,在其中通过selectReadable方法,监听socket是否有数据可读。有数据则说明接收到了一个 请求。 selectReadable方法会返回一个整数值index。如果index为0,则说明这个是AMS发过来的连接请求。这时会与AMS建立一个新的 socket连接,并包装成ZygoteConnection对象保存起来。如果index大于0,则说明这是AMS发过来的一个创建新进程的请求。此时 会取出之前保存的ZygoteConnection对象,调用其中的runOnce方法创建新进程。调用完成后将connection删除。 这就是Zygote处理一次AMS请求的过程。

4.System进程的启动

 +
|
|
v fork()
+--------------+
|System Process|
+------+-------+
|
| RuntimeInit.zygoteInit() commonInit, zygoteInitNative
| init1() SurfaceFlinger, SensorServic...
|
|
| init2() +------------+
+-------> |ServerThread|
| +----+-------+
| |
| | AMS, PMS, WMS...
| |
| |
| |
v v

  System进程是在ZygoteInit的handleSystemServerProcess中开始启动的。

  • 首先,因为System进程是直接fork Zygote进程的,所以要先通过closeServerSocket方法关掉server socket。
  • 调用RuntimeInit.zygoteInit方法进一步启动System进程。在zygoteInit中,通过commonInit方法设 置时区和键盘布局等通用信息,然后通过zygoteInitNative方法启动了一个Binder线程池。最后通过invokeStaticMain方 法调用SystemServer类的静态Main方法。
  • SystemServer类的main通过JNI调用cpp实现的init1方法。在init1方法中,会启动各种以C++开发的系统服务(例如 SurfaceFlinger和SensorService)。然后回调ServerServer类的init2方法来启动以Java开发的系统服务。
  • 在init2方法中,首先会新建名为"android.server.ServerThread"的ServerThread线程,并调用其 start方法。然后在该线程中启动各种Service(例如AMS,PMS,WMS等)。启动的方式是调用对应Service类的静态main方法。
  • 首先,AMS会被创建,但未注册到ServerManager中。然后PMS被创建,AMS这时候才注册到ServerManager中。然后到ContentService、WMS等。 注册到ServerManager中时会制定Service的名字,其后其他进程可以通过这个名字来获取到Binder Proxy对象,以访问Service提供的服务。
  • 执行到这里,System就将系统的关键服务启动起来了,这时候其他进程便可利用这些Service提供的基础服务了。
  • 最后会调用ActivityManagerService的systemReady方法,在该方法里会启动系统界面以及Home程序。

5.Android应用进程启动过程

   +----------------------+       +-------+      +----------+   +----------------+   +-----------+
|ActivityManagerService| |Process| |ZygoteInit| |ZygoteConnection| |RuntimeInit|
+--------------+-------+ +---+---+ +-----+----+ +-----------+----+ +------+----+
| | | | |
| | | | |
startProcessLocked() | | | |
+---------------> | | | | |
| start() | | | |
| "android.app.ActivityThread" | | |
+-----------------> | | | |
| | | | |
| | | | |
| |openZygoteSocketIfNeeded() | |
| +------+ | | |
| | | | | |
| | <----+ | | |
| | | | |
| |sZygoteWriter.write(arg) | |
| +------+ | | |
| | | | | |
| | | | | |
| | <----+ | | |
| | | | |
| +--------------> | | |
| | | | |
| | |runSelectLoopMode() | |
| | +-----------------+ | |
| | | | | |
| | | <---------------+ | |
| | | acceptCommandPeer() |
| | | | |
| | | | |
| | | runOnce() | |
| | +------------------> | |
| | | |forkAndSpecialize()
| | | +-------------+ |
| | | | | |
| | | | <-----------+ |
| | | | handleChildProc()
| | | | |
| | | | |
| | | | |
| | | | zygoteInit() |
| | | +-------------> |
| | | | |
| | | | |in^okeStaticMain()
| | | | +---------------->
| | | | |("android.app.ActivityThread")
| | | | |
| | | | |
+ + + + +
  • AMS向Zygote发起请求(通过之前保存的socket),携带各种参数,包括“android.app.ActivityThread”。
  • Zygote进程fork自己,然后在新Zygote进程中调用RuntimeInit.zygoteInit方法进行一系列的初始化(commonInit、Binder线程池初始化等)。
  • 新Zygote进程中调用ActivityThread的main函数,并启动消息循环。

Zygote和System进程的启动过程、Android应用进程启动过程的更多相关文章

  1. Zygote和System进程的启动过程

    ##init脚本的启动 +------------+ +-------+ +-----------+ |Linux Kernel+--> |init.rc+-> |app_process| ...

  2. Zygote及System进程启动

    1.  init 根据init.rc 运行 app_process, 并携带‘--zygote' 和 ’--startSystemServer' 参数. 2.  AndroidRuntime.cpp: ...

  3. 比较windows phone程序启动和android程序启动原理

    windows phone 程序是如何启动的了,他和android程序有什么区别,我们重点从native code 层面来分析 在windows phone 程序启动的时候是: 在XAML中使用应用程 ...

  4. Android Activity启动流程, app启动流程,APK打包流程, APK安装过程

    1.Activity启动流程 (7.0版本之前) 从startActivity()开始,最终都会调用startActivityForResult() 在该方法里面会调用Instrumentation. ...

  5. Android Activity启动流程源码全解析(1)

    前言 Activity是Android四大组件的老大,我们对它的生命周期方法调用顺序都烂熟于心了,可是这些生命周期方法到底是怎么调用的呢?在启动它的时候会用到startActivty这个方法,但是这个 ...

  6. Android应用启动、退出分析

    http://www.jianshu.com/p/72059201b10a §AMS和应用进程 §应用启动流程 §应用退出流程 §启动.退出消息 AMS和应用进程 应用进程 <- 系统管理 &l ...

  7. 笔记:Zygote和SystemServer进程启动过程

    简述 Android设备启动过程中,先是Linux内核加载完,接着Android中的第一个进程init启动,它会启动一些需要开机启动的进程. Zygote就是进程init启动起来的.Android中所 ...

  8. android开机启动过程

    Android系统开机主要经历三个阶段: bootloader启动 Linux启动 Android启动 启动文件: 对于机器从通电到加载Linux系统一般需要三个文件:bootloader(引导文件) ...

  9. android app启动过程(转)

    Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...

随机推荐

  1. Visual Studio VS如何切换代码自动换行

    工具-选项-文本编辑器-自动换行      

  2. 有两个字符串a,b。假设a="ab",b="cd",判断字符串c="acbd"是属于a、b的组合。满足组合后a、b的内部顺序均不变。

    #include<iostream> #include<string> using namespace std; int check(string a,string b,str ...

  3. IO流(字节流复制)01

    package ioDemo; import java.io.*; /** * IO流(字节流复制) * Created by lcj on 2017/11/2. */ public class bu ...

  4. 树莓派的PWM脉宽调制功能介绍

    近期想用树莓派控制航模的电调,于是研究了下PWM.貌似控制电调比較麻烦,由于电调须要发送几个特定的信号启动,然后才干进入控制模式.今天先弄明确PWM,慢慢折腾.以下的程序亲測可用,我用的树莓派mode ...

  5. 解决input,number类型的maxlength无效

    使用input数字number类型的时候maxlength无效,假设需要控制输入数量为5,可以用以下方式: 无效: <input type="text"  maxlength ...

  6. Koa2学习(二)async/await

    Koa2学习(二)async/await koa2中用到了大量的async/await语法,要学习koa2框架,首先要好好理解async/await语法. async/await顾名思义是一个异步等待 ...

  7. sql server 支持中文繁体和简体

    SET ANSI_PADDING ON  INSERT INTO 表 VALUES (N'中文')

  8. Newtonsoft.Json.dll 反序列化JSON字符串

    上一篇JSON博客<JSON入门级学习小结--JSON数据结构>中已对JSON做了简单介绍,JSON字符串数组数据样式大概是这样子的: 如今因为项目需求(asp.net web网站,前台向 ...

  9. Where Are You Standing?

    /*********************************************************************** * Where Are You Standing? * ...

  10. bzoj 1086 王室联邦 —— 思路题

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1086 一眼看去很是不会,于是看看TJ... https://blog.csdn.net/ly ...