随着移动开发的兴起,安卓系统的重要性愈加突显。本文简要介绍安卓系统上应用启动流程,对于应用开发、系统定制以及性能优化人员来说,熟悉应用启动流程会使得在今后的工作中更加得心应手,做到知其然,知其所以然。本文主要面向开发人员,假定读者已有一定的安卓基础。

本文以安卓P版本为基础,不同安卓版本上应用启动流程略有差异,但核心逻辑仍然一致。

安卓上应用启动的几种形式

冷启动

这种方式应用需要完成完整的启动过程,即创建进程、初始化资源及显示应用界面,相比于另外两种启动模式,应用冷启动耗时最长。

热启动

这种方式下应用进程已经启动,通常只需将要显示的activity带到前台即可,所以在该模式下应用可以较快速启动。

温启动

这种方式需要完成部分冷启动过程,比如进程已经创建,但要重新执行activity的onCreate()来创建要显示的activity,这种模式下的启动时间介于以上两种之间。

本文主要介绍冷启动的执行流程。

应用启动相关的一些基本概念

zygote

该进程是安卓上所有应用进程的父进程,在开机过程中由系统启动并保持运行状态。由于现在的安卓平台大部分同时支持32位和64位应用,zygote也分为32位和64位两个版本,其原理相同,在本文中不做区分。

system_server

安卓上的系统服务进程,绝大部分主要系统服务都驻留在该进程内,包括下文中介绍的AMS、WMS、PMS等。system_server由zygote在启动进程中分裂而来(即也是zygote的子进程),然后持续运行。

AMS

Activity Manager Service,是安卓上的一个核心服务,负责管理应用各个组件,所有应用在其生命周期内均需和AMS打交道。该服务驻留在system_server进程内。

WMS

Window Manager Service,是安卓上的窗口管理服务,负责处理应用的界面显示相关的请求。该服务驻留在system_server进程内。

PMS

Package Manager Service,是安卓上的包管理服务,负责处理应用的安装、缷载等。该服务驻留在system_server进程内。

应用冷启动的任务序列

在冷启动时,系统首先有三个任务:

1. 在AMS端分配应用资源;

2. 显示应用的空白启动窗口;

3. 创建应用进程;

在应用进程启动后,应用进程会负责启动的后续阶段:

1. 创建应用对象;

2. 启动主线程;

3. 创建主activity并完成绘制及显示;

应用进程完成第一帧绘制后,系统会将空白窗口替换为应用的画面,此时,用户可以开始使用应用。

典型的冷启动场景及流程

接下来,我们以一个典型场景,即从桌面点击应用图标启动应用这一过程,来介绍应用启动流程。其它应用启动场景,比如从命令行启动,或者从A应用启动B应用,与本场景大同小异,本文中不再另做说明。

先看下简要的流程图:

如上图所示,当用户点击桌面上应用图标后,Launcher进程会将应用信息发送给AMS,由于这时应用进程还没有启动,所以需要先创建应用进程,AMS收到请求后会发送命令给zygote进程要求创建目标应用进程,当目标进程启动后,会将自身的远程handle注册给AMS,这样AMS就可以控制应用进程去执行接下来的一系列启动操作。

接下来,我们对这一过程做下详细说明。

1. 用户点击应用图标后,launcher进程向system_server进程发消息请求启动应用进程,即launcher通过startActivity()向AMS发送请求启动对应的activity,核心代码如下:

frameworks/base/core/java/android/app/Activity.java

其中,参数intent包含了要启动的目标应用的信息。

以上代码最终会调用AMS内部的startActivity(),由于Launcher和AMS分属不同进程,这一过程通过binder通信。

2. system_server进程收到请求后,通过其内部逻辑,即AMS收到startActivity()调用后,会进行必要的权限检查,创建activity的内部表示即ActivityRecord对象,并显示一个空白的窗口。

核心代码如下:

frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java

由于应用冷启动时进程不存在,AMS会通过zygote创建应用进程。

核心代码如下:

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

具体流程如下:

在非冷启动的情况,即如果应用进程已经启动完成,则可以直接进入启动activity的逻辑,代码如下:

在冷启动的startProcessLocked()调用过程中,有一个参数需要特别注意,即 ”entryPoint”,这个参数表示zygote分裂出的应用进程的入口,其定义为:

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

也就是说,ActivityThread是应用程序的入口。

3. 当应用进程启动后,会进入ActivityThread的main()方法执行应用端逻辑;

核心代码如下:

frameworks/base/core/java/android/app/ActivityThread.java

创建ActivityThread对象时,会同时创建应用进程的表示对象,即该应用的handle,代码如下:

frameworks/base/core/java/android/app/ActivityThread.java

同时要特别注意应用进程的“attach”操作,这一操作会将应用进程自身的远程handle即mAppThread注册给AMS,这样AMS就可以和应用通信,通知应用执行后续的操作,启动相应的activity;

核心代码如下:

frameworks/base/core/java/android/app/ActivityThread.java

4. 现在应用进程已经启动,并且已与AMS建立关联,AMS会继续执行启动应用的第一个activity的逻辑;

