-
Android 系统服务层
-
Zygote
从开机启动到 Home Launcher:
-
启动 bootloader (小程序;初始化硬件)
-
加载系统内核 (先进入实模式代码再进入保护模式代码)
-
启动 init 进程(用户级进程 ,进程号为1)
-
启动 Zygote 进程(初始化Dalvik VM等)
-
启动 Runtime 进程
-
启动本地服务(system service)
-
启动 HomeLauncher
================================================================
Android系统完整的启动过程,从系统层次角度可分为 Linux 系统层、Android 系统服务层、Zygote进程模型三个阶段;从开机到启动 Home Launcher 完成具体的任务细节可分为七个步骤,下面就从具体的细节来解读 Android 系统完整的初始化过程。
Android 系统是基于 Linux 操作系统的,所以它最初的启动过程和 Linux 一样。当设备通电后首先执行 BootLoader 引导装载器,BootLoader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。
而Linux系统启动时:
-
首先要加载 BIOS 的硬件信息,并获取第一个启动设备的代号
-
读取第一个启动设备的MBR的引导加载程序(lilo、grub等)的启动信息。
-
加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有的硬件设备。
…
在嵌入式系统中,通常不会有像 BIOS 那样的固件程序,因此整个系统的加载任务都是通过 BootLoader 完成的。
Linux 内核映像通常包括两部分代码,分别为实模式代码和保护模式代码。当 BootLoader 装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行完成后转入保护模式代码。
实模式和保护模式的概念再次不做过多解释,读者可以自行查阅资料。
当系统内核加载完成之后,会首先启动 Init 守护进程,它是内核启动的第一个用户级进程,它的进程号总是 1。Init 进程启动完成之后,还负责启动其他的一些重要守护进程,包括:
Usbd 进程(USB Daemon):USB 连接后台进程,负责管理 USB 连接。
adbd 进程(Android Debug Bridge Daemon):ADB 连接后台进程,负责管理 ADB 连接。
debuggerd 进程(Debugger Daemon) :调试器后台进程,负责管理调试请求及调试过程。
rild 进程 (Radio Interface Layer Daemon):无线接口层后台进程,负责管理无线通信服务。
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 实例流程如下图所示:

图1 Zygote进程孵化Dalvik VM实例流程
在 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启动本地服务流程图
当 SystemService 加载了所有的系统服务后就意味着系统就准备好了,它会向所有服务发送一个系统准备完毕(systemready) 广播。SystemService 系统服务进程的启动流程如图3所示。当ActivityManagerService 接收到 systemready 广播后,会向Zygoute进程发送创建Dalvik 虚拟机实例的请求,Zygoute 进程会负责生成一个新的 Dalvik 虚拟机实例,然后 ActivityManagerService 在系统中查找具有属性的Activity,并启动它。ActivityManagerService 同时也会使用同样的方法启动 Contact 应用程序。

图4 启动Home Laucher流程图
====================================================================
Android应用安装有如下四种方式:
1.系统应用安装――开机时完成,没有安装界面
2.网络下载应用安装――通过market应用完成,没有安装界面
3.ADB 工具安装――没有安装界面。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。







既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)

文末
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
s.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0)
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
934

被折叠的 条评论
为什么被折叠?



