【Android】系统架构功能+init、zygote、system server、app等进程间关系分析
文章目录
- 架构功能
- Loader层
- Linux内核层
- 硬件抽象层 (HAL)
- Android Runtime & 系统库
- Framework层
- App层
- Syscall && JNI
- 进程关系
- init进程
- Zygote进程
- 自动重启机制
- fork机制
- system_server进程
- app进程
概览:http://gityuan.com/android/
Android系统启动过程由上图从下往上的一个过程是由Boot Loader引导开机,然后依次进入 -> Kernel -> Native -> Framework -> App
架构功能
Loader层
Boot ROM: 当手机处于关机状态时,长按Power键开机,引导芯片开始从固化在ROM里的预设代码开始执行,然后加载引导程序到RAM;
Boot Loader:这是启动Android系统之前的引导程序,主要是检查RAM,初始化硬件参数等功能。
Linux内核层
- 启动swapper进程(pid=0):该进程又称为idle进程, 系统初始化过程Kernel由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作;
- 启动kthreadd进程(pid=2):是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。kthreadd进程是所有内核进程的鼻祖
硬件抽象层 (HAL)
硬件抽象层 (HAL) 提供标准接口,HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口
Android Runtime & 系统库
Native系统库主要包括init孵化来的用户空间的守护进程、HAL层以及开机动画等。启动init进程(pid=1),是Linux系统的用户进程,init进程是所有用户进程的鼻祖。
- init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程;
- init进程还启动servicemanager(binder服务管家)、bootanim(开机动画)等重要服务
- init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程(即虚拟机进程),Zygote是所有Java进程的父进程,Zygote进程本身是由init进程孵化而来的。
Framework层
Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含
System Server进程,是由Zygote进程fork而来,System Server是Zygote孵化的第一个进程,System Server负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务。
Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务。
App层
- Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;
- Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。
- 所有的App进程都是由Zygote进程fork生成的。
Syscall && JNI
Native与Kernel之间有一层系统调用(SysCall)层
Java层与Native(C/C++)层之间的纽带JNI
进程关系
当Kernel启动过程会创建init进程, 该进程是所有用户空间的鼻祖, init进程会启动servicemanager(binder服务管家), Zygote进程(Java进程的鼻祖). Zygote进程会创建 system_server进程以及各种app进程
init进程
init是Linux系统中用户空间的第一个进程(pid=1), Kerner启动后会调用/system/core/init/Init.cpp的main()方法.
init进程的主要功能点:
Zygote进程
自动重启机制
当init解析到下面这条语句,便会启动Zygote进程
启动过程:frameworks/base/cmds/app_process/App_main.cpp
AndroidRuntime.start()执行到最后通过反射调用到ZygoteInit.main(),从而进入Java层
退出后自启
当init子进程(Zygote)退出时,会产生SIGCHLD信号,并发送给init进程,通过socket套接字传递数据,调用到wait_for_one_process()方法,根据是否是oneshot,来决定是重启子进程,还是放弃启动。由于缺省模式oneshot=false,因此Zygote一旦被杀便会再次由init进程拉起.
surfaceflinger,servicemanager,zygote自身以及system_server进程被杀都会触发Zygote重启
fork机制
copy-on-write原理:写时拷贝是指子进程与父进程的页表都所指向同一个块物理内存,fork过程只拷贝父进程的页表,并标记这些页表是只读的。父子进程共用同一份物理内存,如果父子进程任一方想要修改这块物理内存,那么会触发缺页异常(page fault),Linux收到该中断便会创建新的物理内存,并将两个物理内存标记设置为可写状态,从而父子进程都有各自独立的物理内存。
fork()采用copy on write技术,这是linux创建进程的标准方法,调用一次,返回两次,返回值有3种类型。
system_server进程
Zygote通过fork后创建system_server进程。颜色为紫色的流程运行在是Zygote进程,颜色为蓝色的流程是运行在新创建的system_server
在RuntimeInit.invokeStaticMain()通过抛异常MethodAndArgsCaller,然后在外面捕捉进入caller.run()方法,执行system server的main方法
SystemServer.main()-> SystemServer.run()中会启动framework的核心服务
// 主线程looper就在当前线程运行
Looper.prepareMainLooper();
System_server主线程的启动工作,总算完成, 进入Looper.loop()状态,等待其他线程通过handler发送消息再处理.
看下system_server进程调用栈
app进程
创建进程
对于第4点的新进程启动流程类似system server进程的启动
可知进程创建后 接下来会进入ActivityThread.main()过程
public static void main(String[] args) {...Environment.initForCurrentUser();...Process.setArgV0("<pre-initialized>");//创建主线程looperLooper.prepareMainLooper();ActivityThread thread = new ActivityThread();thread.attach(false); //attach到系统进程if (sMainThreadHandler == null) {sMainThreadHandler = thread.getHandler();}//主线程进入循环状态Looper.loop();throw new RuntimeException("Main thread loop unexpectedly exited");
}
App进程的主线程调用栈的栈底
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析相关推荐
- 图解Android - Zygote, System Server 启动分析
Init 是所有Linux程序的起点,而Zygote于Android,正如它的英文意思,是所有java程序的'孵化池'(玩过星际虫族的兄弟都晓得的).用ps 输出可以看到 >adb shell ...
- android phone驱动_一文带你掌握 Android 系统架构
引言 本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制.虽然Android系统非常 ...
- Android系统架构开篇
Android系统庞大且错综复杂,Gityuan带领大家初探Android系统整体架构,一窥其全貌. 一.引言 本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解An ...
- Android系统架构-[Android取经之路]
摘要:本节主要来讲解Android的系统架构 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢 ...
- linux与安卓系统目录,android系统架构及源码目录结构
1. android系统架构: android系统架构采用了分层架构的思想,如下图所示,从上到下共4层,分别为:应用程序层.应用程序框架层.系统库和android运行时层.linux内核层. 每层功能 ...
- 安卓进阶之android系统架构
安卓进阶之android架构 安卓进阶躲不开阅读源码和深入了解安卓的底层,这是一篇入门级别的文章,可以对安卓架构有个大体的认识. AOSP与Android系统架构 首先要理解andriod和AOSP的 ...
- android系统架构及源码目录结构
本文转载自[踏雪行]的博客(http://blog.csdn.net/finewind/article/details/46324507) 1. Android系统架构: android系统架构采用了 ...
- Framework学习(一)深入Android 系统架构
Android系统架构 说到Android,大家都知道他是目前移动市场最大的终端系统,拥有着广阔的市场价值,因此,作为一名开发者,深入了解Android是很有必要. 其实,Android的本质就是在标 ...
- Android系统运行库分为,Android系统架构
Android系统架构可分为五层,从上到下依次是应用层.应用框架层.系统运行时库层.硬件抽象层和Linux内核层 应用层 (System Apps) 系统内置的应用程序以及非系统级应用程序都属于应用层 ...
最新文章
- c语言函数传参时候的类型强制装换
- 微信小程序之apply和call ( 附示例代码和注释讲解) apply call bind
- window opengl
- STM32下载库资料
- linux实验串行端口程序设计,Linux下串口编程心得(转)
- 209. Minimum Size Subarray Sum 长度最小的子数组
- python 正则替换_5分钟速览Python正则表达式常用函数!五分钟就掌握它!
- C#中事务的简单使用
- 【linux】Centos 8 安装 悟空CRM-11.0
- KubeSphere
- 1.零基础Java基础教程9天入门
- cygwin终端中显示的中文改成英文(没成功)
- Elascicsearch集群搭建
- SPSS学习笔记【二】-回归分析
- C#实现Winform程序自动进行版本升级更新
- Eplan创建符号详细解说
- sortBy(-_._2 ) in scala
- 苹果新款笔记本_微软承诺将在iPhone上提供流媒体游戏服务(全文)_苹果 新款MacBook Pro 13英寸_笔记本新闻...
- 【爬虫实战】12306购票抓包分析以及任务分解
- 火狐浏览器书签工具栏图标_在Firefox书签工具栏中浓缩书签