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

简介: 这篇文章概述了Android系统的启动流程,从Boot Rom到Zygote进程和SystemServer的启动。init进程作为用户级别的第一个进程,负责创建文件目录、初始化服务并启动Zygote。Zygote通过预加载资源和创建Socket服务,使用fork函数生成SystemServer进程。fork过程中,子进程继承父进程大部分信息但具有独立的进程ID。Zygote预加载资源以减少后续进程的启动时间,而SystemServer启动众多服务并最终开启Launcher应用。文中还讨论了为何从Zygote而非init或SystemServer fork新进程的原因。

本文首发于公众号“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查看更多精彩文章!

目录
相关文章
|
3天前
|
算法 测试技术 持续交付
面试的流程,面试的重点
本文介绍了面试流程及各轮面试的重点。通常面试为1-5轮,首轮关注技术实力与项目经验,次轮深入考察技术细节,第三轮侧重项目协调、创新及价值观等软性问题,如职业规划和沟通能力。面试题分为开放型(如项目经验、解决问题思路)和非开放型(如技术细节、手撕算法),需提前准备。测试类问题涉及自动化测试、持续集成等实际应用。
|
1月前
|
人工智能 搜索推荐 物联网
Android系统版本演进与未来展望####
本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
|
1月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
21天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
22天前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
1月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
68 16
|
28天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
1月前
|
算法 JavaScript Android开发
|
1月前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
109 2
|
1月前
|
安全 搜索推荐 程序员
深入探索Android系统的碎片化问题及其解决方案
在移动操作系统的世界中,Android以其开放性和灵活性赢得了广泛的市场份额。然而,这种开放性也带来了一个众所周知的问题——系统碎片化。本文旨在探讨Android系统碎片化的现状、成因以及可能的解决方案,为开发者和用户提供一种全新的视角来理解这一现象。通过分析不同版本的Android系统分布、硬件多样性以及更新机制的影响,我们提出了一系列针对性的策略,旨在减少碎片化带来的影响,提升用户体验。