在此说明,此文章只是个人的一个关于“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启动过程与系统启动流程

Android系统启动流程相关推荐

  1. Android系统启动流程分析之安装应用

    2016六月 21 原 Android系统启动流程分析之安装应用 分类:Android系统源码研究 (295)  (0)  举报  收藏 跟随上一篇博客Android系统的启动流程简要分析继续分析an ...

  2. 详解 Android 系统启动流程

    系统启动流程大致分以下五步: Loader(加载引导程序Boot Loader) Kernel(Linux内核层) Native(init进程) Framework(Zygote进程/SystemSe ...

  3. Android系统启动流程—— init进程zygote进程SystemServer进程启动流程

    原文地址:https://blog.csdn.net/qq_30993595/article/details/82714409 Android系统启动流程 Android系统启动过程往细了说可以分为5 ...

  4. 从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程

    Android系统启动流程 启动流程 Loader Kernel Native Framework Application init进程 启动 rc文件规则 Actions Commands Serv ...

  5. Android系统启动流程 -- bootloader

    Android系统启动流程 -- bootloader   BootLoader:在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系 ...

  6. Android 7.1.2(Android N) Android系统启动流程

    Android 7.1.2(Android N) Android系统启动流程 源码: system/core/rootdir/ init.rc init.zygote64.rc system/core ...

  7. Android系统启动流程(四)Launcher进程启动过程解析(附带面试题)

    前面我们分析了init进程,zygote进程,SystemServer进程,本篇的Launcher是系统启动流程的最后一个进程. 1 Launcher概述 Launcher进程是一个系统的应用程序,位 ...

  8. Android系统启动流程(nougat7.1.1_r6)

    一.Android启动简介 Android 是一种基于 Linux 的开放源代码软件栈,为广泛的设备和机型而创建.下图所示为 Android 平台的主要组件. Linux 内核 Android 平台的 ...

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

    相关文章 Android系统架构与系统源码目录 Android系统启动流程(一)解析init进程启动过程 Android系统启动流程(二)解析Zygote进程启动过程 Android系统启动流程(三) ...

  10. 【Android 系统开发】 Android 系统启动流程简介

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3889548 ...

最新文章

  1. ES5-Array-push(),pop(),shift(),unshift()
  2. ASP.NET Core MVC/WebAPi如何构建路由?
  3. C#关于读写INI文件
  4. 输入序列连续的序列检测
  5. cmd查看所有数据库 db2_db2 cmd命令操作
  6. python控制浏览器最小化_如何在selenium webdriver 3中最小化浏览器窗口
  7. python卡方拟合优度检验_如何理解拟合优度检验 ?
  8. --set-gitd-purged参数解析
  9. uniapp h5浏览器文件下载
  10. 写给一个外汇女交易员的信(连载二)
  11. 第二十九章、containers容器类部件QFrame框架部件详解
  12. ssh配置公钥解决免密登录
  13. 人生苦短_人生苦短,懂事太晚!
  14. 移动端项目总结 - <基础>
  15. 使用ArcGIS实现数据的随机选取
  16. 基本数据结构(算法导论)与python
  17. “互联网+”大学生创新创业大赛总决赛清华大学夺冠
  18. mt4服务器时间显示,mt4服务器时间设置
  19. Linux 下值得使用的 5 个屏幕录像软件 [zt]
  20. 直播预告|【芯咖秀▪第六期】MCU热的前因后果以及未来到底如何发展!

热门文章

  1. Python之灵魂三问,分享学习路上的神器集合!
  2. 【JAVA】while的用法。
  3. 数字化背景下的经济社会发展的新特征 新趋势
  4. 阿里P6+面试:介绍下观察者模式?
  5. Android 中使用AlarmManager设置闹钟详解
  6. 计算机网络介绍,TCP协议,Socket网络编程
  7. java word书签_JAVA 创建移除Word书签
  8. java判断一个数是不是素数_Java判断一个数是不是素数
  9. linux怎么看内存时序,内存速度和时序重要么
  10. MYSQL Error:You must SET PASSWORD before execut...