Android 源码阅读笔记
Zygote:
、Zygote 是系统启动之后创建的第二个进程
2、Zygote 创建zygote Socket、虚拟机
3、Zygote 在虚拟机中通过forkSystemServer, 创建Server进程, 并且在其中启动服务(AMS、PMS等)
4、Zygote 在虚拟机中注册zygote套接字,循环监听AMS的请求,创建新的进程
Server: (PS:版本不同,创建服务的方法也有很大不同,以下为5.1.1版本)
1、Zygote fork自己,为Server创建新的子进程之后,调用handleSystemServerProcess 来启动服务
2、handleSystemServerProcess 方法接着调用了 invokeStaticMain方法启动了SystemServer的main方法
3、在main方法中,调用 SystemServer 的run方法
4、其中的 startBootstrapServices 、 startCoreServices 、startOtherServices 分别用来启动不同的服务(AMS、PMS、WMS、CS等)
应用程序进程的创建:
例如:启动一个新的App,或者在另外进程的Activity、Servicec
1、ActivityManagerService创建Activity时,如果它所在的进程不存在,则调用startProcessLocked创建新的进程
2、依次调用方法Process.start、 Process.statViaZygote、Process.openZygoteSocketIfNeeded、Process.zygoteSendArgsAndGetResult;
3、在zygoteSendArgsAndgetResult中使用套接字连接到Zygote进程的LocalSocket,并且将创建进程的指令写入;并且读取创建进程成功后的pid 在Zygote进程中
1、runSelectLoop方法中循环监听套接字
2、收到指令,调用runOnce方法处理请求
3、在runOnce中调用Zygote.forkAndSpecialize方法来创建进程,然后调用handleChildProc启动进程。
4、最终调用ZygoteInit.invokeStaticMain方法,启动ActivityThread的main方法
Binder线程池的启动:
、进程创建成功依次调用zygoteInit、nativeZygoteInit、com_android_internal_os_RuntimeInit_nativeZygoteInit、onZygoteInit(位于AppRuntime 中)
2、Zygote进程启动的时候,会在进程中创建一个AppRuntime对象,故每一个新创建的进程都有一个该对象
3、onZygoteInit 中, 使用ProcessState中的startThreadPool启动Binder线程池
消息循环的建立:
、进程创建成功之后,会使用invokeStaticMain方法调用ActivityThread的main方法
2、通过抛出异常MethodAndArgsCaller,在ZygoteInit.main方法的异常捕获中执行反射调用main方法
小结:
1、Zygote是一个进程,它有自己的虚拟机
2、AMS、WMS、PMS等在一个进程,运行在虚拟机中,由Zygote创建
3、Zygote 用来接收AMS的指令,创建新的进程 4、通过脚本启动init进程
5、init进程中fork出一个子进程zygote
6、在zygote进程中创建虚拟机
7、在zygote的虚拟机中创建创建服务进程(Zygote.forkSystemServer--》Zygote.nativeForkSystemServer)
8、在服务进程中启动服务:ZygoteInit.handleSystemServerProcess-->RuntimeInit.zygoteInit方法启动binder线程池(启动SystemServer.main、启动AMS、WMS等)
9、在zygote虚拟机中启动循环监听本地zygote套接字
10、zygote进程,接收到创建进程的命令,通过Zygote.forkAndSpecialize-->Zygote.nativeForkAndSpecialize创建进程;创建之后通过ZygoteConnection.handleChildProc--》RuntimeInit.zygoteInit(创建Binder线程池、调用ActivityThread.main)
11、RuntimeInit.zygoteInit会根据传入的参数不同,启动不同的类的main方法,来实现不同的功能,相同点是它都会创建一个binder线程池, 所以不管是服务进程还是应用程序进程都包含有binder线程池,都可以通过binder进行进程间通讯。
Android 源码阅读笔记的更多相关文章
- Android源码阅读笔记二 消息处理机制
消息处理机制: .MessageQueue: 用来描述消息队列2.Looper:用来创建消息队列3.Handler:用来发送消息队列 初始化: .通过Looper.prepare()创建一个Loope ...
- CI框架源码阅读笔记5 基准测试 BenchMark.php
上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...
- CI框架源码阅读笔记4 引导文件CodeIgniter.php
到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...
- CI框架源码阅读笔记3 全局函数Common.php
从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...
- CI框架源码阅读笔记2 一切的入口 index.php
上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...
- 源码阅读笔记 - 1 MSVC2015中的std::sort
大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
- Three.js源码阅读笔记-5
Core::Ray 该类用来表示空间中的“射线”,主要用来进行碰撞检测. THREE.Ray = function ( origin, direction ) { this.origin = ( or ...
- PHP源码阅读笔记一(explode和implode函数分析)
PHP源码阅读笔记一一.explode和implode函数array explode ( string separator, string string [, int limit] )此函数返回由字符 ...
- AQS源码阅读笔记(一)
AQS源码阅读笔记 先看下这个类张非常重要的一个静态内部类Node.如下: static final class Node { //表示当前节点以共享模式等待锁 static final Node S ...
随机推荐
- SUMIF
SUMIF(range,criteria,sum_range) Range:条件区域,用于条件判断的单元格区域. Criteria:求和条件,由数字.逻辑表达式等组成的判定条件.criteria 参数 ...
- macbook 上安装git和将github作为托管服务器
首先安装git,进入官网并下载:地址,下载后并安装,可以通过输入命令行,查看是否安装成功: sh-3.2# git --version git version 2.7.1 安装好后,我们来配置我们的g ...
- Linux-系统负载
cat /proc/loadavg 最直接查看系统平均负载命令 root@Slyar.com:~# cat /proc/loadavg 0.10 0.06 0.01 1/72 29632 除了前3个数 ...
- LLVM和clang
LLVM编译器架构 LLVM项目是一套工具的集合,它包括模块化.可复用的编译器及一些列工具链技术. LLVM最开始是Low Level Virtual Machine的简称,但现在它并不是传统意义上的 ...
- 支持向量机-SVM 学习
一 .支持向量机(SVM) 1.1 符号定义 标签 y 不再取 0 或 1,而是: y∈{-1, 1} 定义函数: 向量,没有第 0 个维度,b 为截距,预测函数定义为: 1.2 函数间隔与几何间隔 ...
- webpack window 添加第三方库
有的时候还想来点jquery,moment,undersocre之类的库,webpack可以非常容易的做到这一点,有谣言说Bower即将停止开发了, 作者推荐都使用npm来管理依赖.那么我们现在安装在 ...
- 安卓ListView中CheckBox的使用(支持Item列表项的删除,全选,全不选)
ListView 自身提供了 CheckBox 只需要添加一行代码 getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 但是这种实现 ...
- 【Android】Android实现Handler异步详解
方式不止一种,这里使用的是Timer类,创建一个定时器.我们经常需要获得移动设备端口的显示屏信息,但是onCreate()方法执行的时候,OnShow()方法不一定执行了,也就是说,在执行Oncrea ...
- 【MySQL】mysql在Windows下使用mysqldump命令备份数据库
在cmd窗口中使用mysqldump命令首先需要配置环境变量 1,在计算机中找到MySQL的安装位置,找到MySQL Workbench,比如我的是C:\Program Files\MySQL\MyS ...
- Win10下Clion配置opencv3
本人不想在爱机装一个vs2013或者vs2015这种庞然大物,可是手头要弄一个基于windows的opencv项目,就只好装了个Clion,期间踩了不少坑,记录一下. 参考网址:http://www. ...