论一个APP从启动到主页面显示经历的过程?

Android面试题(31)-App启动流程 先贴个链接,总结的挺全面 在看这篇文章之前,希望先看完我的之前的博客 android面试(6)-Binder机制,因为关于App启动流程设计很多Binder通信; 先将“三个进程”,“六个大类”进行介绍: 三个进程: Launcher进程:整个App启动流程的起点,负责接收用户点击屏幕事件,它其实就是一个Activity,里面实现了点击事件,长按事件,触摸等事件,可以这么理解,把Launc... 阅读详情
前言 (个人观点.不喜勿喷)

本部分内容是关于Android进阶的一些知识总结,涉及到的知识点比较杂,不过都 是面试中几乎常问的知识点,也是加分的点。 关于这部分内容,可能需要有一些具体的项目实践。在面试的过程中,结合具体自 身实践经历,才能更加深入透彻的描绘出来。

(年前有很多加我,今天才一一回复,发现很多都失效了,需要的可以重新加一次)

(顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)
https://github.com/xiangjiana/Android-MS

更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取

一、流程概述

启动流程:

① 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起 startActivity请求;
② system_server进程接收到请求后,向zygote进程发送创建进程的请求;
③ Zygote进程fork出新的子进程,即App进程;
④ App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
⑤ system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向 App进程发送scheduleLaunchActivity请求;
⑥ App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线 程发送LAUNCH_ACTIVITY消息;
⑦ 主线程在收到Message后,通过发射机制创建目标Activity,并回调 Activity.onCreate()等方法。
⑧ 到此,App便正式启动,开始进入Activity生命周期,执行完 onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

上面的一些列步骤简单介绍了一个APP启动到主页面显示的过程,可能这些流程中 的一些术语看的有些懵,什么是Launcher,什么是zygote,什么是 applicationThread… 下面我们一一介绍。

二、理论基础
1.zygote

zygote意为“受精卵“。Android是基于Linux系统的,而在Linux中,所有的进程都是 由init进程直接或者是间接fork出来的,zygote进程也不例外。

在Android系统里面,zygote是一个进程的名字。Android是基于Linux System的, 当你的手机开机的时候,Linux的内核加载完成之后就会启动一个叫“init“的进程。在 Linux System里面,所有的进程都是由init进程fork出来的,我们的zygote进程也不 例外

我们都知道,每一个App其实都是

  • 一个单独的dalvik虚拟机
  • 一个单独的进程

所以当系统里面的第一个zygote进程运行之后,在这之后再开启App,就相当于开 启一个新的进程。而为了实现资源共用和更快的启动速度,Android系统开启新进 程的方式,是通过fork第一个zygote进程实现的。所以说,除了第一个zygote进 程,其他应用所在的进程都是zygote的子进程,这下你明白为什么这个进程叫“受精 卵”了吧?因为就像是一个受精卵一样,它能快速的分裂,并且产生遗传物质一样的 细胞!

2.system_server

SystemServer也是一个进程,而且是由zygote进程fork出来的。

知道了SystemServer的本质,我们对它就不算太陌生了,这个进程是Android Framework里面两大非常重要的进程之一——另外一个进程就是上面的zygote进 程。

为什么说SystemServer非常重要呢?因为系统里面重要的服务都是在这个进程里面 开启的,比如 ActivityManagerService、PackageManagerService、 WindowManagerService等等。

3.ActivityManagerService

ActivityManagerService,简称AMS,服务端对象,负责系统中所有Activity的生命 周期。 ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启 的时候,就会初始化ActivityManagerService。

下面介绍下Android系统里面的服务器和客户端的概 念。

其实服务器客户端的概念不仅仅存在于Web开发中,在Android的框架设计中,使 用的也是这一种模式。服务器端指的就是所有App共用的系统服务,比如我们这里 提到的ActivityManagerService,和前面提到的PackageManagerService、 WindowManagerService等等,这些基础的系统服务是被所有的App公用的,当某 个App想实现某个操作的时候,要告诉这些系统服务,比如你想打开一个App,那 么我们知道了包名和MainActivity类名之后就可以打开

  Intent intent = new Intent(Intent.ACTION_MAIN); 
  intent.addCategory(Intent.CATEGORY_LAUNCHER); 
  ComponentName cn = new 
  ComponentName(packageName, className); 
  intent.setComponent(cn); startActivity(intent);

