`

Android系统启动过程

 
阅读更多

Android系统启动过程

一、开机加电

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系统启动过程及举例.docx

    "Android系统启动过程详解" Android 系统启动过程是指从 Linux 内核启动到 Android 系统完全启动的整个过程。下面我们将从 Android 4.0 源码中,了解和总结 Android 系统启动过程。 Init 进程的启动 Init 进程是 ...

    android系统启动过程(1).pdf

    Android 系统启动过程详解 Android 系统的启动过程可以分为 Linux 系统层、Android 系统服务层、Zygote 进程模型三个阶段,从开机到启动 Home Launcher 完成具体的任务细节可分为七个步骤。 1. 启动 BootLoader: ...

    Android Launch Process(安卓系统启动过程)

    ### Android系统启动过程详解 #### 一、概述 Android系统的启动流程从硬件加电到用户看到可用的应用程序桌面,经过了一系列复杂的过程。本篇文章将详细解释这一过程中的关键步骤及其背后的原理。 #### 二、从硬件...

    Android 启动过程详解

    Launcher的启动标志着Android系统启动过程的结束,用户此时可以开始与设备进行交互。 在整个Android启动过程中,我们可以看到,每个步骤都是精心设计的,以确保系统能够快速、稳定地启动,并为用户提供一个流畅的...

    android系统启动原理

    Android系统启动原理是一个复杂而有序的过程,涉及到操作系统内核、硬件初始化、系统服务启动、用户界面呈现等多个层面。本文将全面、系统地解析这一过程,旨在帮助读者深入理解Android系统的运行机制。 首先,...

    浅谈android性能优化之启动过程(冷启动和热启动)

    Android 应用程序启动优化之冷启动和热启动详解 一、应用程序启动方式 ...了解 Android 应用程序的启动过程对于优化应用程序的性能非常重要,可以根据应用程序的启动方式和启动过程来进行相应的优化处理。

    linux 内核启动过程以及挂载android 根文件系统的过程

    同时,Android源代码的组织结构清晰地展示了系统各个组成部分之间的关系,这对于理解整个Android系统的构建和运行机制非常重要。了解这些内容不仅有助于开发者更好地调试和优化系统,也为进一步研究Android平台提供...

    android系统启动全程解析

    Android系统启动全程解析 Android系统启动是一个复杂而有序的过程,涉及多个层次的协同工作,从硬件初始化到用户界面呈现。本文将深入探讨Android系统启动的三个主要阶段:Linux系统层、Android系统服务层以及...

    android系统之从上电到kernel启动完成

    Android系统的启动过程是一个复杂的过程,涉及到多个阶段和组件。本文将详细介绍Android系统的第一阶段,即Linux系统启动阶段的详细流程。 系统启动概述 Android系统的启动过程可以分为四个阶段: Bootloader阶段...

    Android_启动过程分析

    Android系统的启动过程是一个复杂而有序的系列步骤,涵盖了硬件初始化、操作系统加载以及应用程序框架的建立。下面是详细的Android启动过程分析: 1. **Bootloader阶段**: Bootloader是设备启动时运行的第一段...

    Android 根文件系统启动过程

    总结起来,Android根文件系统启动过程涉及了内核初始化、文件系统创建、服务和操作配置、硬件检测、属性系统设置等多个环节,是一个复杂而有序的过程,对于理解和调试Android系统具有重要意义。

    linux内核启动过程以及挂载android根文件系统的过程.pdf

    综上所述,Linux内核启动和Android根文件系统的挂载是Android系统启动过程中的关键步骤,涉及到内核初始化、文件系统挂载、设备驱动、应用程序加载等多个层面。理解这些过程对于Android系统的调试、定制和优化至关...

    展锐Android11.0开机启动流程介绍V1.0-nowatermark

    本文档对 Android 11.0 平台开机启动流程进行了详细的介绍,涵盖了 Android 架构图、系统启动流程、init 启动流程、Zygote 启动流程、System Server 启动流程等关键部分。 Android 架构图 Android 系统架构图主要...

    Android-start-boot-analyze-.rar_android_android bootloader_andro

    Android系统启动过程分析 本文主要介绍Android系统的启动过程,以Androidinit进程之后部分为主,init之前部分同标准Linux内核启动完全相同。于Android启动过程复杂,涉及C、C++及java部分内容,本文以流程分析为主线...

    Android 启动过程相关资料

    Android启动过程是一个复杂而有序的系统初始化阶段,涵盖了操作系统内核加载、系统服务启动、用户界面呈现等多个步骤。在这个过程中,Makefile起着至关重要的作用,它是构建Android系统的基石之一。 首先,Android...

    android系统启动

    android系统启动的详细流程,从上电到进入桌面的详细过程

    android开机启动流程

    `init` 进程是Android系统启动的第一个用户级进程,它由Linux内核启动。当内核加载完毕并初始化所有必要的驱动程序和数据结构后,就会启动`init`进程。`init` 进程的核心作用在于执行一系列初始化任务,确保系统能够...

Global site tag (gtag.js) - Google Analytics