Android系统启动过程概述

来源:互联网 发布:最新网络捕鱼赌博平台 编辑:程序博客网 时间:2024/04/28 07:39





一、开机加电

bootloader(汇编语言)进行底层初始化,并加载内核代码,最终跳转到内核的boot程序。

二、Linux内核引导

  1)kernel核心初始化(内存初始化,打开中断,初始化进程表等等);

  2)驱动初始化;

  3)启动内核后台(daemons)线程

  4)安装根(root)文件系统

  5) 启动第一个用户级进程init

三、init进程启动

init进程的程序在system/core/init/init.c里,它是android系统特定的初始化程序,最终它会以后台进程(daemon)的形式一直存在。该进程主要有如下功能:

  1)创建/安装设备文件/进程文件/系统文件节点;

  2)解析启动/init.rc和/init.<machine_name>.rc;

  3)显示Logo画面;

  4)打开Device Socket,Property Socket, child进程通信Socket;

  5)执行脚本中指定的命令或动作,启动指定服务;

  6)进入死循环:检查是否有action需要执行;是否需要restart某服务;监听特定事件(child进程退出,Device相关事件,Property事件,新服务启动)。

四、Native服务启动

根据system/core/rootdir/init.rc, init进程通过open_keychord()从service_list(之前从.rc中解析出来的)中把所有service信息写入特定文件,handle_keychord()逐个读出然后调用service_start()创建(先fork()然后在子进程中调用execve()来执行相应的服务程序)指定的service进程。这里创建的service都属于native服务,运行在Linux空间,通过socket向上层提供特定的服务。例如:

console: shell console服务.

servicemanager: Binder服务管理器,管理所有Android系统服务

vold: volume Daemon,支持存储外设的热插拔

adbd: Android Debug Bridge Daemon,提供adb相关功能

mountd: 设备安装Daemon,负责设备安装及状态通知

debuggerd: Debug Daemon,处理调试进程的请求

rild: 无线接口层(radio interface layer)Daemon.

zygote: 启动Android Dalvik Runtime并负责进程孵化服务.

mediaserver: 启动AudioFlinger, MediaPlayerService and CameraService.负责多媒体播放相关的功能,包括音视频解码、显示输出等。

installd: 包安装Daemon,提供包安装/删除/dex处理等底层功能

五、Android Runtime启动

init进程启动的servicemanager和zygote进程,是android系统的基础。其中zygote进程非常重要,它作为其它所有android进程的"种子",负责建立Android运行空间,同时能够按照命令进行进程孵化(自我复制)。

init进程根据init.rc配置启动了zygote服务进程,其中zygote描述如下:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server,

意思是作为种子进程(-Xzygote参数),启动system/bin/app_process下的zygote,同时启动SystemServer(--start-system-server参数)。而zygote服务对应的程序是frameworks/base/cmds/app_process/app_main.cpp,它主要工作是创建并启动Android Runtime(Dalvik属于Runtime的一部分),然后启动System Server进程进行系统初始化。zygote服务的具体启动流程是:

1、main()@frameworks/base/cmds/app_process/app_main.cpp

   ---创建Android Runtime

   ---调用runtime.start("com.android.internal.os.ZygoteInit", startSystemServer)

2、runtime.start()@frameworks/base/core/jni/AndroidRuntime.cpp

   ---创建虚拟机:startVM() -> JNI_CreateJavaVM()@dalvik/vm/Jni.c

   ---注册底层功能的JNI函数到JNIEnv: startReg()

   ---调用env->CallStaticVoidMethod()运行Java类ZygoteInit的main()

3、main()@frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

   ---调用registerZygoteSocket():根据环境变量中的配置建立一个local socket,以接收其它进程的进程创建请求

   ---调用preloadClasses()预加载指定的java类

   ---调用preloadResources()预加载指定的Resources

   ---调用startSystemServer()创建(fork)SystemServer进程,然后父进程zygote进入循环runSelectLoopMode(),子进程SystemServer调用hanldeSystemServerProcess()

   ---调用runSelectLoopMode()进入死循环:监听socket,根据请求创建新进程

至此,zygote进程的初始化工作全部完成,Android Runtime已经启动。

六、Android系统初始化

System Server作为Zygote的第1个子进程,是Android Framework的核心,它主要负责Android系统初始化并启动其他服务。其它的Android服务都由SystemServer启动并运行在该进程空间。该进程具体的启动流程是:

   ---调用hanldeSystemServerProcess()

   1)调用closeServerSocket()关闭从Zygote进程继承过来的Socket

   2)调用RuntimeInit.zygoteInit()启动main()@

   frameworks/base/services/java/com/android/server/systemserver.java

   ---SystemServer:main()中调用System.LoadLibrary("android_services")装载函数库,引起JNI_OnLoad()@frameworks/base/services/jni/Onload.cpp被调用,该函数负责注册Android服务层的jni函数到JVM,比如keyInput, Lights, Alarm, Battery, Sensor,Vibrator,System init1

   ---调用init1(),它是一个native函数,实现在com_android_server_SystemServer.cpp,最终会调用到c函数system_int()

   ---system_int()@framworks/base/cmds/system_server/library/system_int.cpp

   1)实例化surfaceFlinger,AudioFliger,MediaPlayerService,CameraService,

AudioPolicyService

   2)通过JNI调用java类函数:runtime->callStati("com/android/server/System

Server", "init2")

   3)Init2()创建一个线程ServerThread()并立即启动

   ---ServerThread.run()运行

   1)建立Android中所有要用到的服务,并AddService到service Manager

   2)通过Looper.prepare和Looper.loop来实现消息轮询

   3)使用xxx.systemReady()通知各个服务,系统已经准备就绪

七、Home启动

    在ActivityManagerService.systemReady()中建立了HomeActivityManagerService.systemReady()@frameworks/base/services/java/com

/android/server/am/ActivityManagerService.java, 主要函数如下:resumeTopActivityLocked(),startHomeActivityLocked() startActivityLocked()

   APK详细启动过程将另作一章分析。Android系统的启动系列到此就结束了。

0 0
原创粉丝点击