Android系统启动流程简析

一、系统启动过程

当电源按下时,引导芯片代码从ROM开始执行。加载引导程序BootLoader到内存RAM中。BootLoader是Android系统运行前的一段小程序,主要作用是把系统OS拉起来。拉起系统后,首先启动的是Linux内核,Linux内核启动时会加载驱动,在内核完成设置后会在系统文件里寻找init.rx文件,然后启动init进程。

init进程启动后,做了很多初始化工作:

(1)创建和挂载启动所需要的系统文件目录,比如挂载用于保存正在运行的进程信息的proc目录。
(2)初始化和启动属性服务。
(3)解析init.rc文件启动Zygote进程。

Zygote进程,也叫孵化器进程。在Android系统中,DVM(Dalvik虚拟机)和ART、应用程序进程、运行着系统关键服务的SystemServer进程都是由Zygote进程来创建的。它通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程。由于Zygote进程在启动时会创建DVM或者ART,因此通过fork创建的应用程序进程和SystemServer进程可以在内部获得一个DVM或者ART的实例副本。

关于DVM和ART对比:

Dalvik

(1)一直以来,Dalvik 虚拟机背负着 Android 应用卡顿的罪名;
(2) 其实在 Android 4.2 以前,安卓手机系统的应用程序均在 Dalvik Java 的虚拟机上运行;
(3)这种运行模式在运行应用的过程中,还要依靠一个编译器来实现与应用程序的沟通。
(4)应用程序每次运行时,都需要将程序内的代码即使转变为机器码才能运行,这无形中多附加了一道手续,这就造成了耗电相对较快、占用内存大、即使是旗舰机用久了也会卡顿严重的现象。

ART,Android Runtime 的简称。

优点:
(1)通过在安装应用程序时,自动对程序进行代码预读取编译,让程序直接编译成机器语言,免去了Dalvik模式要时时转换代码,实现高效率、省电、占用更低的系统内存、手机运行流畅。
缺点:
(1)占用略高一些的存储空间;安装程序时要相比普通 Dalvik 模式要长一些时间来实现预编译。

Zygote进程启动后,做了以下工作:

(1)创建一个名字为zygote的服务端Socket。
(2)fork一个SystemServer进程并启动。
(3)等待AMS请求创建新的应用进程,和AMS进行通信就是通过Socket的形式。

SystemServer进程启动后,做了以下工作:

(1)启动Binder线程池,这样SystemServer进程就可以使用Binder和其他进程进行通信
(2)创建SystemServiceManager,用于对系统服务进行创建、启动以及生命周期的管理。
(3)通过SystemServiceManager启动各种服务,比如AMS WMS PMS等系统服务。
(4)在SystemServer的startOtherServices中调用AMS的systemReady方法,在这个方法里会通过Zygote开启一个Launcher进程,然后跳转到Launcher组件里,也就是我们的桌面程序。

Launcher应用主要工作:

(1)用于启动应用程序
(2)显示系统已安装的应用图标。这个过程是,通过Launcher页面的onCreate方法去加载所有的APP信息。最终通过AllAppsRecyclerView来显示在桌面。其实Launcher是用工作区的形式来显示系统安装的应用程序的快捷图标。一个工作区是由N个屏幕组成,每个屏幕又分为N个单元格,每个单元格就是用来显示一个应用程序的快捷图标。

二、点击桌面APP的启动过程

Android系统启动流程简析_第1张图片

(1)点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
(2)system_server进程的AMS接收到请求后,向zygote进程发送创建进程的请求;
(3)Zygote进程fork出新的子进程,即App进程;
(4)App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
(5)system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
(6)App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
(7)主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
(8)到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

你可能感兴趣的:(Android,Android系统启动)