但是,我们的App通过调用startActivity()并不能直接打开另外一个App,这个方法会 通过一系列的调用,最后还是告诉AMS说:“我要打开这个App,我知道他的住址和 名字,你帮我打开吧!”所以是AMS来通知zygote进程来fork一个新进程,来开启我 们的目标App的。这就像是浏览器想要打开一个超链接一样,浏览器把网页地址发 送给服务器,然后还是服务器把需要的资源文件发送给客户端的。

知道了Android Framework的客户端服务器架构之后,我们还需要了解一件事情, 那就是我们的App和AMS(SystemServer进程)还有zygote进程分属于三个独立的进 程,他们之间如何通信呢?

App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过 Socket进行IPC通信。后面具体介绍。

那么AMS有什么用呢?在前面我们知道了,如果想打开一个App的话,需要AMS去 通知zygote进程,除此之外,其实所有的Activity的开启、暂停、关闭都需要AMS来控制,所以我们说,AMS负责系统中所有Activity的生命周期。 在Android系统中,任何一个Activity的启动都是由AMS和应用程序进程(主要是 ActivityThread)相互配合来完成的。AMS服务统一调度系统中所有进程的 Activity启动,而每个Activity的启动过程则由其所属的进程具体来完成。

4.Launcher

当我们点击手机桌面上的图标的时候,App就由Launcher开始启动了。但是,你有 没有思考过Launcher到底是一个什么东西? Launcher本质上也是一个应用程序,和我们的App一样,也是继承自Activity packages/apps/Launcher2/src/com/android/launcher2/Launcher.java

  public final class Launcher extends Activity 
          implements View.OnClickListener, OnLongClickListener, La uncherModel.Callbacks, View.OnTouchListener {
   }

Launcher实现了点击、长按等回调接口,来接收用户的输入。既然是普通的App, 那么我们的开发经验在这里就仍然适用,比如,我们点击图标的时候,是怎么开启 的应用呢?捕捉图标点击事件,然后startActivity()发送对应的Intent请求呗!是的,Launcher也是这么做的,就是这么easy!

5.Instrumentation和ActivityThread

每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个 Instrumentation对象。 Instrumentation这个类里面的方法大多数和Application和 Activity有关,这个类就是完成对Application和Activity初始化和生命周期的工具 类。Instrumentation这个类很重要,对Activity生命周期方法的调用根本就离不开 他,他可以说是一个大管家。

ActivityThread,依赖于UI线程。App和AMS是通过Binder传递信息的,那么 ActivityThread就是专门与AMS的外交工作的。

6.ApplicationThread

前面我们已经知道了App的启动以及Activity的显示都需要AMS的控制,那么我们便 需要和服务端的沟通,而这个沟通是双向的。
客户端–>服务端

而且由于继承了同样的公共接口类,ActivityManagerProxy提供了与 ActivityManagerService一样的函数原型,使用户感觉不出Server是运行在本地还是 远端,从而可以更加方便的调用这些重要的系统服务。

服务端–>客户端
还是通过Binder通信,不过是换了另外一对,换成了ApplicationThread和 ApplicationThreadProxy。

他们也都实现了相同的接口IApplicationThread

  private class ApplicationThread extends ApplicationThreadNative {
  }
  public abstract class ApplicationThreadNative extends Binder i mplements IApplicationThread{
  } 
  class ApplicationThreadProxy implements IApplicationThread {
  }

好了,前面罗里吧嗦的一大堆,介绍了一堆名词,可能不太清楚,没关系,下面结 合流程图介绍。

三、启动流程
1.创建进程

① 先从Launcher的startActivity()方法,通过Binder通信,调用 ActivityManagerService的startActivity方法。
② 一系列折腾,最后调用startProcessLocked()方法来创建新的进程。
③ 该方法会通过前面讲到的socket通道传递参数给Zygote进程。Zygote孵化自身。 调用ZygoteInit.main()方法来实例化ActivityThread对象并最终返回新进程的pid。
④ 调用ActivityThread.main()方法,ActivityThread随后依次调用 Looper.prepareLoop()和Looper.loop()来开启消息循环。

方法调用流程图如下:

更直白的流程解释:

