--摘自《Android进阶解密》
一。启动电源以及系统启动
当电源按下时引导芯片代码聪预定义的地方(固化在ROM)开始执行。加载引导程序到BootLoader到RAM,然后执行
二。引导程序BootLoader
引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行
三。Linux内核启动
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动init进程
四。init进程启动
初始化和启动属性服务,并且启动Zygote进程
1)创建和挂载启动所需的文件目录
2)初始化和启动属性服务
3)解析init.rc配置文件并启动Zygote进程
五。Zygote进程
创建Java虚拟机并为Java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程
1)创建AppRuntime并调用其start方法,启动Zygote进程
2)创建Java虚拟机并为Java虚拟机注册JNI方法
3)通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层
3.1)创建一个Server端的Socket
3.2)预加载类和资源
3.3)启动SystemServer资源
3.4)等待AMS请求创建新的应用程序进程
4)通过registerZygoteSocket方法创建服务器端Socket,并通过sunSelectLoop方法等待AMS的请求来创建新的应用程序进程
5)启动SystemServer进程
六。SystemServer进程启动
启动Binder线程池和SystemServiceManager,并且启动各种系统服务
1)启动Binder线程池,这样就可以与其他进程进行通信
2)创建SystemServiceManager,其用于对系统的服务进行创建、启动和生命周期管理
3)启动各种系统服务
七。Launcher启动
被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上
知识点:
1.与JVM相比,Dalvik虚拟机(DVM)是专门为移动设备定制的,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有的程序都被关闭
2.DVM中的应用每次运行时,字节码都需要通过即时编译器JIT转换为机器码,这会是的应用的运行效率降低。而在ART中,系统在安装应用时会进行一次预编译(AOT),将字节码预先编译成机器码并存储在本地,这样应用每次运行时就不需要执行编译了,运行效率也大大提高
3.将控制硬件的动作放在硬件抽象层中,硬件抽象层的代码在hardware/目录中,这是手机厂商改动最大的部分,根据手机终端所采用的硬件平台不同会有不同的实现
4.init进程是Android系统中用户空间的第一个进程,进程号为1
5.子进程有时虽然已经退出了,但是在系统进程表中还为它保留了一定的信息(比如进程号、退出状态、运行时间等),这个子进程就被称作僵尸进程
6.在Android8.0中对init.rc文件进行了拆分,每个服务对应一个rc文件,Zygote启动脚本在init.zygote64.rc中定义
7.Windows平台有个注册表管理器,注册表的内容采用键值对的形式来记录用户、软件的一些使用信息。即使系统或者软件重启,其还是能够根据之前注册表中的记录,进行相应的初始化工作。Android也提供了一个类似的机制,叫做属性服务
8.DVM和ART、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也称它为孵化器
9.SystemServer进程主要用于创建系统服务,我们熟知的AMS、WMS和PMS都是由它来创建的
10.官方把系统服务分为三种类型,分别是引导服务、核心服务和其他服务
11.系统的运行模式分三种,分别是非工厂模式、低级工厂模式和高级工厂模式
12.通俗讲Launcher就是系统的桌面,它的作用主要有以下两点
1)作为Android系统的启动器,用于启动应用程序
2)作为Android系统的桌面,用于显示和管理应用程序的快捷图标或者其他桌面组件
欢迎关注我的微信公众号:安卓圈