Android系统启动过程

  所有的软件都是存放在硬盘上的,程序执行时需要将程序从硬盘上读取到内存中然后加载到CPU中来运行。当我们按下开机键时,此时内存中什么都没有,因此需要借助某种方式,将操作系统加载到内存中,而完成这项任务的就是BIOS。

Android手机的启动过程

  Android没有PC的BIOS程序,取而代之的是Bootloader--系统启动加载器。它类似于BIOS,在系统加载前,用以初始化硬盘设备,建立内存空间的映像图,为最终调用系统内核准备好环境。在Android里没有硬盘,而是ROM,它类似于硬盘存放操作系统,用户程序等。ROM跟硬盘一样也会划分为不同的区域,用于放置不同的程序,在Android中主要划分为以下几个分区:
1 . /boot:存放引导程序,包括内核和内存操作程序;
2 . /system:相当于电脑c盘,存放Android系统及系统应用;
3 . /recovery:恢复分区,可以进入该分区进行系统恢复;
4 . /data:用户数据区,包含了用户的数据:联系人、短信、设置、用户安装的程序;
5 . /cache:安卓系统缓存区,保存系统最常访问的数据和应用程序;
6 . /misc:包好一些杂项内容,如系统设置和系统功能启用禁用设置;
7 . /sdcard:用户自己的存储区,可以存放照片、音乐、视频等文件;

  跟PC启动过程类似,当开机通电时首先会加载Bootloader,Bootloader会读取ROM,找到操作系统并将Linux内核加载到RAM中。当Linux内核启动后会初始化各种软硬件环境,加载驱动程序,挂载根文件系统,Linux内核加载的最后阶段会启动执行第一个用户空间进程init进程。

init进程

  init是Linux系统中用户空间的第一个进程(pid = 1),Kernel启动后会调用/system/core/init/Init.cpp的main()方法。

  • Init.main()
      首先初始化Kernel log,创建一块共享的内存空间,加载/default.prop文件,解析init.rc文件。

init.rc文件

  init.rc文件是Android系统的重要配置文件,位于/system/core/rootdir/目录中。主要功能是定义了系统启动时需要执行的一系列action及执行特定动作、设置环境变量和属性和执行特定的service。
  init.rc脚本文件配置了一些重要的服务,init进程通过创建子进程启动这些服务,这里创建的service都属于native服务,运行在Linux空间,通过socket向上层提供特定的服务,并以守护进程的方式运行在后台。
  通过init.rc脚本系统启动了以下几个重要的服务:

  • servicemanager:启动bingder IPC,管理所有的Android系统服务;
  • mountd:设备安装Daemon,负责设备安装及状态通知;
  • debuggerd:启动debug system,处理调试进程的请求;
  • rild:启动radio interface layer daemon服务,处理电话相关的事件和请求;
  • media_server:启动AudioFlinger,MediaPlayerService和CameraService,负责多媒体播放和相关的功能,包括音视频解码;
  • surface_flinger:启动SurfaceFlinger负责显示输出;
  • zygote:进程孵化器,启动Android Java VMRuntime和systemserver,负责Android应用进程的孵化工作;

  在这个阶段可以在设备的屏幕上看到"Android"logo了。以上工作执行完,init进程就会进入loop状态。

service_manager进程

  ServiceManager是Binder IPC通信过程中的守护进程,本身也是一个Binder服务。ServiceManager进程主要是启动Binder,提供服务的查询和注册。

surface_flinger进程

  SurfaceFlinger负责图像绘制,是应用UI的核心,其功能是合成所有Surface并渲染到显示设备。SurfaceFlinger进程主要是启动FrameBuffer,初始化显示系统。

media_server进程

  MediaServer进程主要是启动AudioFlinger音频服务,CameraService相机服务。负责处理音频解析播放,相机相关的处理。

Zygote进程

  Zygote进程孵化了所有的Android应用进程,是Android Framework的基础,该进程的启动也标志着Framework框架初始化启动的开始。
  Zygote服务进程的主要功能:

  • 注册底层功能的JNI函数到虚拟机;
  • 预加载Java类和资源;
  • fork并启动system_server核心进程;
  • 作为守护进程监听处理“孵化新进程”的请求;
      当Zygote进程启动后,便会执行到frameworks/base/cmds/app_process/App_main.cpp文件的main()方法。然后Zygote进程会进入loop状态,等待下次fork进程。

system_server进程

  system_server进程由Zygote进程fork而来。
  system_server进程启动后将初始化上下文,创建系统服务管理SystemServiceManager,然后启动各种系统服务。

//启动引导服务;
startBootstrapServices();
//启动核心服务;
startCoreServices();
//启动其他服务;
startOtherServices();

  所有的服务启动完成后会注册到ServiceManager。ActivityManagerService服务启动完成后,会在startOtherServices()方法中进入到ActivityManagerService.systemReady(),然后启动SystemUI,WebViewFactory,Watchdog,最后启动桌面Launcher App。

ActivityManagerService启动

  启动桌面Launcher App需要等待ActivityManagerService启动完成。

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-----------------------last line for now----------------------