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系统启动过程详解" Android 系统启动过程是指从 Linux 内核启动到 Android 系统完全启动的整个过程。下面我们将从 Android 4.0 源码中,了解和总结 Android 系统启动过程。 Init 进程的启动 Init 进程是 ...
Android 系统启动过程详解 Android 系统的启动过程可以分为 Linux 系统层、Android 系统服务层、Zygote 进程模型三个阶段,从开机到启动 Home Launcher 完成具体的任务细节可分为七个步骤。 1. 启动 BootLoader: ...
### Android系统启动过程详解 #### 一、概述 Android系统的启动流程从硬件加电到用户看到可用的应用程序桌面,经过了一系列复杂的过程。本篇文章将详细解释这一过程中的关键步骤及其背后的原理。 #### 二、从硬件...
Launcher的启动标志着Android系统启动过程的结束,用户此时可以开始与设备进行交互。 在整个Android启动过程中,我们可以看到,每个步骤都是精心设计的,以确保系统能够快速、稳定地启动,并为用户提供一个流畅的...
Android 应用程序启动优化之冷启动和热启动详解 一、应用程序启动方式 ...了解 Android 应用程序的启动过程对于优化应用程序的性能非常重要,可以根据应用程序的启动方式和启动过程来进行相应的优化处理。
Android系统启动原理是一个复杂而有序的过程,涉及到操作系统内核、硬件初始化、系统服务启动、用户界面呈现等多个层面。本文将全面、系统地解析这一过程,旨在帮助读者深入理解Android系统的运行机制。 首先,...
同时,Android源代码的组织结构清晰地展示了系统各个组成部分之间的关系,这对于理解整个Android系统的构建和运行机制非常重要。了解这些内容不仅有助于开发者更好地调试和优化系统,也为进一步研究Android平台提供...
Android系统启动全程解析 Android系统启动是一个复杂而有序的过程,涉及多个层次的协同工作,从硬件初始化到用户界面呈现。本文将深入探讨Android系统启动的三个主要阶段:Linux系统层、Android系统服务层以及...
Android系统的启动过程是一个复杂的过程,涉及到多个阶段和组件。本文将详细介绍Android系统的第一阶段,即Linux系统启动阶段的详细流程。 系统启动概述 Android系统的启动过程可以分为四个阶段: Bootloader阶段...
Android系统的启动过程是一个复杂而有序的系列步骤,涵盖了硬件初始化、操作系统加载以及应用程序框架的建立。下面是详细的Android启动过程分析: 1. **Bootloader阶段**: Bootloader是设备启动时运行的第一段...
总结起来,Android根文件系统启动过程涉及了内核初始化、文件系统创建、服务和操作配置、硬件检测、属性系统设置等多个环节,是一个复杂而有序的过程,对于理解和调试Android系统具有重要意义。
综上所述,Linux内核启动和Android根文件系统的挂载是Android系统启动过程中的关键步骤,涉及到内核初始化、文件系统挂载、设备驱动、应用程序加载等多个层面。理解这些过程对于Android系统的调试、定制和优化至关...
2. **解析`/init.rc`和`/init.%hardware%.rc`文件**:`init`进程会解析这两个配置文件,这些文件定义了在系统启动过程中需要执行的各种动作和服务。 3. **执行早期初始化动作**:根据`/init.rc`中的定义,执行一...
本文档对 Android 11.0 平台开机启动流程进行了详细的介绍,涵盖了 Android 架构图、系统启动流程、init 启动流程、Zygote 启动流程、System Server 启动流程等关键部分。 Android 架构图 Android 系统架构图主要...
这个过程涉及到Android系统的权限管理和启动服务的配置。 1. **Delphi XE10**: Delphi是面向对象的Pascal编程语言的一个版本,由Embarcadero Technologies开发,用于Windows、macOS、iOS和Android平台。XE10是其中...
Android系统启动过程分析 本文主要介绍Android系统的启动过程,以Androidinit进程之后部分为主,init之前部分同标准Linux内核启动完全相同。于Android启动过程复杂,涉及C、C++及java部分内容,本文以流程分析为主线...
Android启动过程是一个复杂而有序的系统初始化阶段,涵盖了操作系统内核加载、系统服务启动、用户界面呈现等多个步骤。在这个过程中,Makefile起着至关重要的作用,它是构建Android系统的基石之一。 首先,Android...
android系统启动的详细流程,从上电到进入桌面的详细过程