Android 面试必备 - 系统、App、Activity 启动过程“一锅端”
Android 系统启动过程
从系统层看:
- linux 系统层
- Android系统服务层
- Zygote
从开机启动到Home Launcher:
- 启动bootloader (小程序;初始化硬件)
- 加载系统内核 (先进入实模式代码在进入保护模式代码)
- 启动init进程(用户级进程 ,进程号为1)
- 启动Zygote进程(初始化Dalvik VM等)
- 启动Runtime进程
- 启动本地服务(system service)
- 启动 HomeLauncher
详细解析
Android系统完整的启动过程,从系统层次角度可分为Linux系统层、Android系统服务层、Zygote进程模型三个阶段;从开机到启动Home Launcher完成具体的任务细节可分为七个步骤,下面就从具体的细节来解读Android系统完整的初始化过程。
一、启动BootLoader
Android 系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样。当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。
而Linux系统启动时:
- 首先要加载BIOS的硬件信息,并获取第一个启动设备的代号
- 读取第一个启动设备的MBR的引导加载程序(lilo、grub等)的启动信息。
- 加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有的硬件设备。
…………
在嵌入式系统中,通常不会有像BIOS那样的固件程序,因此整个系统的加载任务都是通过BootLoader完成的。
二、加载系统内核
Linux内核映像通常包括两部分代码,分别为实模式代码和保护模式代码。当BootLoader装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行完成后转入保护模式代码。
实模式和保护模式的概念再次不做过多解释,读者可以自行查阅资料。
三、启动Init进程
当系统内核加载完成之后,会首先启动Init守护进程,它是内核启动的第一个用户级进程,它的进程号总是1。 Init进程启动完成之后,还负责启动其他的一些重要守护进程,包括:
Usbd进程(USB Daemon):USB连接后台进程,负责管理USB连接。
adbd 进程(Android Debug Bridge Daemon):ADB连接后台进程,负责管理ADB连接。
debuggerd 进程(Debugger Daemon) :调试器后台进程,负责管理调试请求及调试过程。
rild进程 (Radio Interface Layer Daemon): 无线接口层后台进程,负责管理无线通信服务。
四、启动Zygote进程
Init进程和一些重要的守护进程启动完成之后,系统启动Zygote 进程。Zygote 进程启动后,首先初始化一个Dalvik VM实例,然后为它加载资源与系统共享库,并开启Socket监听服务,当收到创建Dalvik VM实例请求时,会通过COW(copy on write)技术最大程度地复用自己,生成一个新的Dalvik VM实例。Dalvik VM实例的创建方法基于linux系统的fork原理。
其实,我个人理解,Zygote进程就相当于Linux系统中的fork进程。由它可以在系统运行期间,接收到创建虚拟机请求时,孵化Dalvik VM实例。Zygote进程孵化Dalvik VM实例流程如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h0T1Raop-1618383095003)(https://upload-images.jianshu.io/upload_images/2050203-f4e29e30bf5de357.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]
图1 Zygote进程孵化Dalvik VM实例流程
五 、启动Runtime进程
在Zygote进程启动完成之后,Init进程会启动Runtime进程。Runtime进程首先初始化服务管理器(Service Manager),并把它注册为绑定服务(Binder services)的默认上下文管理器,负责绑定服务的注册与查找。然后Runtime进程会向Zygote进程发送启动系统服务(System Service)的请求,Zygote进程收到请求后,会“孵化”出一个新的Dalvik VM实例并启动系统服务进程。Runtime进程的启动流程如下图所示:
图2 Runtime进程启动流程图
六、启动本地服务
System Service会首先启动两个本地服务(由C或C++编写的native服务),Surface Flinger和Audio Flinger,这两个本地系统服务向服务管理器注册成为IPC服务对象,以便在需要它们的时候很容易查找到。然后SystemService 会启动一些 Android 系统管理服务,包括硬件服务和系统框架核心平台服务,并注册它们成为IPC服务对象。本地服务进程的启动流程如下图所示:
图3 SystemService启动本地服务流程图
七、启动Home Laucher
当SystemService加载了所有的系统服务后就意味着系统就准备好了,它会向所有服务发送一个系统准备完毕(systemready) 广播。SystemService系统服务进程的启动流程如图1-6所示。当ActivityManagerService 接收到systemready广播后,会向Zygoute进程发送创建Dalvik 虚拟机实例的请求,Zygoute进程会负责生成一个新的Dalvik 虚拟机实例,然后ActivityManagerService在系统中查找具有<category android:name = "android.intent.category.HOME"/>
属性的Activity,并启动它。ActivityManagerService同时也会使用同样的方法启动Contact(联系人)应用程序。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5n4nMJt4-1618383095009)(https://upload-images.jianshu.io/upload_images/2050203-af37d1f81dddb84f.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)]
图4 启动Home Laucher流程图
APk 安装过程
Android应用安装有如下四种方式:
1.系统应用安装――开机时完成,没有安装界面
2.网络下载应用安装――通过market应用完成,没有安装界面
3.ADB工具安装――没有安装界面。
4.第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由 packageinstaller.apk应用处理安装及卸载过程的界面。
应用安装的流程及路径
应用安装涉及到如下几个目录:
system/app ---------------系统自带的应用程序,获得adb root权限才能删除
data/app ---------------用户程序安装的目录。安装时把 apk文件复制到此目录
data/data ---------------存放应用程序的数据
data/dalvik-cache--------将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)
安装过程:
复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。
App 启动过程
这里以启动微信为例子说明
- Launcher通知AMS 要启动微信了,并且告诉AMS要启动的是哪个页面也就是首页是哪个页面
- AMS收到消息告诉Launcher知道了,并且把要启动的页面记下来
- Launcher进入Paused状态,告诉AMS,你去找微信吧
上述就是Launcher和AMS的交互过程
- AMS检查微信是否已经启动了也就是是否在后台运行,如果是在后台运行就直接启动,如果不是,AMS会在新的进程中创建一个ActivityThread对象,并启动其中的main函数。
- 微信启动后告诉AMS,启动好了
- AMS通过之前的记录找出微信的首页,告诉微信应该启动哪个页面
- 微信按照AMS通知的页面去启动就启动成功了。
Activity 启动过程
Activity 启动过程是由 ActivityMangerService(amS) 来启动的,底层 原理是 Binder实现的 最终交给 ActivityThread 的 performActivity 方法来启动她
ActivityThread大概可以分为以下五个步骤
- 通过ActivityClientRecoed对象获取Activity的组件信息
- 通过Instrument的newActivity使用类加载器创建Activity对象
- 检验Application是否存在,不存在的话,创建一个,保证 只有一个Application
- 通过ContextImpl和Activity的attach方法来完成一些初始化操作
- 调用oncreat方法
推荐阅读
架构师学习笔记
耗时268天,7大模块、2983页58万字,Android开发核心知识笔记!
Java基础、计算机网络、系统
史上最全!押题率90%的 Android 中高级工程师面试复习大纲及真题答案整理(上篇)
Android基础夯实99题,点这里
史上最全!押题率90%的 Android 中高级工程师面试复习大纲及真题答案整理(中篇)
Android高级面试题(上)
史上最全!押题率90%的 Android 中高级工程师面试复习大纲及真题答案整理(下篇)
Android高级面试题(下)
史上最全!押题率90%的 Android 中高级工程师面试复习大纲及真题答案整理(终章)
Android 面试必备 - 系统、App、Activity 启动过程“一锅端”的更多相关文章
- 根Activity启动过程
--摘自<Android进阶解密> 根Activity启动过程中会涉及4个进程,分别是Zygote进程.Launcher进程.AMS所在进程(SystemServer进程).应用程序进程, ...
- Android应用程序的Activity启动过程简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6685853 在Android系统中,Activ ...
- Android深入四大组件(四)Android8.0 根Activity启动过程(前篇)
前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...
- Android深入四大组件(五)Android8.0 根Activity启动过程(后篇)
前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...
- Android世界第一个activity启动过程
Android世界第一个activity启动过程 第一次使用Markdown,感觉不错. Android系统从按下开机键一直到launcher的出现,是一个如何的过程,中间都做出了什么操作呢.带着这些 ...
- App的启动过程
App的启动过程 所有的app都是通过launcher去启动的 launcher自己也是一个app,一个系统级别的app,放在asystem/app/下,使用系统签名. 对代码进行分析
- 【转】Android总结篇系列:Activity启动模式(lauchMode)
[转]Android总结篇系列:Activity启动模式(lauchMode) 本来想针对Activity中的启动模式写篇文章的,后来网上发现有人已经总结的相当好了,在此直接引用过来,并加上自己的一些 ...
- Android面试收集录1 Activity+Service
1.Activity的生命周期 1.1.首先查看一下Activity生命周期经典图片. 在正常情况下,一个Activity从启动到结束会以如下顺序经历整个生命周期: onCreate()->on ...
- Activity启动过程源代码分析
事实上写分析源代码文章总会显得非常复杂非常乏味,可是梳理自己看源代码时的一些总结也是一种提高. 这篇博客分析下Activity启动过程源代码,我会尽量说得简单点. 个人的观点是看源代码不能看得太细,否 ...
随机推荐
- LNMP配置——Nginx配置 —— Nginx的访问日志
一.配置 先来看看Nginx的日志格式 #grep -A2 log_format /usr/local/nginx/conf/nginx.conf log_format combined_realip ...
- 03-Spring默认标签解析
默认标签的解析 上一篇分析了整体的 xml 文件解析,形成 BeanDefinition 并注册到 IOC 容器中,但并没有详细的说明具体的解析,这一篇主要说一下 默认标签的解析,下一篇主要说自定义标 ...
- .Net Core 2.1 升级3.1 问题整理
随着技术的不断拓展更新,我们所使用的技术也在不断地升级优化,项目的框架也在不断地升级,本次讲解 .net core 2.1 升级到3.1所需要注意的事项: 当项目框架升级后,所有的Nuget引用也会 ...
- Linux入门视频笔记一(基本命令)
一.简单命令 1.date:当前时间 2.cal:当前日期(日历格式) ①cal 2019:2019年全年日历 ②cal 1 2019:2019年1月份 二.Linux文件结构 1.根目录:root( ...
- 递归实现1-n的全排列(JAVA语言)
思路: For example: 123的全排列= 1在最前面 23的全排列 + 2在最前面 13的全排列 + 3最前面 12的全排列 所以只需交换和最前面元素的位置,生成剩余元素的全排列即可. im ...
- 11、Spring教程之声明式事务
1.回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当成一个独立的工作单元,这 ...
- 工具 | Typora + PicGo-Core 自动上传图片到图床
0 前言 Markdown 是现在十分流行的标记式语言,在博客等很多场景中应用十分广泛.众所周知,Markdown 中的图片是以链接的形式存在的,不像 Word 等传统文本编辑器直接把图片嵌入文档中. ...
- Logtash 配置文件解析-转载
转载地址:https://dongbo0737.github.io/2017/06/13/logstash-config/ Logtash 配置文件解析 logstash 一个ELK架构中,专门用来进 ...
- 一本关于HTTP的恋爱日记
1991年 8月 我叫客户端,英文名字 client. 她叫服务端,英文名字 server. 这一年,我们出生了. 是的,我们都是90后. 我爱她,可是她却远在天边. 为了和她可以互诉衷肠,我同时发明 ...
- Day1---Java 基本数据类型 - 四类八种 --九五小庞
一.Java四大数据类型分类 1.整型 byte .short .int .long 2.浮点型 float . double 3.字符型 char 4.布尔型 boolean 二.八种基本数据类型 ...