【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】系统架构功能+init、zygote、system server、app等进程间关系分析_第1张图片

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进程
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第2张图片

init进程

init是Linux系统中用户空间的第一个进程(pid=1), Kerner启动后会调用/system/core/init/Init.cpp的main()方法.
init进程的主要功能点:
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第3张图片

Zygote进程

【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第4张图片
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第5张图片

自动重启机制

当init解析到下面这条语句,便会启动Zygote进程
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第6张图片
启动过程:frameworks/base/cmds/app_process/App_main.cpp
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第7张图片
AndroidRuntime.start()执行到最后通过反射调用到ZygoteInit.main(),从而进入Java层

退出后自启
当init子进程(Zygote)退出时,会产生SIGCHLD信号,并发送给init进程,通过socket套接字传递数据,调用到wait_for_one_process()方法,根据是否是oneshot,来决定是重启子进程,还是放弃启动。由于缺省模式oneshot=false,因此Zygote一旦被杀便会再次由init进程拉起.
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第8张图片

surfaceflinger,servicemanager,zygote自身以及system_server进程被杀都会触发Zygote重启

fork机制

copy-on-write原理:写时拷贝是指子进程与父进程的页表都所指向同一个块物理内存,fork过程只拷贝父进程的页表,并标记这些页表是只读的。父子进程共用同一份物理内存,如果父子进程任一方想要修改这块物理内存,那么会触发缺页异常(page fault),Linux收到该中断便会创建新的物理内存,并将两个物理内存标记设置为可写状态,从而父子进程都有各自独立的物理内存。

【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第9张图片

fork()采用copy on write技术,这是linux创建进程的标准方法,调用一次,返回两次,返回值有3种类型。
在这里插入图片描述

system_server进程

Zygote通过fork后创建system_server进程。颜色为紫色的流程运行在是Zygote进程,颜色为蓝色的流程是运行在新创建的system_server
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第10张图片在RuntimeInit.invokeStaticMain()通过抛异常MethodAndArgsCaller,然后在外面捕捉进入caller.run()方法,执行system server的main方法
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第11张图片

SystemServer.main()-> SystemServer.run()中会启动framework的核心服务

// 主线程looper就在当前线程运行
Looper.prepareMainLooper();
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第12张图片
System_server主线程的启动工作,总算完成, 进入Looper.loop()状态,等待其他线程通过handler发送消息再处理.

看下system_server进程调用栈
在这里插入图片描述

app进程

创建进程
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第13张图片
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第14张图片对于第4点的新进程启动流程类似system server进程的启动
【Android】系统架构功能+init、zygote、system server、app等进程间关系分析_第15张图片

可知进程创建后 接下来会进入ActivityThread.main()过程

public static void main(String[] args) {
    ...
    Environment.initForCurrentUser();
    ...
    Process.setArgV0("");
    //创建主线程looper
    Looper.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等进程间关系分析_第16张图片

你可能感兴趣的:(Android,Android,架构功能,系统启动,进程间关系)