①App发起进程:
当从桌面启动应用,则发起进程便是Launcher所在进程;当从某 App内启动远程进程,则发送进程便是该App所在进程。发起进程先通过binder发送 消息给system_server进程;
②system_server进程:
调用Process.start()方法,通过socket向zygote进程发送创 建新进程的请求;
③zygote进程:
在执行ZygoteInit.main()后便进入runSelectLoop()循环体内,当有 客户端连接时便会执行ZygoteConnection.runOnce()方法,再经过层层调用后fork 出新的应用进程;
④新进程:
执行handleChildProc方法,最后调用ActivityThread.main()方法。

2.绑定Application

上面创建进程后,执行ActivityThread.main()方法,随后调用attach()方法。

将进程和指定的Application绑定起来。这个是通过上节的ActivityThread对象中调用 bindApplication()方法完成的。该方法发送一个BIND_APPLICATION的消息到消息 队列中, 最终通过handleBindApplication()方法处理该消息. 然后调用 makeApplication()方法来加载App的classes到内存中。

方法调用流程图如下:

更直白的流程解释:

(如果看不懂AMS,ATP等名词,后面有解释)

3.显示Activity界面

经过前两个步骤之后, 系统已经拥有了该application的进程。 后面的调用顺序就是 普通的从一个已经存在的进程中启动一个新进程的activity了。

实际调用方法是realStartActivity(), 它会调用application线程对象中的 scheduleLaunchActivity()发送一个LAUNCH_ACTIVITY消息到消息队列中, 通过 handleLaunchActivity()来处理该消息。在 handleLaunchActivity()通过 performLaunchActiivty()方法回调Activity的onCreate()方法和onStart()方法,然后通 过handleResumeActivity()方法,回调Activity的onResume()方法,最终显示Activity 界面。

更直白的流程解释:

四、Binder通信

简称:
ATP: ApplicationThreadProxy
AT: ApplicationThread
AMP: ActivityManagerProxy
AMS: ActivityManagerService

图解:

① system_server进程中调用startProcessLocked方法,该方法最终通过socket方式, 将需要创建新进程的消息告知Zygote进程,并阻塞等待Socket返回新创建进程的pid;
② Zygote进程接收到system_server发送过来的消息, 则通过fork的方法,将zygote 自身进程复制生成新的进程,并将ActivityThread相关的资源加载到新进程app process,这个进程可能是用于承载activity等组件;
③ 在新进程app process向servicemanager查询system_server进程中binder服务端 AMS, 获取相对应的Client端,也就是AMP. 有了这一对binder c/s对, 那么app process便可以通过binder向跨进程system_server发送请求,即attachApplication()
④ system_server进程接收到相应binder操作后,经过多次调用,利用ATP向app process发送binder请求, 即bindApplication. system_server拥有ATP/AMS, 每一个 新创建的进程都会有一个相应的AT/AMP,从而可以跨进程 进行相互通信. 这便是进 程创建过程的完整生态链。

以上大概介绍了一个APP从启动到主页面显示经历的流程,主要从宏观角度介绍了 其过程,具体可结合源码理解。

(顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)
https://github.com/xiangjiana/Android-MS

PDF和源码获取

更多完整项目下载。未完待续。源码。图文知识后续上传github。
可以点击关于我联系我获取

感谢支持~

最新版MySQL 9.0 数据库的下载与安装(图文) 本篇文章基于Windows 10 系统下载与安装MySQL 9.0 版本。 阅读详情

相关推荐

Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务

因此,当使用外部容器时,如此处的 Tomcat 来部署项目,AbstractAutoServiceRegistration 就不能监听到容器启动事件了,也就不会尝试向服务注册中心注册当前这个微服务,那么注册就失败了,并且也就没有异常信息了。自定义获取获取外部容器端口的方法, 然后监听应用启动事件,当应用被启动时,获取外部容器启动的端口号,然后将这个 port 设置到 NacosAutoServiceReigistration 中。在启动类同级目录,复制下面代码即可(不需要修改,直接构建war即可)

ttyy1112的专栏 2519

面试必问,敲重点!讲一下 Android Application 启动流程及其源码?

有一份编译好的 Android 源码,现在的 AS 基本能满足,动手跟着步骤走,理解更深刻对 Binder 机制有一定的了解本文基于 API 26,用什么版本的源码并不重要,大体的流程并无本质上的区别从用户手指触摸点击桌面图标到 Activity 启动关键类简介。

maniuT的博客 450

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

安卓工程师_安卓开发面试题(24/30)之APK启动流程

