当前位置: 首页 > news >正文

Android面试题之说说系统的启动流程(总结)

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

启动流程

Boot Rom -> Boot Loader -> Kernel -> 启动Init进程 -> Zygote进程 -> system_server进程 -> 启动AMS、WMS、PMS等服务 -> AMS启动Launcher应用的home activity

init进程(用户级别的第一个进程)

  • 创建和挂载启动所需要的文件目录
  • 初始化和启动属性服务
  • 解析init.c配置文件并启动zygote进程

使用fork函数复制进程

  • 子进程是父进程的一个复制品。它从父进程处继承了整个进程的地址空间;包括进程上下文(进程执行活动全过程的静态描述)、进程堆栈、打开的文件描述符、信号控制设定、进程优先级、进程组号等。子进程所独有的只有它的进程号,计时器等(只有少量信息)。因此fork函数的代价是很大的
子进程和父进程的区别
  • 除了文件锁以外,其他的锁都会被继承
  • 各自的进程ID和父进程ID不同
  • 子进程的未决告警被清除
  • 子进程的未决信号集设置为空集
多线程进程的fork调用
  • 仅当前线程到子进程
  • 如果当前线程有锁,锁也会被复制到子进程。子进程中没有其他方式可以解开,程序发生死锁。
  • 孤儿进程:fork后,父进程和子进程交替运行,顺序不定。如果父进程先退出,子进程还没退出,子进程的父进程就变成了Init进程(任何一个进程都必须有父进程)
  • 僵尸进程:如果子进程先退出,父进程还没退出,那么子进程必须等到父进程捕获到了子进程的退出状态才真正结束,否则这个时候子进程就称为僵尸进程(只保留一些退出信息供父进程查询)

zygote进程

app_main.cpp main() -> AndroidRunTime.start() -> startVm()启动虚拟机 -> startReg()注册一些信息 -> 创建socket服务用于进程通信(Binder进程还没启动) -> startSystemServer(),SystemServer会启动其他的一系列服务 ->

AndroidRunTime

为Android应用运行所需的运行时环境,包括:

  • Dalvik VM 虚拟机,解释运行Dex格式的Java程序,每个进程运行一个虚拟机(就是一些C代码,不停的去解释Dex格式的二进制码,把它们转换成机器码,然后执行,现在大部分虚拟机都支持JIT,也就是bytecode可能在运行前就已经被转换成机器码)
  • Android的Java类库
  • JNI:C和Java互相调用的接口
  • LibC

startVm

Runtime

zygote的app_main.cpp main()函数主要做的就是参数解析,这个函数有2种启动模式:一种是zygote模式,启动zygote进程;一种是application模式,启动普通应用程序。

AndroidRunTime的startVm方法会创建Runtime对象,负责ART虚拟机运行时环境

Runtime的Init方法会开辟堆内存,后面还会用Thread开启线程,命名为“main”,也就是主线程

  • 通过Heap创建堆内存管理对象
  • 通过JavaVMExt创建Java虚拟机对象
  • Thread::Attach连接主线程
  • new ClassLinker创建类连接器,并初始化

zygote的main函数

  • 新建ZygoteServer服务器端,注册socket
  • Preload函数预加载资源,包括指定的类,Android的资源,比如drawable\color,openGL,加载共用的Library,text资源字体等。系统启动过程中,这一块耗时比较长。
  • 然后主动开启一次GC
  • 然后通过forkSystemServer方法fork出SystemServer进程
  • zygoteServer.runSelectLoop会监听客户端创建进程的请求,收到请求就Fork进程
为什么不从init进程Fork Android的进程,而是从Zygote进程fork?

这是因为zygote进程已经通过Preload函数预加载了很多资源,fork以后新进程就有了,从init的话就得重新加载一遍,非常耗时

那为什么不从SystemServer进程fork新的APP进程呢?

因为SystemServer进程里开启了一系列的AMS、PMS等80多个服务,APP进程是不需要的

forkSystemServer
  • 最终会调用到Linux的fork函数,fork出的是zygote进程
  • fork成功后,会关闭closeServerSocket服务,因为SystemServer进程不需要socket
  • 接着会逐步调用到SystemServer的main函数
SystemServer的main函数
  • 创建系统上下文,SystemContext;会通过ActivityThread来创建Instrumentation;通过ContextImpl创建SystemContext对象,然后创建LoadAPK对象–>创建Application和ClassLoader
  • 启动AMS、PMS、WMS等80多个Android服务
  • 服务都启动完成以后,会调用Looper.loop()
  • 最后启动Launcher程序

欢迎关注我的公众号查看更多精彩文章!

AntDream

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python 机器学习 基础 之 【实战案例】轮船人员获救预测实战
  • 常用的三种软件架构
  • 【Vue】购物车案例-构建项目
  • 15.2 测试-网格测试、基准测试与测试覆盖率
  • 基于拓扑漏洞分析的网络安全态势感知模型
  • 源码讲解kafka 如何使用零拷贝技术(zero-copy)
  • 云端之上的边缘:解读云计算与边缘计算的战略融合
  • 苹果召开WWDC:属于你的“定制”AI智能?
  • 直线度测量仪发展历程!
  • 鸿蒙原生开发——轻内核A核源码分析系列三 物理内存(2)
  • 利用 AI 深度学习,实现化合物配比最优化解决方案
  • Android:UI:Drawable:View/ImageView与Drawable
  • React实现在线预览word报告/本地选择报告预览
  • LabVIEW调用DLL时需注意的问题
  • 文件IOoooo
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • Cookie 在前端中的实践
  • dva中组件的懒加载
  • ES6简单总结(搭配简单的讲解和小案例)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Redis中的lru算法实现
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 记一次和乔布斯合作最难忘的经历
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 思否第一天
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ​如何使用QGIS制作三维建筑
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (¥1011)-(一千零一拾一元整)输出
  • (7)STL算法之交换赋值
  • (Java数据结构)ArrayList
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)php投票系统 毕业设计 121500
  • (四)汇编语言——简单程序
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (转)创业的注意事项
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./和../以及/和~之间的区别
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET CLR Hosting 简介
  • .NET Framework杂记
  • .NET 中的轻量级线程安全
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .netcore 获取appsettings
  • .NET开发人员必知的八个网站
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林