`
kurting615
  • 浏览: 95077 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android系统启动过程

 
阅读更多

Android 的启动过程可以分为两个阶段,第一阶段是 Linux 的启动,第二阶段才是 Android 的启动,下面我们分别来了解一下具体的过程。

首先是 Linux 启动,这一部分我想就可以略过了,无非是 Linux Bootloader Kernel Driver 之类的,在这里唯一要提到的就是 ServiceManager ,即服务管理器,这个是做为一个进程在 Android 加载之前就被启动了,我们可以从 init.rc 中看到这个配置项:

service servicemanager /system/bin/servicemanager

ServiceManager Binder 的服务管理守护进程,是 Binder 的核心,由其使用 Binder 驱动进行 IPC 管理,关于 IPC 通讯的机制,此处不再详述。在 APP Framework 中,应用程序使用的 ServiceManager.java 就是通过 Proxy 与这个守护进程进行的通讯。

 

然后是 Android 的启动,接下来要详细描述的部分。我们还是先看一下 init.rc 中的配置

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

linux 启动以后,启动 zygote 服务进程,这个进程恰如其名:孵化器,是所有 Android 应用程序的孵化器。

 

我们来看一下 app_process 的代码,位置是在:

frameworks/base/cmds/app_process/app_main.cpp

main() 函数中有如下代码:

        if (0 == strcmp("--zygote", arg)) {

            bool startSystemServer = (i < argc) ?

                     strcmp(argv[i], "--start-system-server") == 0 : false;

            setArgv0(argv0, "zygote");

            set_process_name("zygote");

            runtime.start("com.android.internal.os.ZygoteInit",

                startSystemServer);

        }

从中可以追踪到 AndroidRuntime ,代码位于:

frameworks/base/core/jni/AndroidRuntime.cpp

start() 函数中有如下代码:

    /* start the virtual machine */

    if (startVm(&mJavaVM, &env) != 0)

        goto bail;

         ……

                 env->CallStaticVoidMethod(startClass, startMeth, strArray);

即先启动了虚拟机,然后利用 JNI 调用了 zygoteInit 函数。

 

继续追踪到 frameworks/base/core/java/com/android/internal/os/ZygoteInit.java main() 函数,代码如下:

            if (argv[1].equals("true")) {

                 startSystemServer();

            } else if (!argv[1].equals("false")) {

                throw new RuntimeException(argv[0] + USAGE_STRING);

            }

 

            Log.i(TAG, "Accepting command socket connections");

 

            if (ZYGOTE_FORK_MODE) {

                runForkMode();

            } else {

                runSelectLoopMode();

            }

前一部分是在启动系统服务,后一部分是虽然是一个条件判断,但 ZYGOTE_FORK_MODE 被赋了 false ,所以进行 else 分支的 runSelectLoopMode() 函数,在该函数中,实际上是在一死循环中利用 zygoteConnection 类通过 socket 的方式进行消息处理,用于 fork 出新的 zygote ,从而以最轻量级的方式实现每个进程一个虚拟机的机制。

 

继续来看 startSystemServer() ,代码位于:

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

在其 main() 函数中调用了 init1(args) 这个 native 函数,利用 JNI 机制,跟踪至

frameworks/base/services/jni/com_android_server_systemService.cpp ,然后到

frameworks/base/cmds/system_server/library/system_init.cpp

system_init() 函数中有如下代码:

    if (strcmp(propBuf, "1") == 0) {

        // Start the SurfaceFlinger

        SurfaceFlinger::instantiate();

    }

    AndroidRuntime* runtime = AndroidRuntime::getRuntime();

 

    LOGI("System server: starting Android services./n");

    runtime->callStatic("com/android/server/SystemServer", "init2");

即完成了 SurfaceFlinger 的实例化,然后利用运行时的 callStatic() 函数调用了 SystemServer init2() 函数,这个函数位于:

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

代码是:

    public static final void init2() {

        Slog.i(TAG, "Entered the Android system server!");

        Thread thr = new ServerThread();

        thr.setName("android.server.ServerThread");

        thr.start();

}

在这个 ServerThread 线程中,可以看到我们熟悉的 Android 服务了,比如 WallpaperService 服务的启动:

            try {

                Slog.i(TAG, "Wallpaper Service");

                 wallpaper = new WallpaperManagerService(context);

                ServiceManager.addService(Context.WALLPAPER_SERVICE, wallpaper);

            } catch (Throwable e) {

                Slog.e(TAG, "Failure starting Wallpaper Service", e);

            }

最后,调用各服务的 systemReady() 函数通知系统就绪。

 

至此,系统的启动过程结束,借用两张图来说明问题:

 

从这里可以看出, linux init 在启动若干守护进程之后,就启动了 Android runtime zygote zygote 再启动虚拟机,系统服务,系统服务再启动完本地服务后,又启动了若干 Android 服务,并完成向 ServiceManager 的注册工作,最后系统启动完成。系统的进程空间如下图所示:

 

 

可见,由 zygote 孵化器为各进程以写时复制的方式用最小的代价实现了虚拟机。

 

思维导图

 

总体启动框架图:


 

原文地址:http://blog.csdn.net/caowenbin

 

  • 大小: 34 KB
  • 大小: 55.1 KB
分享到:
评论

相关推荐

    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系统的调试、定制和优化至关...

    Android init 启动过程分析

    2. **解析`/init.rc`和`/init.%hardware%.rc`文件**:`init`进程会解析这两个配置文件,这些文件定义了在系统启动过程中需要执行的各种动作和服务。 3. **执行早期初始化动作**:根据`/init.rc`中的定义,执行一...

    delphi ex10 android 实现开机自启动

    这个过程涉及到Android系统的权限管理和启动服务的配置。 1. **Delphi XE10**: Delphi是面向对象的Pascal编程语言的一个版本,由Embarcadero Technologies开发,用于Windows、macOS、iOS和Android平台。XE10是其中...

    展锐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系统启动的详细流程,从上电到进入桌面的详细过程

Global site tag (gtag.js) - Google Analytics