在此说明,此文章只是个人的一个关于“Android系统启动流程”的一个总结,没什么源码。

Android系统启动流程:

1、启动电源以及系统启动:

当电源键按下时引导芯片代码从预定义的地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM中,然后执行。

2、引导程序BootLoader:

引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。

3、Linux内核启动:

当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动init进程。

4、init进程启动:

初始化和启动属性服务,并且启动Zygote进程。

5、Zygote进程启动:

创建java虚拟机并为java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程。

6、SystemServer进程启动:

启动Binder线程池和SystemServiceManager,并且启动各种系统服务。

7、Launcher启动:

被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。

 

其中前3个我们就不怎么介绍了,主要来看下后面四个过程。

一、init进程启动、

init进程是Android系统中用户控件的第一个进程,进程号是1。

整个启动过程做了很多工作,不过总的来说分为以下三个部分:

(1)创建和挂载启动所需的文件目录:

这是init进程启动开始的第一步,其中挂载了tmpfs、devpts、proc、sysfs和selinuxfs共5种文件系统,这些都是系统运行时目录,顾名思义,只在系统运行时才会存在,系统停止时会消失。

(2)初始化和启动属性服务

首先在初始化属性服务之前,会调用一个signal_handler_init函数用于设置子进程信号处理,主要为了防止init进程的子进程称为僵尸进程,同时为了防止僵尸进程的出现,系统会在子进程暂停和终止的时候发出SIGCHLD信号,而signal_handler_init函数就是用来接收SIGCHLD信号的。举例:加入init子进程终止了,signal_handler_init函数最终会找到子进程并移除所以的子进程的信息,再重启子进程服务的进程脚本中待遇onrestart选项的服务。

属性服务其实类似于windows平台上的注册表管理器,主要用来存储一些属性,比如我们通过“getprop”命令获取的那些属性内容,设备的id、序列号、厂商啊什么的。

系统属性分为:控制属性和普通属性两种,控制属性用来执行一些命令,比如开机的动画等,比较属性名以“ctl.”开头的。普通属性比如手机厂商、型号这种就是普通属性,比如:“ro”、“persist”开头的等。

如果权限足够的话,就可以修改属性值,本身不存在此属性的话会进行属性值的添加。

(3)解析init.rc配置文件并启动Zygote进程

首先init.rc文件在系统的根目录下,它是由Android初始化语言(Android Init Language)编写的脚本,主要包含5中类型语句:Action、Command、Service、Option和Import。

init.rc里面主要是用到了Action和Service语句,其中 on 开头的比如“on init”、“on boot”就是Action语句,“service”开头的就是Service语句(大部分都是这个)。

init进程会解析对应的init.rc文件,然后执行响应的程序。init.rc脚本中每一个执行语句会定义对应的进程名称、可执行文件路径、参数、入口函数、用户分类等等信息,init进程解析完后并启动init.rc中定义的所有进程,其中包括“Zygote”进程。

Android8.0以后真的init.rc进行了拆分:其中Zygote进程拆分到了init.zygote32.rc(32位)、init.zygote64.rc(64位)文件中了。

说明:此过程是在c/c++层做的。

二、Zygote进程启动过程:

在Android系统中,DVM和ART、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器。

Zygote进程主要做了如下几个工作:

(1)创建AppRuntime并调用其start方法,启动Zygote进程(此过程是在init进程结束的时候执行的)

(2)创建java虚拟机并为java虚拟机注册JNI方法

此步骤主要是通过JNI进行一个从native层到java层的一个过渡。

(3)通过JNI调用ZygoteInit的main函数进入Zygote的java框架层

(4)通过registerZygoteSocket方法创建服务器Socket

通过registerZygoteSocket创建一个server端的socket,其中name为“zygote”,来等待ActivityManagerService请求Zygote来创建新的应用程序进程,同时进行预加载类和资源。

(5)启动SystemServer进程

Zygote通过fork方法创建SystemServer子进程。创建的SystemServer进程的用户id和组id为1000,进程名为:system_server,启动的类名为:com.android.server.SystemServer。

(6)通过runSelectLoop方法等待AMS的请求来创建新的应用程序进程

此方法中存在一个列表fds,用了保存AMS传送过来的要创建子进程的信息,这里面启动了一个无限循环,用来等待AMS请求Zygote进程创建新的应用进程,每次AMS来连接后会存放到fds中,创建子进程成功后,将对应连接从fds列表中删除。

