在linux从内核态进入用户态运行init进程后启动的一个进程就是zygote。zygote是在android系统中创建java世界的盘古,他创建了第一个java虚拟机,同时他又是女娲,他成功地繁殖了Framework的核心system_server进程。zygote创建java世界的步骤为:

  1. 调用AppRuntime对象,并调用他的start,其余的活动都是AppRuntime控制。
  2. 调用startVm创建java虚拟机,然后调用strtReg来注册JNI函数。
  3. 通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入java世界。刚创建的java世界一穷二白什么都没有。
  4. 调用registerZygoteSocket,通过这个函数,他可以响应所有子孙的请求。到这里java世界有了一个牛叉的总管家,可以相应所有的子孙进程的请求。
  5. 通过调用startSystemServer分裂一个子进程system_server来管理java世界。system_server是SystemServer的进程名,SystemServer也可以简称SS。
    pid =Zygote.forkSystemServer();
    if( pid== ){
    handleSystemServerProcess(parseArgs);#引用自《深入理解Android》
    }

    从代码中可以看出:SS诞生后就和Zygote分道扬镳了,他有了新的使命。SS调用zygoteInitNative后,将与Binder通信系统建立联系,这样SS就能使用Binder了。java的核心的service--包括电源管理服务、电池管理服务、WindowManager服务、ActivityManager服务都是在这里启动的,并且这几个重要的service都是有看门狗定期巡逻的,一旦发现问题就强制重启java世界。init是进入用户态的第一个进程,所有的服务都在init里启动,同样的SS是java世界的第一个进程,所有的服务也都是在这里启动的。init作为所有进程的第一个进程自然要处理IPC通信,所以回写了/process和/dev,同样的java的第一个进程也要处理进程间通信,所以先用了BInder机制。android apk运行的程序其父进程都是zygote

    / # ps -l #不知是不是环境的问题 ps -l命令没有显示ppid 待验证
    PID USER TIME COMMAND
    : /init
    : [kthreadd]
    : [ksoftirqd/]
  6. zygote完成了java世界的初创工作,他已经很满足了。接着调用完runSelectLoopMode后就沉沉睡去了。但是他不像盘古一睡很久,而是比盘古更亲民,zygote一旦接到子孙后代的请求,就会随时醒来,为他们服务的。

参考资料:《深入理解Android》

从linux看android之二--java世界的盘古女娲的更多相关文章

  1. Java 世界的盘古和女娲 —— Zygote

    本文基于 Android 9.0 , 代码仓库地址 : android_9.0.0_r45 文中源码链接: Zygote.java ZygoteInit.java ZygoteServer.java ...

  2. 从linux看Android之一--init进程

    准备环境: 熟悉linux环境和shell脚本 用SSHDROID和XShell搭建android的命令行环境(帮助找到熟悉的linux界面,因为android删除了很多标准linux平台上很多的sh ...

  3. 使用Cydia Substrate 从Native Hook Android Java世界

    这里介绍了如何使用Cydia Substrate Hook安卓Java世界.这篇文章介绍如何从Native中Hook 安卓Java世界. 手机端配置见之前文章. 一.建立工程 建立一个Android工 ...

  4. Android 开创java世界(JNI Invocation API)

    在Android的世界中,由名称为app_process的C++本地应用程序(路径为:framework/base/cmds/app_process/app_main.cpp)调用JNI Invoca ...

  5. 用三维的视角理解二维世界:完美解释meshgrid函数,三维曲面,等高线,看完你就懂了。...

    完美解释meshgrid函数,三维曲面,等高线 #用三维的视角理解二维世界 #完美解释meshgrid函数,三维曲面,等高线 import numpy as np import matplotlib. ...

  6. 浅谈 unix, linux, ios, android 区别和联系

    浅谈 unix, linux, ios, android 区别和联系 网上的答案并不是很好,便从网上整理的相对专业的问答,本人很菜,大佬勿喷 UNIX 和 Linux   UNIX 操作系统(尤尼斯) ...

  7. 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  8. Android 框架简介--Java环境(转)

    ==========================上=========================== 这里简单的介绍了Android的java环境基础,在后面一节中会结合具体的实例来理解这一节 ...

  9. 实验二Java面向对象程序设计实验报告(2)

    实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...

随机推荐

  1. oracle11g导出表时空表导不出解决方案

    oracle11g用exp命令导出数据库表时,有时会发现只导出了一部分表时而且不会报错,原因是有空表没有进行导出,之前一直没有找到方法于是用最笨的方法重新建这些空表,当然在我们实际当中表的数量大时我们 ...

  2. 十四、pymysql模块

    一.安装的两种方法 第一种 #安装 pip3 install pymysql 第二种 二.链接,执行sql,关闭(游标) import pymysql user= input('用户名:>> ...

  3. samba server on Mac OS X Lion Server

    一般Mac共享通过配置wins,smb即可实现.注意在同一个工作组! 参考:http://computers.tutsplus.com/tutorials/how-to-set-up-an-smb-s ...

  4. 【Spiral Matrix II】cpp

    题目: Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. ...

  5. PhpStorm 格式化中花括号缩进方式

    格式化前: function func() { return ; } 格式化后: function func() { return ; } 在PhpStorm中的配置:File -> Setti ...

  6. Spider_Man_6 の Scrapy_Downloader Middleware(针对一下🐷🐷🐷)

    下载器中间件(Downloader Middleware) 下载器中间件是介于Scrapy的request/response处理的钩子框架.是用于全局修改Scrapy request和response ...

  7. Opencv3.2.0安装包

    这个资源是Opencv3.2.0安装包,包括Windows软件包,Android软件包,IOS软件包,还有opencv的源代码:需要的下载吧. 点击下载

  8. UTXO是什么?

    以易于理解的方式解释了比特币交易中的"UTXO" UTXO 2017年11月1日 让我们看看当你发一点硬币时会发生什么. 比特币交易通过UTXO执行.通过在比特硬币的所有交易中新生 ...

  9. GDI+实现双缓冲绘图方法一

    private void Form5_MouseMove(object sender, MouseEventArgs e) { int intOX = rectDrawArea.X; int intO ...

  10. 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set

    题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...