一、安卓app启动流程(冷启动)分析:

一般来说,冷启动包括以下几个步骤:

1、启动APP进程: 当我们点击Launcher桌面程序的APP图标时,Launcher程序会调用startActivity()函数,通过Binder跨进程通信,发送消息给system_server进程。在system_server进程中,由AMS通过socket通信告知Zygote进程fork出一个子进程(APP进程)。

2、开启APP主线程: APP进程启动后,会实例化一个ActivityThread,并执行其main函数,同时会创建ApplicationThread、Looper、Handler对象,开启主线程消息循环Looper.loop()。

3、创建并初始化Application和Activity: ActivityThread的main函数通过调用attach方法进行 Binder 通信,通知system_server进程执行AMS的attachApplication方法。在attachApplication方法中,AMS分别通过bindApplication、scheduleLaunchActivity方法,通知APP进程的主线程Handler,对APP进程的Application和Activity进行初始化,并执行Application、Activity的生命周期。

4、UI布局和绘制: 主线程Handler初始化Activity时,会执行创建PhoneWindow、初始化DecorView的操作,并且添加布局到DecorView的ContentView中。ContentView,对应着Activity的setContentView中设置的layout.xml布局文件所在的最外层父布局。Android视图层次结构如下图:

APP启动流程图

二、启动过程中涉及到的关键角色介绍:

1、Zygote进程: Android系统启动过程中,会先启动linux内核,然后加载init.rc文件,启动init进程。然后,init进程通过解析init.rc文件fork生成Zygote进程,该进程也是Android系统的首个Java进程。之后Zygote进程负责孵化System Server进程和APP进程。

2、SystemServer进程: 由Zygote进程fork生成,SystemServer是Zygote孵化的第一个进程。负责启动、管理整个Java Framework,系统里面重要的服务都是在这个进程里面开启的,比如AMS(ActivityManagerService)、PMS(PackageManagerService)、WMS(WindowManagerService)。

3、APP进程: Zygote进程在App层中孵化出的第一个进程是Launcher进程,即手机的桌面APP。Zygote还会孵化出Browser、Email、Phone等APP进程,每个APP至少运行在一个进程上。所有APP进程都由Zygote进程fork生成。

4、Android系统里的Client/Server模式: 平时我们所熟知的前端(Web\Android\iOS)通过网络与服务器通信是客户端-服务端模式的体现,而在Android Framework中,四大组件的创建、生命周期也是通过这样的模式进行通信。
服务器端(server):指的就是SystemServer进程,这个进程提供了很多服务,比如AMS、PMS、WMS等等,所有的APP进程都可以与其通信。
客户端(client):指的就是各个独立的APP进程。
Android开发中,我们可以通过Package包名和Activity类名,来打开一个APP。实际上,项目里的业务代码startActivity()方法并不是直接创建进程、拉起APP的。而是通过一系列的调用,把请求传递给SystemServer的AMS。AMS收到来自客户端的请求后,再通知zygote进程来fork一个新进程,来开启我们的目标APP。APP中所有Activity的生命周期过程,都由AMS(SystemServer进程)统一调度,并在APP自身进程中具体完成。

这个过程涉及到3个进程:APP进程、SystemServer进程、Zygote进程。
APP进程与SystemServer进程通过Binder机制,进行跨进程通信。
SystemServer进程与Zygote进程通过Socket,进行跨进程通信。

5、Android Binder机制: 在Android系统中,一个进程的空间,分为用户空间和内核空间两部分。进程内的用户空间和内核空间可以进行数据交互。进程间的用户空间是隔离开来的,只有内核空间能进行数据交互。
APP进程与SystemServer进程的交互,就是通过Binder机制进行跨进程通信(IPC),实现进程间的内核数据交互过程。Android专门设计了2个Binder接口,用作交互使用。

IApplicationThread: 作为系统进程请求应用进程的接口。
IActivityManager: 作为应用进程请求系统进程的接口。

总结

在Android中,所有应用都是一个独立的进程。
每个应用进程都是由Zygote进程fork出来的。
应用启动是一个跨进程的复杂工作,应用启动流程主要是围绕着SystemServer的ActivityManagerService和应用进程的ActivityThread展开的。
APP应用的启动流程内容比较多,可以通过Launcher响应屏幕点击、APP进程的创建、Application初始化、UI布局和绘制这四部分来理解。

