文章目录

  • 架构功能
    • 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等进程间关系分析相关推荐

  1. 图解Android - Zygote, System Server 启动分析

    Init 是所有Linux程序的起点,而Zygote于Android,正如它的英文意思,是所有java程序的'孵化池'(玩过星际虫族的兄弟都晓得的).用ps 输出可以看到 >adb shell ...

  2. android phone驱动_一文带你掌握 Android 系统架构

    引言 本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制.虽然Android系统非常 ...

  3. Android系统架构开篇

    Android系统庞大且错综复杂,Gityuan带领大家初探Android系统整体架构,一窥其全貌. 一.引言 本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解An ...

  4. Android系统架构-[Android取经之路]

    摘要:本节主要来讲解Android的系统架构 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢 ...

  5. linux与安卓系统目录,android系统架构及源码目录结构

    1. android系统架构: android系统架构采用了分层架构的思想,如下图所示,从上到下共4层,分别为:应用程序层.应用程序框架层.系统库和android运行时层.linux内核层. 每层功能 ...

  6. 安卓进阶之android系统架构

    安卓进阶之android架构 安卓进阶躲不开阅读源码和深入了解安卓的底层,这是一篇入门级别的文章,可以对安卓架构有个大体的认识. AOSP与Android系统架构 首先要理解andriod和AOSP的 ...

  7. android系统架构及源码目录结构

    本文转载自[踏雪行]的博客(http://blog.csdn.net/finewind/article/details/46324507) 1. Android系统架构: android系统架构采用了 ...

  8. Framework学习(一)深入Android 系统架构

    Android系统架构 说到Android,大家都知道他是目前移动市场最大的终端系统,拥有着广阔的市场价值,因此,作为一名开发者,深入了解Android是很有必要. 其实,Android的本质就是在标 ...

  9. Android系统运行库分为,Android系统架构

    Android系统架构可分为五层,从上到下依次是应用层.应用框架层.系统运行时库层.硬件抽象层和Linux内核层 应用层 (System Apps) 系统内置的应用程序以及非系统级应用程序都属于应用层 ...

最新文章

  1. c语言函数传参时候的类型强制装换
  2. 微信小程序之apply和call ( 附示例代码和注释讲解) apply call  bind
  3. window opengl
  4. STM32下载库资料
  5. linux实验串行端口程序设计,Linux下串口编程心得(转)
  6. 209. Minimum Size Subarray Sum 长度最小的子数组
  7. python 正则替换_5分钟速览Python正则表达式常用函数!五分钟就掌握它!
  8. C#中事务的简单使用
  9. 【linux】Centos 8 安装 悟空CRM-11.0
  10. KubeSphere
  11. 1.零基础Java基础教程9天入门
  12. cygwin终端中显示的中文改成英文(没成功)
  13. Elascicsearch集群搭建
  14. SPSS学习笔记【二】-回归分析
  15. C#实现Winform程序自动进行版本升级更新
  16. Eplan创建符号详细解说
  17. sortBy(-_._2 ) in scala
  18. 苹果新款笔记本_微软承诺将在iPhone上提供流媒体游戏服务(全文)_苹果 新款MacBook Pro 13英寸_笔记本新闻...
  19. 【爬虫实战】12306购票抓包分析以及任务分解
  20. 火狐浏览器书签工具栏图标_在Firefox书签工具栏中浓缩书签

热门文章

  1. 27.边缘系统的架构
  2. C语言文件处理的一些总结
  3. 51单片机震动传感器控制灯,控制继电器
  4. 计算机专业毕业鉴定,计算机专业毕业生自我鉴定
  5. 中国涂布印刷纸产量、销量、进出口量及铜版纸产销量分析「图」
  6. php paypal订单号查询,关于php购物网站支付paypal的使用方法
  7. matlab生成随机数小结,MATLAB生成随机数总结
  8. 思科设备或者模拟器(Cisco Packet Tracer )的简单介绍和使用
  9. Exchange邮箱服务器的可用性(转)
  10. c语言的结构体指针的引用,C语言中的指针、引用、数组、结构体