核心代码如下:

frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java

其中,realStartActivityLocked()会通知应用启动相应activity,逻辑如下:

5. 应用进程收到 ”launch”及”resume” 命令后,就会创建相应的activity对象以及关联的窗口对象等资源,并调用activity的生命周期回调函数完成activity的显示;到此,应用进程的第一个activity就创建完成了;

核心代码如下:

frameworks/base/core/java/android/app/ActivityThread.java

初始化图形资源及与WMS的连接:

创建activity对象:

初始化activity实例:

调用activity的onCreate()函数:

接下来会继续activity的其它生命周期回调函数并将activity显示出来,至此,一个应用的首个activity即完成了启动。

总结

本文简要说明了安卓平台上应用启动的流程,通过本篇介绍,希望读者能理清应用启动的大致脉络,对应用启动过程有一个基本的理解。

参考资料

[1]http://androidxref.com/

[2]https://developer.android.com/topic/performance/vitals/launch-time

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号

安卓系统应用启动流程分析相关推荐

  1. 蓝牙配对码配置错误_安卓系统蓝牙配对流程分析

    安卓系统蓝牙配对流程分析 配对流程基本上始于首次连接一个蓝牙设备的过程中,本端的搜索流程结束获取到该设备的BluetoothDevice信息,就可以开启配对流程. 配对,顾名思义就是将两个设备通过相关 ...

  2. 安卓application_安卓系统蓝牙配对流程分析

    安卓系统蓝牙配对流程分析 配对流程基本上始于首次连接一个蓝牙设备的过程中,本端的搜索流程结束获取到该设备的BluetoothDevice信息,就可以开启配对流程. 配对,顾名思义就是将两个设备通过相关 ...

  3. Android系统的启动流程简要分析

    这是我结合网上的资料以及自己分析android4.4的源码整理的笔记,对整个安卓系统的流程启动进行了梳理,很多细节并未展开,只是简要的进行了介绍. 一.Android系统的架构介绍 Android的整 ...

  4. Android系统开机到Launcher启动流程分析

    本文基于Android10.0的源码. 由于google团队在对framework层代码进行大量重构,所以代码变动还是挺大的. 常见基础问题: SystemServer系统服务进程是如何创建的?Lau ...

  5. 结合源码探讨Android系统的启动流程

    结合源码探讨Android系统的启动流程 由于本人能力有限,所考虑或者疏忽错漏的地方或多或少应该存在.同时,Android从启动过程开始,实际上就涉及多个技术难点和多种通信机制的知识点. 基于上面两个 ...

  6. c++builder启动了怎么停止_App 竟然是这样跑起来的 —— Android App/Activity 启动流程分析...

    在我的上一篇文章: AJie:按下电源键后竟然发生了这一幕 -- Android 系统启动流程分析​zhuanlan.zhihu.com 我们分析了系统在开机以后的一系列行为,其中最后一阶段 AMS( ...

  7. SpringBoot启动流程分析(四):IoC容器的初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  8. Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析

    uboot启动流程分析如下: 第一阶段: a -- 设置cpu工作模式为SVC模式 b -- 关闭中断,mmu,cache v -- 关看门狗 d -- 初始化内存,串口 e -- 设置栈 f -- ...

  9. bootloader启动流程分析

    bootloader启动流程分析 1.Bootloader的概念和作用 Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序.在完成对系统的初始化任务之后,它会将Flash中 ...

最新文章

  1. 【GDB】gdbserver的使用,远程调试开发板
  2. MongoDB windows解压缩版安装
  3. 牛客网(剑指offer) 第十题 矩形覆盖
  4. 怎样将Redis以本地服务方式进行启动?
  5. python去除读取文件中多余的空行
  6. java求字符串数组交集、并集和差集
  7. vs2013 旗舰版 密钥
  8. setupfactory安装程序设置开机自启动
  9. iOS——应用内调用Face ID、Touch ID
  10. rocketmq 消息删除_清空rocketmq消息方法
  11. SRTF最短剩余时间优先调度C语言实现
  12. 自然语言处理(NLP)概论
  13. 自定义店招应该具有的基本功能
  14. 有没有比图灵机能力更强的计算模型?
  15. 数字经济|引领建筑业数字化信息化转型
  16. jacobWord案例
  17. NANO开发套件SD卡烧录+opencv配置+tensorrt+cuda10.2
  18. Linux服务篇-sshd服务
  19. 【Nginx】第二十二节 redirect跟permanent区别
  20. 企业信息化建设中微服务架构选择的必要性

热门文章

  1. magento 瘦身数据库
  2. Linux文件、目录权限及常用命令
  3. 【转】Web服务软件工厂
  4. 查找含有特定字符的存储过程
  5. abap常用系统变量
  6. 原创--DataGrid自动分页例子,通过存储过程
  7. python判断字典,列表,元组为空的方法。
  8. 28--仅仅反转字母
  9. 网络爬虫--14.【糗事百科实战】
  10. 如何根据对象获取到对应的表名_Excel VBA 常用对象二