本文转载自:Android 操作系统架构梳理
本文基于Android 10.0源码分析
1.概述
1.1 Android系统启动流程概览
![](https://img.haomeiwen.com/i18565088/a7e179f8265bbaac.png)
1.2 启动流程分层
2.分层介绍
2.1 Loader层
(1)Boot ROM:当手机处于关机状态,长按Power键开机,引导芯片开始从固化在ROM里的预设代码开始执行,然后加载引导程序到RAM;
(2)Boot Loader:这是启动Android系统之前的引导程序,主要检查RAM,初始化硬件参数等功能。
2.2 kernel层
Kernel是指Android内核层,到这里才刚刚开始进入Android系统。
(1)启动kernel的swapper进程(pid=0):该进程又称为idle进程,系统初始化过程kernel由无到有开创的第一个进程,用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作。
(2)启动kthreadd进程(pid=2):是Linux系统的内核进程,会创建内核工作线程lworkder,软中断线程ksoftirqd,thermal等内核守护进程。kthreadd进程是所有内核进程的鼻祖。
2.3 Native层
Native层主要包括init孵化来的用户空间的守护进程、HAL层以及开机动画等。启动init进程(pid=1),是Linux系统的用户进程,init进程是所有用户进程的鼻祖。
(1)init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户守护进程;
(2)init进程还启动servicemanager(binder服务关机)、bootanim(开机动画)等重要服务;
(3)init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java进程(虚拟机进程),Zygote是所有Java进程的父进程。
2.4 Framework层
(1)Zygote进程是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含:
-
加载ZygoteInit类,注册Zygote Socket服务端套接字;
-
加载虚拟机;
-
preloadClasses;
-
preloadResources。
(2)System Server进程是由Zygote进程fork而来,System Server是Zygote孵化的第一个进程,System Server负责启动和管理整个Java framework,包含ActivityManager,PowerManager等服务;
(3)Media Server进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service,等服务。
2.5 App层
(1)Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;
(2)Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。
(3)所有的App进程都是由Zygote进程fork生成的。
2.6 Syscall & JNI层
(1)Native与Kernel之间有一层系统调用(Syscall)层;
(2)Java层与Native(C/C++)层之间的纽带JNI。
3.主要过程概述
3.1 init进程启动
init进程是Android系统中用户控件的第一个进程,进程号为pid=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位)文件中了。
3.2 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列表中删除。
3.3 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了。
3.4 Launcher启动过程
系统启动的最后一步是启动一个应用程序来显示系统中已经安装的应用程序,这个应用程序就叫做Launcher。Lanucher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上。通俗来讲Launcher就是Android系统的桌面,它的主要作用有:
-
作为Android系统的启动器,用于启动应用程序;
-
作为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个单元格,每个单元格用来显示一个应用程序的快捷图标。
网友评论