展会信息港展会大全

Android系统启动过程
来源:互联网   发布日期:2016-01-14 12:16:19   浏览:1817次  

导读:Android的启动过程可以分为两个阶段,第一阶段是Linux的启动,第二阶段才是Android的启动,下面我们分别来了解一下具体的过程。首先是Linux启动,这一部分我想就可以略过了,无非是Linux的Bootloader,Kernel,D......

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()函数中有如下代码:

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

02 bool startSystemServer = (i < argc) ?

03

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

05

06 setArgv0(argv0, "zygote");

07 set_process_name("zygote");

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

09 startSystemServer);

10

11 }

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

frameworks/base/core/jni/AndroidRuntime.cpp

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

1 /* start the virtual machine */

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

3 goto bail;

4

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

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

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

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

02 startSystemServer();

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

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

05 }

06

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

08

09 if (ZYGOTE_FORK_MODE) {

10 runForkMode();

11 } else {

12 runSelectLoopMode();

13 }

前一部分是在启动系统服务,后一部分是虽然是一个条件判断,但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()函数中有如下代码

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

02 // Start the SurfaceFlinger

03 SurfaceFlinger::instantiate();

04 }

05

06 AndroidRuntime* runtime = AndroidRuntime::getRuntime();

07

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

09

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

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

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

代码是:

1 public static final void init2() {

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

3 Thread thr = new ServerThread();

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

5 thr.start();

6 }

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

1 try {

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

3 wallpaper = new WallpaperManagerService(context);

4 ServiceManager.addService(Context.WALLPAPER_SERVICE, wallpaper);

5 } catch (Throwable e) {

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

7 }

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

至此,系统的启动过程结束

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

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

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

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

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

赞助本站

人工智能实验室

相关热词: 启动过程

相关内容
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港