Android启动流程

目录

1. Android系统启动流程概述

转存失败重新上传取消​

2. init进程启动

3. Zygote进程启动过程

4. SystemServer进程启动过程

5. Launcher进程


1. Android系统启动流程概述

    当电源键被按下时,芯片将会从固化在ROM中的代码开始运行,直到启动整个系统。具体流程如下:按下电源-->引导程序Bootloader-->加载Linux内核(寻找init进程代码)-->执行init进程→启动Zygote进程→启动SystemServer进程→启动launcher进程,流程图下图所示,下面从init进程开始分析Android系统启动流程。

 

2. init进程启动

    init进程是Android系统中运行第一个进程,此进程启动时主要完成下列工作:

(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文件, init.rc文件由Android初始化语言(Android Init Language)编写的脚本,主要包含5中类型语句:Action、Command、Service、Option和Import。import用于导入其他*.rc文件。init.rc里面主要是用到了Action和Service语句,其中 on 开头的比如“on init”、“on boot”就是Action语句,“service”开头的就是Service语句(大部分都是这个)。init进程会解析对应的init.rc文件,然后执行响应的程序。init.rc脚本中每一个执行语句会定义对应的进程名称、可执行文件路径、参数、入口函数、用户分类等等信息,init进程解析完后并启动init.rc中定义的所有进程,第一个启动Zygote进程,下面分析它的作用。

3. 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列表中删除。

4. SystemServer进程启动过程

    SystemServer进程主要用于创建系统服务,我们熟知的AMS、WMS和PMS都是由它来创建的。SystemServer进程启动后主要做的工作如下:

(1)启动Binder线程池,这样就可以与其他进程进行通信,通过调用native层的代码nativeZygoteInit方法,来启动一个Binder线程池。

(2)创建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了。

5. Launcher进程

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

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

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

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

   总体归纳如下:在Linux内核启动init进程后,init进程作为Android系统的第一个进程,它初始化了Android运行环境,创建目录并挂载文件系统,初始化环境变量、系统属性,最后解析脚本并启动Zygote孵化器进程,在Android系统中,虚拟机、应用进程、系统关键服务SystemServer都是由Zygote进程启动,在启动SystemServer服务进程后,剩下的事就由SystemServer服务进程来完成。首先,SystemServer服务进程创建Binder线程池,之后开启SystemServerManager服务管理进程,对系统服务进行创建、启动和生命周期管理。最后有Launcher进程来管理桌面程序。至此,Android系统启动过程就此结束。这些我对Android系统启动流程的初步了解,以后会在工作过程中不断对其进行深入学习。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值