安卓APP应用启动流程详解相关推荐

  1. 【线上沙龙直播报名】App 启动流程详解及其优化

    点击上方"公众号"可以订阅哦 [美团点评技术沙龙Online]是美团点评技术团队推出的线上分享课程,每月2-3期,采用目前最火热的线上直播形式,邀请美团点评技术专家,面向互联网技术 ...

  2. U-Boot启动流程详解

    参考:U-Boot顶层目录链接脚本文件(u-boot.lds)介绍 作者:一只青木呀 发布时间: 2020-10-23 13:52:23 网址:https://blog.csdn.net/weixin ...

  3. 【Autosar 启动流程详解】

    Autosar 启动流程详解 1. vLinkGen_Template.lsl 2. BrsHwStartup.c 3.BrsMainStartup.c 4.BrsMain.c 链接文件: 1. vL ...

  4. 【正点原子Linux连载】第三十二章 U-Boot启动流程详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  5. golang程序启动流程详解

    golang程序启动流程详解 环境 go1.16.5 linux/amd64 用例 package mainimport "fmt"func main() {fmt.Println ...

  6. android zygote启动流程,Android zygote启动流程详解

    对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...

  7. Android App启动流程详解

    前言:在之前的文章中已经写了apk的打包流程.安装流程,今天就是梳理一下apk系列的最后的流程--app启动流程.经过今天的梳理以后咱们就可以对apk包是怎么编译生成的.apk是怎么被安装到安卓手机的 ...

  8. Springboot启动流程详解

    SpringMVC请求流程详解 SpringMVC框架是一个基于请求驱动的Web框架,并且使用了'前端控制器'模型来进行设计,再根据'请求映射规则'分发给相应的页面控制器进行处理. (一)整体流程 每 ...

  9. CentOS系列启动流程详解

    一.Linux启动内核文件 1.Linux系统组成 动态视角:内核+根文件系统 静态视角:磁盘分区+相关文件 2.Kernel特点 (1)支持某块化:.ko (kernel object)文件 (2) ...

  10. S5PV210 Uboot开发与移植03:Uboot启动流程详解

    目录 1. start.S解析 1.1 uboot入口分析 1.2 头文件包含 1.2.1 config.h 1.2.2 version.h 1.2.3 asm/proc/domain.h 1.2.4 ...

最新文章

  1. 判断路径下文件是否存在
  2. Http与RPC通信协议的比较
  3. ELK 处理 Spring Boot 日志,有点强悍!
  4. 机房几台终端电脑,本地连接中不停的出现连接和断开,网络不通,解决方法...
  5. 剑指Offer - 面试题6. 从尾到头打印链表(栈,递归,反转链表)
  6. phpVX活码系统源码
  7. 【Python系列】python GUI界面
  8. 谷歌搜索363搜索引擎入口_SEO谷歌搜索引擎优化到底有啥好?
  9. logistics 与最大熵模型原理及python代码实现
  10. 【图像转换】基于matlab二维图转三维图【含Matlab源码 465期】
  11. WAP PUSH 技术
  12. 高级项目管理-3、项目立项、变更、整体管理
  13. 网易数帆、云音乐、Intel、有赞最新大数据实践(PPT下载+视频回放)
  14. ubuntu20.04【一键脚本安装wps并配置字体】
  15. 过去式和过去分词的用法区别
  16. Unity游戏开发客户端面经——性能优化(初级)
  17. Markdown开发VSCode插件推荐
  18. 有哪些有意思高质量的中文网站
  19. python龙旋风图形代码_python-如何在数据库中使龙卷风请求成为原...
  20. 多多参谋:拼多多推广怎么出价?该怎么做好推广?

热门文章

  1. 我的梦想是成为一名计算机程序员英语怎么说,我梦想将来成为一名程序员英语作文...
  2. ug编程内公差和外公差是什么_UG编程
  3. 微信公众号提供的服务器地址,微信测试号与公众号能填同一个服务器地址吗?...
  4. WT2003HX语音芯片IC在儿童玩具产品的应用设计方案
  5. 笔记本计算机无法上无线网络,笔记本电脑连不上无线网络的处理方法
  6. 电动汽车电池换电站选址与定容(Matlab代码实现)
  7. 微信小程序金额千分位
  8. java怎么做小人跑动的动画_纯CSS3实现人物跑步动画
  9. java 批量修改图片名称_java 批量修改文件名称
  10. java cmyk和rgb的转换_CMYK与RGB相互转换(java)