[转载]Android系统启动过程发表时间:11月21日 17:00发布者:紫枫 浏览数(206) 赞(0) 评(0) 免费订阅Linux高清视频
一、开机加电
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系统的启动系列到此就结束了。 |
|
来自: techres > 《AndroidFramework》