应用程序的启动流程,是较为高频的面试题,因为涉及的知识点比较多,适合考验一个人安卓技术的掌握程度,不过原理也比较复杂。本人也被问过这题目.

a763450633的博客 854

拆解大疆Osmo Pocket:聊聊微型云台里那几根比头发丝还细的线,以及它为啥一开机就‘摇头晃脑’

本文深入拆解大疆Osmo Pocket微型云台的精密硬件结构,揭秘其开机自检时‘摇头晃脑’的奥秘。通过分析无刷电机、霍尔传感器和46AWG同轴线等核心组件,展现了大疆在微型云台设计中的工程智慧与创新技术,特别是FOC控制和陀螺仪的应用,实现了0.1°级的姿态控制精度。

weixin_27869497的博客 667

【AI智能体】飞书 AI 智能客服机器人搭建与使用实战操作详解

飞书 AI 智能客服机器人搭建与使用实战操作详解

congge 6046

android应用流程图,Android APP 启动流程简析

每一个android应用默认都是在他自己的linux进程中运行。android操作系统会在这个android应用中的组件需要被执行的时候启动这个应用进程,并且会在这个应用进程没有任何组件执行或者是系统需要为其他应用申请更多内存的时候杀死这个应用进程。所以当我们需要启动这个应用的四大组件之一的时候如果这个应用的进程还没有启动,那么就会先启动这个应用程序进程。

2401_84164672的博客 1461

5、高级综合技术:从调度到优化的全面解析

本文深入解析了高级综合技术,涵盖从控制/数据流图构建、调度算法、分配绑定策略到编译器优化的全流程。通过案例分析和对比,探讨了不同优化策略对性能和资源利用的影响,并总结了关键要点及未来发展趋势,为高效利用FPGA实现数字设计提供了全面指导。

night的博客 117

App 启动过程(含 Activity 启动过程) | 安卓 offer 收割基

这道题在曾经面试「菜鸟网络」中遇到过,不过当时只问了「Activity 启动过程」,这里对整个「App 启动过程」进行完整的源码分析,希望可以帮助到大家。 源码分析 1. Launcher 捕获点击事件,其过程为 Launcher#onClick -> Launcher#onClickAppShortcut -> Launcher#startAppShortcutOrInfoActiv...

weixin_33869377的博客 378

开源工具对比:5款主流大数据脱敏框架评测

数据脱敏(Data Masking/Anonymization),也称为数据漂白、数据去标识化,是指在不影响数据可用性的前提下,通过一定的技术手段对敏感信息进行处理,使其无法被识别或关联到具体个人或实体的过程。当应用程序向数据库写入数据(INSERT/UPDATE)时,ShardingSphere 会拦截 SQL,对配置了脱敏规则的字段,使用指定的算法进行加密/脱敏处理,然后将处理后的数据写入到。如果你的答案是“是”,那么数据脱敏,尤其是针对海量数据的。好的,各位技术同仁,数据安全领域的探索者们,大家好。

小程序开发 1183

Python全栈入门到实战【进阶篇 1】类与对象:面向对象编程的基石

Python中定义类使用**class关键字**,创建对象使用**类名()**(类似调用函数),语法简洁,我们从最基础的空类开始,逐步拆解。class# 定义空的学生类,pass表示占位,无实际内容 class Student : pass编码规范:类名遵循大驼峰命名法(每个单词首字母大写,无下划线),如StudentCarPhone,这是Python官方推荐的PEP8规范,便于区分类和其他标识符。实例方法必须定义在类内部;实例方法的第一个参数必须是self(名称可自定义,如this。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 3403

一个APP从启动到主页面显示经历了哪些过程?

参考: 一个APP从启动到主页面显示经历了哪些过程?

yzpbright的博客 336

YOLOv11改进 | Mamba-YOLOv11-L:基于SSM的高效全局建模,精度与效率的双重突破

摘要: 本文提出Mamba-YOLOv11-L,通过集成状态空间模型(SSM)改进YOLOv11的全局建模能力。针对YOLOv11在复杂场景中全局依赖缺失、精度-效率矛盾等问题,SSM以$O(N)$计算复杂度实现长程语义捕捉。改进后的模型在工业缺陷检测(Recall↑12%)、边缘设备部署(内存↓16%)、多尺度目标检测(小目标mAP↑9%)等场景表现优异,推理速度保持>40 FPS。核心创新包括轻量化SSM模块设计(稀疏状态转移+局部上下文融合)及与YOLOv11骨干的深度集成,代码实现展示了SSM

