Android系统启动过程 从系统层看:linux系统层Android系统服务层Zygote 从开机启动到HomeLauncher:启动bootloader(小程序;初始化硬件)加载系统内核(先进入实模式代码再进入保护模式代码)启动init进程(用户级进程,进程号为1)启动Zygote进程(初始化DalvikVM等)启动Runtime进程启动本地服务(systemservice)启动HomeLauncher详细解析 Android系统完整的启动过程,从系统层次角度可分为Linux系统层、Android系统服务层、Zygote进程模型三个阶段;从开机到启动HomeLauncher完成具体的任务细节可分为七个步骤,下面就从具体的细节来解读Android系统完整的初始化过程。 一、启动BootLoader Android系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样。当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。 而Linux系统启动时:首先要加载BIOS的硬件信息,并获取第一个启动设备的代号读取第一个启动设备的MBR的引导加载程序(lilo、grub等)的启动信息。加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有的硬件设备。 。。。。。 在嵌入式系统中,通常不会有像BIOS那样的固件程序,因此整个系统的加载任务都是通过BootLoader完成的。 二、加载系统内核 Linux内核映像通常包括两部分代码,分别为实模式代码和保护模式代码。当BootLoader装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行完成后转入保护模式代码。 实模式和保护模式的概念再次不做过多解释,读者可以自行查阅资料。 三、启动Init进程 当系统内核加载完成之后,会首先启动Init守护进程,它是内核启动的第一个用户级进程,它的进程号总是1。Init进程启动完成之后,还负责启动其他的一些重要守护进程,包括: Usbd进程(USBDaemon):USB连接后台进程,负责管理USB连接。 adbd进程(AndroidDebugBridgeDaemon):ADB连接后台进程,负责管理ADB连接。 debuggerd进程(DebuggerDaemon):调试器后台进程,负责管理调试请求及调试过程。 rild进程(RadioInterfaceLayerDaemon):无线接口层后台进程,负责管理无线通信服务。 四、启动Zygote进程 Init进程和一些重要的守护进程启动完成之后,系统启动Zygote进程。Zygote进程启动后,首先初始化一个DalvikVM实例,然后为它加载资源与系统共享库,并开启Socket监听服务,当收到创建DalvikVM实例请求时,会通过COW(copyonwrite)技术最大程度地复用自己,生成一个新的DalvikVM实例。DalvikVM实例的创建方法基于linux系统的fork原理。 其实,我个人理解,Zygote进程就相当于Linux系统中的fork进程。由它可以在系统运行期间,接收到创建虚拟机请求时,孵化DalvikVM实例。Zygote进程孵化DalvikVM实例流程如下图所示: 图1Zygote进程孵化DalvikVM实例流程 五、启动Runtime进程 在Zygote进程启动完成之后,Init进程会启动Runtime进程。Runtime进程首先初始化服务管理器(ServiceManager),并把它注册为绑定服务(Binderservices)的默认上下文管理器,负责绑定服务的注册与查找。然后Runtime进程会向Zygote进程发送启动系统服务(SystemService)的请求,Zygote进程收到请求后,会孵化出一个新的DalvikVM实例并启动系统服务进程。Runtime进程的启动流程如下图所示: 图2Runtime进程启动流程图 六、启动本地服务 SystemService会首先启动两个本地服务(由C或C编写的native服务),SurfaceFlinger和AudioFlinger,这两个本地系统服务向服务管理器注册成为IPC服务对象,以便在需要它们的时候很容易查找到。然后SystemService会启动一些Android系统管理服务,包括硬件服务和系统框架核心平台服务,并注册它们成为IPC服务对象。本地服务进程的启动流程如下图所示: 图3SystemService启动本地服务流程图 七、启动HomeLaucher 当SystemService加载了所有的系统服务后就意味着系统就准备好了,它会向所有服务发送一个系统准备完毕(systemready)广播。SystemService系统服务进程的启动流程如图3所示。当ActivityManagerService接收到systemready广播后,会向Zygoute进程发送创建Dalvik虚拟机实例的请求,Zygoute进程会负责生成一个新的Dalvik虚拟机实例,然后ActivityManagerService在系统中查找具有属性的Activity,并启动它。ActivityManagerService同时也会使用同样的方法启动Contact应用程序。 图4启动HomeLaucher流程图APk安装过程 Android应用安装有如下四种方式: 1。系统应用安装开机时完成,没有安装界面 2。网络下载应用安装通过market应用完成,没有安装界面 3。ADB工具安装没有安装界面。 4。第三方应用安装通过SD卡里的APK文件安装,有安装界面,由packageinstaller。apk应用处理安装及卸载过程的界面。 应用安装的流程及路径 应用安装涉及到如下几个目录: systemapp:系统自带的应用程序,获得adbroot权限才能删除 dataapp:用户程序安装的目录。安装时把apk文件复制到此目录 datadata:存放应用程序的数据 datadalvikcache:将apk中的dex文件安装到dalvikcache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一) 安装过程 复制APK安装包到dataapp目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvikcache目录,并在datadata目录下创建对应的应用数据目录。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方法。最后 在这里我再分享一份由多位大佬亲自收录整理的Android学习PDF架构视频面试文档源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。 当然,你也可以拿去查漏补缺,提升自身的竞争力。 如果你有需要的话,只需私信我【进阶】即可获取