三、SystemServer进程启动过程:

SystemServer进程主要用于创建系统服务,我们熟知的AMS、WMS和PMS都是由它来创建的。

SystemServer进程启动后主要做的工作如下:

(1)启动Binder线程池,这样就可以与其他进程进行通信

通过调用native层的代码nativeZygoteInit方法,来启动一个Binder线程池

(2)创建SystemServiceManager,其用于对系统的服务进程创建、启动和生命周期管理

启动Binder线程池后,紧接着会进入SystemServer的main方法(可以看做是SystemServer进程的入口),在main方法中,首先会创建一个消息looper,紧接着便会创建SystemServiceManager,它会对系统服务进行创建、启动和生命周期管理。

(3)启动各种系统服务

首先系统服务分为三种:引导服务、核心服务、其他服务。SystemServiceManager会依序将所有系统服务启动起来。对应方法为:startBootstrapServices()、startCoreServices()、startOtherServices()。

引导服务比如:PowerManagerService、ActivityManagerServer、PackageManagerService等

核心服务比如:BatteryService、UsagestatsService等

其他服务比如:WindowManagerService、CameraService、AlarmManagerService等

服务启动后会添加到mServices集合中,其中mServices是一个存储SystemService类型的ArrayList。上述所有系统服务都是SystemService的子类。Client端如果要使用某个Service,则需要查询对应的Service的相关信息,然后根据Service的额相关信息与Service所在的Server进程建立通信通路,这样Client端就可以使用Service了。

四、Launcher启动过程:

系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序就叫做Launcher。Lanucher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上。

通俗来讲Launcher就是Android系统的桌面,它的主要作用有:

(1)作为Android系统的启动器,用于启动应用程序

(2)作为Android系统的桌面,用于显示和管理应用程序的快捷图标或者其他桌面组件。

1、Launcher的的启动过程:

首先SystemServer进程会在启动的过程中启动PackageManagerService,PackageManagerService启动后会将系统中的应用程序安装完成,再此前已经启动的AMS会将Launcer启动起来,启动Launcher的入口为AMS的systemReady方法,它在Systemserver的startOtherServices(启动其他服务)方法中被调用。(注:AMS是在startBootstrapServices()方法中启动的)。

systemReady方法中最终是通过Intent进行启动的,其中action为:Intent.ACTION_MAIN、Category为Intent.CATEGORY_HOME。启动方法与普通的activity方式类似。

2、Launcher中应用图标显示过程:

首先加载所有应用信息是在内部创建了一个HandlerThread,然后通过handler循环调用来加载所以应用的。然后把allApps信息传递给一个AllAppsRecyclerView控件的adapter来进行展示的。

Launcher是用工作区的形式来显示系统安装的应用程序的快捷图标的,每一个工作区都是用来描述一个抽象桌面的,它由n个屏幕组成,每个屏幕又分为n个单元格,每个单元格用来显示一个应用程序的快捷图标。

 

借图一张说明:

说明:文章只是做了一个总结而已,如果需要详细了解的话,可以看下如下文章:

Android系统启动流程(一)解析init进程启动过程

Android系统启动流程(二)解析Zygote进程启动过程

Android系统启动流程(三)解析SyetemServer进程启动过程

Android系统启动流程(四)Launcher启动过程与系统启动流程

 

更多相关文章

  1. Android(安卓)核心分析 之八------Android(安卓)启动过程详解
  2. Android(安卓)IPC机制(二):AIDL的基本使用方法
  3. Android读写XML(下)——创建XML文档
  4. Google I/O 发布android studio for linux 无法启动 解决
  5. Android创建sdcard
  6. Android读写XML(下)——创建XML文档
  7. Android(安卓)studio 中创建AIDL Service
  8. Android(安卓)— 创建文件及文件夹
  9. Android两种数据库操作方式入门介绍

随机推荐

  1. maven 学习笔记(五)-创建简单的eclipse+and
  2. Android 定位
  3. [Boot]Android系统启动-综述
  4. 新势力--Android,开发环境轻松搭建
  5. Android开发无法打开模拟器的问题:use '@f
  6. Android怎么获取ListView的值
  7. Eclipse And Android(安卓)使用心得
  8. Android之加载圈
  9. Android新建工程步骤(AndroidStudio)
  10. Android碎片化问题 java.lang.NoClassDef