分享

[转载]Android系统启动过程

 techres 2011-12-21

[转载]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系统的启动系列到此就结束了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多