栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > 架构设计

【Android】系统架构功能+init、zygote、system server、app等进程间关系分析

架构设计 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【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("
");
    //创建主线程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进程的主线程调用栈的栈底

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906868.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号