Android 体系启动到App 界面完全展示终于明白(图文版)

分享
源代码 2024-9-11 11:16:40 92 0 来自 中国
媒介

系列文章:
Android Activity创建到View的表现过程
Android 四大组件通讯焦点
Android 体系启动到App 界面完全展示终于明白(图文版)
之前文章有分析过Activity创建到View的表现过程,属于单应用层面的知识范畴,本篇将联合Android 体系启动部门知识将两者串联分析,以期到达意会贯通的目标。
通过本篇文章,你将相识到:

  • Android 体系启动流程概览
  • ServiceManager 历程作用
  • Zygote 历程创建与fork子历程
  • system_server 历程作用
  • App 与 system_server 交互
  • Activity 与 View的展示
  • 全流程图
1. Android 体系启动流程概览



  • init 是用户空间的第一个历程,它的父历程是idle历程
  • init 历程通过解析init.rc 文件并fork出相应的历程
  • zygote是第一个Java 假造机历程,通过它孵化出system_server 历程
  • system_server 历程启动桌面(Launcher)App
以上为Android 体系上电到桌面启动的大抵过程,我们重点关注此中几个历程:
init、servicemanger、zygote、system_server
idle 与 init 关系如下:


查察依赖关系:

init.rc 启动servicemanager、zygote 设置如下:

4.png
5.png 2. ServiceManager 历程作用

Android 历程间通讯运用最广泛的是Binder机制,而ServiceManager历程与Binder痛痒相干。
DNS 存储着域名和ip的映射关系,雷同的ServiceManager存储着Binder客户端和服务端的映射。

App1作为Binder Client端,App2 作为Binder Server端,App2 开放一个接口给App1使用(通常称为服务),此时步调如下:

  • App2 向ServiceManager注册服务,过程为:App2 获取ServiceManager的Binder引用,通过该Binder引用将App2 的Binder对象(实现了接口)添加到Binder驱动,Binder驱动纪录对象与天生handle并返回给ServiceManager,ServiceManager纪录关键信息(如服务名,handle)。
  • App1 向ServcieManager查询服务,过程为: App1 获取ServiceManager的Binder引用,通过该Binder引用发送查询下令给Binder驱动,Binder驱动委托ServiceManager举行查询,ServiceManager根据服务名从自己的缓存链表里查出对应服务,并将该服务的handle写入驱动,进而转为App1的Binder署理。
  • App1 拿到App2 的Binder署理后,App1 就可以通过Binder与App2举行IPC通讯了,此时ServiceManager已经默默退居幕后,深藏功与名。
由上可知,ServiceManager历程饰演着中介的脚色。
3. Zygote 历程创建与fork子历程

Zygote 历程的创建

Zygote 历程台甫鼎鼎,Android 上全部的Java 历程都由Zygote孵化,Zygote名字自己也便是受精卵,固然高雅点一样寻常称为孵化器。

7.png Zygote 历程是由init历程fork出来的,历程启动后从入口文件(app_main.cpp)入口函数开始实行:

  • 构造AppRuntime对象,并创建Java假造机、注册一系列的jni函数(Java和Native层关联起来)
  • 从Native层切换到Java层,实行ZygoteInit.java main()函数
  • fork system_server历程,预加载历程公共资源(后续fork的子历程可以复用,加速历程实行速率)
  • 末了开启LocalSocket,并循环监听来自system_server创建子历程的Socket哀求。
通过以上步调,Zygote 启动完成,并等待创建历程的哀求。

8.png 初始状态步调:

  • Zygote fork system_server 历程并等待Socket哀求
  • system_server 历程启动后会哀求打开Launcher(桌面),此时通过Socket发送创建哀求给Zygote,Zygote 收到哀求后负责fork 出Launcher历程并实行它的入口函数
  • Launcher 启动后用户就可以看到初始的界面了
用户操纵:
桌面表现出来后,此时用户想打开微信,于是点击了桌面上的微信图标,背后的故事如下:

  • Launcher App 收到点击哀求,会实行startActivity,这个下令会通过Binder通报给system_server历程里的AMS(ActivityManagerService)模块
  • AMS 发现对应的微信历程并没有启动,于是通过Socket发送创建微信历程的哀求给Zygote
  • Zygote 收到Socket哀求后,fork 微信历程并实行对应的入口函数,之后就会表现出微信的界面了
用图表现如下:

由上可知,App历程和system_server 历程之间通讯方式为Binder,而system_server和Zygote 通讯方式为Socket,App历程并不直接哀求Zygote办事变,而是通过system_server举行处置惩罚,system_server 纪录着当前全部App 历程的状态,由它来同一管理各个App的生命周期。
Zygote 历程fork 子历程

Zygote 历程在Java层监听Socket哀求,收到哀求后层层调用末了切换到Native实行体系调用fork()函数,末了根据fork()返回值区分父子历程,并在子历程里实行入口函数。
4. system_server 历程作用

system_server 为全部App提供服务,可以说是体系的焦点历程之一,它紧张的功能如下:


可以看出,它创建并启动了很多服务,常见的AMS、PMS、WMS,我们常说体系某某服务返回了啥,往细的说这里的"体系"可以以为是system_server历程。
须要注意的是,这里所说的服务并不是Android四大组件的Service,而是某一类功能。
四大组件的交互也要依赖system_server:


现实调用流程如下:

13.png
由上图可知,不管是同一历程内的通讯亦或是差别历程间的通讯,都须要system_server介入。App 和 system_server 是属于差别的历程,App历程怎样找到system_server呢?
照旧要借助ServiceManager历程:

14.png
system_server 在启动时间不但开启了各种服务,同时还将须要袒露的服务注册到ServiceManager里,别的历程想要使用system_server的功能时只须要从SystemManager里查询即可。
5. App 与 system_server 交互

App 想要获取体系的功能,在大部门环境下是绕不过system_server的,接着来看看App怎样与system_server举行交互。
前面分析过,App想要获取system_server 服务只须要从ServiceManager里获取即可,调用情势如下:
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 08:52, Processed in 0.171787 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表