从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面 ...
随机推荐
- TouTiao开源项目 分析笔记16 新闻评论
1.要达到的效果 1.1.主要效果图 点击了标题栏的消息图标后,然后会跳转到评论详情的页面. 1.2.触发的点击事件 在新闻详情的片段中的菜单点击事件中 设置上方标题栏的消息标的监听事件 case R ...
- P1875 佳佳的魔法药水
P1875 佳佳的魔法药水 题目描述 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样焦急 万分!治好 MM 的病只有一种办法,那就是传说中的 0 号药水 ……怎么样才能 ...
- PL/SQL 循环语句
1.基本 LOOP 循环语句 语法: LOOP 语句序列; END LOOP; 其中,语句序列中需要一个EXIT语句或一个EXIT WHEN语句来中断循环. 实例: DECLARE x ) :; BE ...
- jmeter之录制控制器与代理的使用
1. 先启动jmeter,在测试计划中添加线程组 2. 选中线程组右键添加,在配置元件中点击HTTP请求默认值 3. 选中线程组右键添加,在逻辑控制器中点击录制控制 ...
- Java基础-4变量与数据类型
变量:变量是Java程序中的一个基本存储单元.变量是一个标识符.类型及一个可选初始值的组合定义.所有的变量都有一个作用域,即变量在某一区域有效. 基本的变量声明方式如下: int a; float b ...
- CodeForces A. Many Equal Substrings
http://codeforces.com/contest/1029/problem/A You are given a string tt consisting of nn lowercase La ...
- Centos安装后的一些必要处理工作
1永久关闭selinux,修改成permissive或者disabled(建议),修改完需重启 2配置network 3.禁止ping(可选,一般不需要禁止)(默认为0位启用ICMP协议,1为禁止), ...
- mysql常见面试题目
1, mysql的复制原理以及流程. (1)先问基本原理流程,3个线程以及之间的关联. (2)再问一致性,延时性,数据恢复. (3)再问各种工作遇到的复制bug的解决方法 2,mysql中myisam ...
- 【Luogu】P2154虔诚的墓主人(树状数组)
题目链接 这题就是考虑我们有这样一个情况
- hdu 2821 Pusher (dfs)
Pusher Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others)Total Subm ...