走向CTO的路上... 566

APP从启动到主页面显示经历了哪些过程

0 前言 本文以图文并茂的形式简单介绍一个APP从启动到主页面显示经历了哪些流程,以及实现的原理。不介绍具体源码,仅仅构建一个大体框架。 1 流程概述 启动流程: ①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求; ②system_s

u012426327的专栏 632

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

APP从启动到主页面显示,经历了哪些过程

首先,谢谢原作者! 下面让我们来看看他的第二篇文章《一个APP从启动到主页面显示经历了哪些过程?》 本文以图文并茂的形式简单介绍一个APP从启动到主页面显示经历了哪些流程,以及实现的原理。不介绍具体源码,仅仅构建一个大体框架。 一、流程概述 启动流程: ①点击桌面App图标,Launcher进程采用Binder IPC向system_s

u014628886的博客 2873

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

一个APP从启动到主页面显示经历了哪些过程?(App启动流程,从点击桌面开始)

本文以图文并茂的形式简单介绍一个APP从启动到主页面显示经历了哪些流程,以及实现的原理。不介绍具体源码,仅仅构建一个大体框架。原地址链接:http://www.jianshu.com/p/a72c5ccbd150一、流程概述启动流程:①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;②system_server进程接

zhencheng20082009的专栏 7042

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

你知道APP从启动到主页面显示经历了哪些过程吗?

点击上方蓝字体关注码个蛋作者博客http://www.jianshu.com/u/0fa6f5d09040文章目录前言流程概述理论基础启动流程0前言 本文以图文并茂的形式简单介绍一个AP...

陈宇明 231

android github 多页面程序,论一个APP从启动到主页面显示经历的过程?

前言 (个人观点.不喜勿喷)本部分内容是关于Android进阶的一些知识总结,涉及到的知识点比较杂,不过都 是面试中几乎常问的知识点,也是加分的点。 关于这部分内容,可能需要有一些具体的项目实践。在面试的过程中,结合具体自 身实践经历,才能更加深入透彻的描绘出来。一、流程概述启动流程:① 点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起 star...

weixin_42307002的博客 171

论一个APP从启动到主页面显示经历的过程?,Android面试题汇总

分享一份工作1到5年以上的Android程序员架构进阶学习路线体系,希望能对那些还在从事Android开发却还不知道如何去提升自己的,还处于迷茫的朋友!阿里P7级Android架构师技术脑图;查漏补缺,体系化深入学习提升(详细点击我的GitHub领取)**全套体系化高级架构视频;**七大主流技术模块,视频+源码+笔记。

m0_61369275的博客 1047

一个APP从启动到主页面显示经历了哪些过程?2年以上经验必看

前言 博主14年毕业后从事Android移动应用开发,至今已是第六年了。在深圳摸爬滚打了好几年,也都是在小厂的圈子里跳来跳去。在我拿到这份新offer钱,15K是我拿过的最高工资。已经有快一年没有涨过工资了。疫情在家隔离了两个多月,开始系统复习、学习。梅花香自苦寒来。终于是在五一前后获得了上市公司的offer,虽不是什么一流大厂,但对于我来说,从15K的薪资涨到将近30K,已经非常满足了。下面分享一下我的复习、学习指南,以及一些心得体会吧。 正文 Android进阶重难点 Java 集合:使用场景、源码阅

CHAMPION8888的博客 208

一个APP从启动到主页面显示经历了哪些过程?已拿offer

前言 首先声明,楼主不是什么大牛,没有多牛逼的技术,只是公司扩招团队,有幸作为技术面试官,面试了这么多人之后的感想,希望对大家有一点点帮助。 面试题 一般Android面试分为两部分:Java部分和Android部分,下面说一下自己面试过程遇到的一些具体题目和一些相关知识点。 一 JAVA相关 1)JAVA基础 1.java基本数据类型有哪些,int, long占几个字节 2.== 和 equals有什么区别 3.hashcode 和 equals作用 4.new String创建了几个对象 5.位运算

CHAMPION8888的博客 129
上一篇: 被裁员!大龄Android程序员面试惨败辛酸史,技术水平真的很重要!
下一篇: 新年过后献上关于Android内存泄漏的种种总结
初壹十五a
博客等级 码龄8年 146粉丝 257原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值