Android系统启动过程简记

一. 前言

最近查看了一些Android系统启动过程的文档,这里做一些简记,并没有配安卓源码。

二. Android系统启动过程

1. 大致流程

按下电源——Bootloader——Linux Kernel——init——Zygote——SystemServer——WindowManagerService、PackageManagerService、CameraService…、ActivityManagerService、Luncher。

2. 从开机到Zygote进程启动具体细节

  1. 当电源按下时引导芯片代码从预订的地方(固话为ROM中)开始执行,加载引导程序Bootloader到RAM中执行;Bootloader是系统启动前的一个小程序;
  2. Bootloader会寻找内核所在的代码,然后启动内核;
  3. 内核完成系统设置后,就会启动init进程,并且查找init.rc文件的位置(init进程会对该文件进行解析);
    init进程做了三件事:1) 创建和挂载启动所需的文件目录,启动挂载了tmpfs、devpts、proc、sysfs和selinuxfs共5种文件系统,这些是系统运行时目录,在系统运行的时候才会存在; 2) 初始化和启动属性服务;3) 解析init.rc文件,创建Zygote进程。文件路径为:system/core/rootdir/init.rc。它是一个非常重要的配置文件,是由Android初始化语言编写的脚本。
  4. init.rc中class_start是Android初始化语言中的Command类型的语句,对应的函数为do_class_start,含义就是启动classname为main的Service。zygote的classname为main。
    do_class_start函数内ForEachServiceInClass函数会遍历Service链表,找到classname为main的Zygote,并执行StartIfNotDisabled ()函数。返回值代表Service是在rc文件中设置disabled选项,如果没有,就会执行Start()函数,Zygote对应的文件没有设置disabled选项。
  5. 在start函数里面会调用execve函数,然后子进程就会被启动,然后执行对应的main函数,这里启动的是Zygote对应的程序,system/bin/app_process或system/bin/app_process64,运行到里面的runtime.start函数就启动了Zygote进程。

3. 接下来看看孵化器进程中做了些什么

  1. DVM和ART、应用程序进程以及运行系统的关键服务SystemServer进程都是有Zygote进程创建的,我们也称它为孵化器。Zygote进程都是通过fork自身来创建子进程的,这样Zygote进程以及子进程都会进入app_main.cpp的main函数,运行Zygote进程就会执行AndroidRuntime.start函数。
  2. AndroidRuntime.start函数中会启动Java虚拟机,然后就可用反射调用调用ZygoteInit的main函数了,自此便从Native层进入Java框架层了。
  3. ZygoteInit的main函数中做的事情也是有很多的,首先会创建一个Server端的socket,socketName = “zygote”,这个socket会等待AMS的请求,用于启动Activity;然后是预加载类和资源,之后是启动系统服务进程SystemServer进程,最后一直处于等待AMS请求的状态。
  4. ZygoteInit的main函数中启动系统服务进程由startSystemServer(abiList, socketName, zygoteServer)来实现,SystemServer进程的用户id和用户组id被设置为1000,并且拥有1001~1010、1018、1021、1032、3001~3010的权限;进程名字为system_server;启动的类名为:com.android.server.SystemServer。fork一个子进程分配系统进程使用,然后在子进程中调用handleSystemServerProcess(parsedArgs),其中有先创建ClassLoader 对象,然后调用ZygoteInit.zygoteInit,ClassLoader 对象便为参数之一。zygoteInit中调用ZygoteInit.nativeZygoteInit() 用于启动Binder线程池,至此,系统进程就能和其它进程进行通信了,最后执行SystemServer的main方法的main方法,这个进入过程是通过跳异常的方式进入的,异常处理会清楚所有设置过程中需要的堆栈帧,让SystemServer的main方法看起来像是SystemServer进程的入口。
  5. 进到main函数以后,就会创建系统的上下文Context,通过createSystemContext(),并且创建mSystemServiceManager = new SystemServiceManager(mSystemContext),以此管理一些服务,后面又分别是启动引导服务startBootstrapServices(),启动核心服务startCoreServices(),启动其它服务startOtherServices()。
    相关的服务一种是通过SystemServiceManager的startService方法来启动的;另一种是直接调用服务的main方法,由SystemServiceManager创建并启动的服务,都是继承了SystemService,但是并没有实现IBinder,所以是不可以进行Binder通信的,也就是由它管理的服务是用于进程内部通信的。创建对象后添加到ServiceManager中,它是用来管理系统中各种Service的,由它管理的服务都实现了IBinder,所以在ServiceManager中注册的服务是用于进程间通信的
    总之,SystemServer进程主要做了:启动Binder线程池,创建SystemServiceManager,用于对系统其他服务进行创建、启动和声明周期管理,最后是启动各种系统服务。SystemServer进程是Zygote进程fork的第一个进程。其中WindowManagerService、ActivityManagerService、PackageManagerService等重要的可以binder通信的服务都运行在这个SystemServer进程。

4. Launcher的启动过程

  1. 系统启动的最后一步便是启动一个应用程序来显示系统中已经安装好的应用程序,这个应用程序就叫Launcher,它在启动过程中会请求PackagerManagerService返回系统中已经安装好的应用程序信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,然后用户可以功能通过点击快捷图标来启动相应的应用程序了。
  2. ActivityManagerService(AMS)是负责四大组件的启动、切换和调度的。系统桌面本身就是一个Activity,所以Launcher的启动是在AMS中进行的,启动Launcher的入口是AMS的systemReady方法,该方法在SystemServer的startotherServices方法中被调用的。systemReady中经过重重调用会调用AMS的startHomeActivityLocked方法,startHomeActivityLocked方法又会调用getHomeIntent(),最终启动Launcher。

三. 小结

本文整体上省去了源码的部分,都是文字描述,如果要看代码,就可以查看系统源码或者链接上的内容。

你可能感兴趣的:(Android系统启动过程简记)