从linux看android之二--java世界的盘古女娲
在linux从内核态进入用户态运行init进程后启动的一个进程就是zygote。zygote是在android系统中创建java世界的盘古,他创建了第一个java虚拟机,同时他又是女娲,他成功地繁殖了Framework的核心system_server进程。zygote创建java世界的步骤为:
- 调用AppRuntime对象,并调用他的start,其余的活动都是AppRuntime控制。
- 调用startVm创建java虚拟机,然后调用strtReg来注册JNI函数。
- 通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入java世界。刚创建的java世界一穷二白什么都没有。
- 调用registerZygoteSocket,通过这个函数,他可以响应所有子孙的请求。到这里java世界有了一个牛叉的总管家,可以相应所有的子孙进程的请求。
- 通过调用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/] - zygote完成了java世界的初创工作,他已经很满足了。接着调用完runSelectLoopMode后就沉沉睡去了。但是他不像盘古一睡很久,而是比盘古更亲民,zygote一旦接到子孙后代的请求,就会随时醒来,为他们服务的。
参考资料:《深入理解Android》
从linux看android之二--java世界的盘古女娲的更多相关文章
- Java 世界的盘古和女娲 —— Zygote
本文基于 Android 9.0 , 代码仓库地址 : android_9.0.0_r45 文中源码链接: Zygote.java ZygoteInit.java ZygoteServer.java ...
- 从linux看Android之一--init进程
准备环境: 熟悉linux环境和shell脚本 用SSHDROID和XShell搭建android的命令行环境(帮助找到熟悉的linux界面,因为android删除了很多标准linux平台上很多的sh ...
- 使用Cydia Substrate 从Native Hook Android Java世界
这里介绍了如何使用Cydia Substrate Hook安卓Java世界.这篇文章介绍如何从Native中Hook 安卓Java世界. 手机端配置见之前文章. 一.建立工程 建立一个Android工 ...
- Android 开创java世界(JNI Invocation API)
在Android的世界中,由名称为app_process的C++本地应用程序(路径为:framework/base/cmds/app_process/app_main.cpp)调用JNI Invoca ...
- 用三维的视角理解二维世界:完美解释meshgrid函数,三维曲面,等高线,看完你就懂了。...
完美解释meshgrid函数,三维曲面,等高线 #用三维的视角理解二维世界 #完美解释meshgrid函数,三维曲面,等高线 import numpy as np import matplotlib. ...
- 浅谈 unix, linux, ios, android 区别和联系
浅谈 unix, linux, ios, android 区别和联系 网上的答案并不是很好,便从网上整理的相对专业的问答,本人很菜,大佬勿喷 UNIX 和 Linux UNIX 操作系统(尤尼斯) ...
- 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- Android 框架简介--Java环境(转)
==========================上=========================== 这里简单的介绍了Android的java环境基础,在后面一节中会结合具体的实例来理解这一节 ...
- 实验二Java面向对象程序设计实验报告(2)
实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...
随机推荐
- Django的Field(字段)
字段 1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=Tr ...
- svn Previous operation has not finished; run 'cleanup' if it was interrupted
svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted Usually, a ...
- 掌握OpenStack部署的最佳实践 打破部署失败的魔咒
部署OpenStack环境并不是一项简单的任务:根据SUSE最近的调查显示“曾经部署过OpenStack的企业当中有一半都失败了”.然而,随着最佳实践的出现,企业可以使用其避免在部署OpenStack ...
- Pascal小游戏 贪吃蛇
一段未完成的Pascal贪吃蛇 说这段代码未完成其实是没有源代码格式化,FP中一行最多只有255字符宽. uses crt; const screenwidth=50; screenheight=24 ...
- python学习笔记四:lambda表达式和switch
一.定义 lambda arg1,arg2... : returnValue 二.示例 #!/usr/bin/python def f(x,y): return x*y print f(2,3) g ...
- 23、php知识点总结基础教程--part-1
1.基本语法 PHP 脚本可放置于文档中的任何位置. PHP 脚本以 <?php 开头,以 ?> 结尾 <?php // 此处是 PHP 代码 ?> PHP 文件的默认文件扩展 ...
- Flask 教程精简版之一(系列片)
Flask 教程精简版之一(系列片) 现在连教程都有精简版 准备 1.要学会 Flask 之前必须掌握 Python 基本使用. 2.会使用简单的 HTML 效果更加 3.若想练气功必须先自暴自弃 简 ...
- Linux系统源码安装cloud-init
参考:https://cloud.tencent.com/document/product/213/12587使用以下命令下载 cloud-init 源码包 官网下载地址:https://launch ...
- vue 三目运算
:class="followed ? 'btn-success':'btn-secondary'"
- JavaWeb笔记(八)JQuery
三个版本 1.x:兼容 ie678,使用最为广泛的,官方只做BUG维护, 功能不再新增.因此一般项目来说,使用1.x版本就可以了 最终版本:1.12.4 2.x:不兼容ie678,很少有人使用,官方只 ...