一、开机加电
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系统的启动系列到此就结束了。
相关推荐
android系统启动过程(1).pdf
Linux内核启动之后,就到Android Init进程,进而启动Android相关的系统服务和应用。参照android源码,用android home Launcher例举
linux 内核启动过程以及挂载android 根文件系统的过程
全面系统的讲解了android系统的启动过程,图文并茂,讲的也很通俗易懂!
网上找的一篇关于Android 根文件系统启动过程的分析,这方面的东西不多。Android 根文件系统启动过程.doc
Android系统启动过程分析 本文主要介绍Android系统的启动过程,以Androidinit进程之后部分为主,init之前部分同标准Linux内核启动完全相同。于Android启动过程复杂,涉及C、C++及java部分内容,本文以流程分析为主线...
Android的系统启动流程,从开机到打开桌面的大概流程。
android系统启动的详细流程,从上电到进入桌面的详细过程
Android系统完整的启动过程,从系统层次角度可分为 Linux系统层、Android系统服务层、Zygote进程模型三个阶段; 从开机到启动Home Launcher完成具体的任务细节
第2章介绍Android系统启动过程,为下面的章节做好铺垫。 第3章介绍应用程序进程启动过程。 第4章介绍四大组件的工作过程,包括根Activity的启动过程,Service的启动和绑定过程,广播的注册、发送和接收过程,Content...
分析android的启动过程,从内核之上,我们首先应该从文件系统的init开始,因为 init 是内核进入文件系统后第一个运行的程序,通常我们可以在linux的命令行中指定内核第一个调用谁,
android启动过程配置文件的解析与语法 28 android系统开发(四)-触摸屏tslib移植(内核)和原理分析 32 android系统开发(五)-tslib移植 47 Ubuntu下svn安装和使用 50 android系统开发(七)-背光模块 56 android系统开发...
介绍android系统的第一阶段,即linux系统系统阶段详细流程
Android系统在新进程中启动自定义服务过程(startService)的原理分析
在内容上,《Android系统源代码情景分析(含CD光盘1张)》结合使用情景,全面、深入、细致地分析了Android系统的源代码,涉及到Linux内核层、硬件抽象层(HAL)、运行时库层(Runtime)、应用程序框架层...
ndroid 从 Linux 系统启动有 4 个步骤; (1) init 进程启动 (2) Native 服务启动 (3) System Server,Android 服务启动 (4) Home 启动
Android系统进程Zygote启动过程的源代码分析.pdf
《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 ...
linux内核启动过程以及挂载android根文件系统的过程.pdf