42

【乘风破浪】Android系统启动篇 - 宋者为王

 5 years ago
source link: https://www.cnblogs.com/andy-songwei/p/11429421.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【系统之音】Android系统启动篇

前言

       转载请声明,转自【https://www.cnblogs.com/andy-songwei/p/11429421.html】谢谢!

       对于一个Android应用层开发者来说,了解Android系统的启动流程对理解Android系统有很大的帮助。这其中包含了大量的细节,而且前面很多步骤包含了C/C++实现的native层逻辑,作为一个应用层的开发者来说,很难也没必要掌握得太深入。本文简单整理了Android系统的启动流程,对具体细节感兴趣的朋友可以自行深入研究。

Android系统启动流程

       Android系统的启动流程,从按power按键启动电源开始,到Launcher应用程序启动完成结束,这里大致可以分为如下7个步骤。

  1、开启电源执行BootLoader引导程序

       当按下电源后,会引导芯片代码从预定义的地方开始执行(该预定义的地方固化在ROM中),将引导程序BootLoader加载到RAM中执行。ROM和RAM是内存的中的两个部分,前者是Read-Only-Memmory的缩写,顾名思义,就是只读的内存,这其中会预先存储一些信息,比如这里系统启动时需要的信息。后者是Random-Acess-Memmory的缩写,写入的内存,在程序运行过程中可以动态写入数据,系统关闭后,数据会被清除。

  2、BootLoader拉起并执行操作系统

       BootLoader执行时,会拉起并运行操作系统。BootLoader是一个引导程序,是在Android操作系统开始运行前的一个小程序,它的作用就是拉起并运行操作系统。

  3、操作系统启动init进程

       Android操作系统基于Linux内核实现,所以此时Linux内核开始启动,进行系统设置。当完成系统设置后,会首先在系统文件中寻找init.rc脚本文件,并启动init进程。

  4、init进程启动

       init,通过名称可以判断它的作用是做一些初始化的工作。init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动中的一个关键进程,作为第一个进程,它被赋予了很多重要的职责,简单概括为:

      (1)创建和挂载启动系统所需要的文件目录。

      (2)初始化和启动属性服务。这里的属性服务,类似于Windows操作系统中的注册表管理器,用来记录用户、软件等的一些信息。

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

  5、Zygote进程启动

       Zygote的中文翻译为“受精卵”,是生命的开始,从字面意思,我们大致可以领会到它在Android系统中的地位。Dalvik/ART,应用程序进程以及运行系统的关键服务SystemServer都是由Zygote进程创建的,所以一般也称它为孵化器。Zygote需要做很多工作,归纳起来大致有如下几条:

      (1)创建Dalvik/ART

      (2)从Native层进入到Java框架层。也就是说Zygote开创了Java框架层,这一步是通过Native层通过JNI方式调用ZygoteInit类的main方法来实现。Zygote的路径为:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

      (3)ZygoteInit的main方法中会创建一个Service端的Socket,名称为“zygote”,用于等待AMS请求Zygote创建新的应用程序进程。

      (4)ZygoteInit的main方法中还会通过fork方式创建并启动SystemServer进程。

  6、SytemServer进程启动

       SytemServer是运行系统的关键服务,主要用于创建系统服务,比如AMS,WMS,PMS等。它的主要职责为:

      (1)启动Binder线程池。该过程主要通过ZygoteInit.nativeZygoteInit()来调用Native层的方法来实现启动Binder线程池的,这样SystemServer就可以使用Binder与其他进程进行通信。

      (2)创建SystemServerManager(SSM),并启动各种服务。这个过程是在SystemServer的main方法中调用实现的,可以参考如下的源码。SystemServerManager用于对系统的服务进行创建、启动和生命周期管理。这里启动的各种服务包括引导服务、核心服务、其他服务三类:引导服务包括AMS、PowerMS、PackageMS等;核心服务包括BatteryService等;其他服务包括WMS等,SystemUI也是在这里启动的。

 1 //=========SystemServer.java=========
 2 public static void main(String[] args) {
 3     new SystemServer().run();
 4 }
 5 private void run() {
 6     ......
 7     //创建消息Looper
 8     Looper.prepareMainLooper();
 9     // 加载动态库libandroid_servers.so,初始化native服务
10     System.loadLibrary("android_servers");
11     ......
12     //初始化系统context
13     createSystemContext();
14     //创建SystemServiceManager
15     mSystemServiceManager = new SystemServiceManager(mSystemContext);
16     ......
17     //启动引导服务,如AMS等
18     startBootstrapServices();
19     //启动核心服务
20     startCoreServices();
21     //启动其它服务,如WMS,SystemUI等
22     startOtherServices();
23     ....
24 }

每一种服务类型包含哪些具体的服务,可以通过上述源码中第18、20、22行进入到对应的方法中查看。

  7、启动Launcher

       系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序就是Launcher。这一步由SystemServer创建的AMS来启动,前面第5点“Zygote进程启动”中讲过,创建一个Socket,来等待AMS请求Zygote创建新的应用程序。Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些图标来启动对应的应用程序。总结来说,就是两点:

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

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

Android系统启动流程图

 根据上述流程,可以得到如下流程图:

472002-20190829132556157-774671379.png

结语

       本文整理的内容来源于刘望舒的《Android进阶解密》第二章,该流程基于Android8.0,有兴趣更深入了解的可以通过本书来进行学习。本文中如果有描述不当或不正确的地方,请不吝赐教,万分感激。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK