前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android系统启动流程(三)解析SyetemServer进程启动过程

Android系统启动流程(三)解析SyetemServer进程启动过程

作者头像
用户1269200
发布2018-02-01 14:29:22
1.1K0
发布2018-02-01 14:29:22
举报
文章被收录于专栏:刘望舒刘望舒

前言

上一篇我们学习了Zygote进程,并且知道Zygote进程启动了SyetemServer进程,那么这一篇我们就来学习Android7.0版本的SyetemServer进程的启动过程。

1.Zygote启动SyetemServer进程

在上一篇文章中我们讲到在ZygoteInit.java的startSystemServer函数中启动了SyetemServer进程,如下所示。 frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

在startSystemServer函数中调用handleSystemServerProcess来启动SyetemServer进程。

2.SyetemServer进程启动过程

handleSystemServerProcess函数的代码如下所示。

SyetemServer进程是复制了Zygote进程的地址空间,因此也会得到Zygote进程创建的Socket,这个Socket对于SyetemServer进程没有用处,因此,需要注释1处的代码来关闭该Socket。在注释2处调用RuntimeInit的zygoteInit函数,它的代码如下所示。

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

注释1处调用nativeZygoteInit函数,一看函数的名称就知道调用Native层的代码。

启动Binder线程池

接着我们来查看nativeZygoteInit函数对用的JNI文件,如下所示。 frameworks/base/core/jni/AndroidRuntime.cpp

通过JNI的gMethods数组,可以看出nativeZygoteInit函数对应的是JNI文件AndroidRuntime.cpp的com_android_internal_os_RuntimeInit_nativeZygoteInit函数:

这里gCurRuntime是AndroidRuntime类型的指针,AndroidRuntime的子类AppRuntime在app_main.cpp中定义,我们来查看AppRuntime的onZygoteInit函数,代码如下所示。 frameworks/base/cmds/app_process/app_main.cpp

注释1处的代码用来启动一个Binder线程池,这样SyetemServer进程就可以使用Binder来与其他进程进行通信了。看到这里我们知道RuntimeInit.java的nativeZygoteInit函数主要做的就是启动Binder线程池。

invokeStaticMain

我们再回到RuntimeInit.java的代码,在注释2处调用了applicationInit函数,代码如下所示。

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

applicationInit函数中主要调用了invokeStaticMain函数:

注释1处className为“com.android.server.SystemServer",因此通过反射返回的cl为SystemServer类。注释2处找到SystemServer中的main函数。在注释3处将找到的main函数传入到MethodAndArgsCaller异常中并抛出该异常。截获MethodAndArgsCaller异常的代码在ZygoteInit.java的main函数中,如下所示。

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

在注释1处调用了MethodAndArgsCaller的run函数:

这里mMethod指的就是SystemServer的main函数,因此main函数被动态调用。

3.解析SyetemServer进程

我们先来查看SystemServer的main函数: frameworks/base/services/java/com/android/server/SystemServer.java

main函数中只调用了SystemServer的run函数,如下所示。

run函数代码很多,关键就是在注释1处加载了libandroid_servers.so。接下来在注释2处创建SystemServiceManager,它会对系统的服务进行创建、启动和生命周期管理。启动系统的各种服务,在注释3中的startBootstrapServices函数中用SystemServiceManager启动了ActivityManagerService、PowerManagerService、PackageManagerService等服务。在注释4处的函数中则启动了BatteryService、UsageStatsService和WebViewUpdateService。注释5处的startOtherServices函数中则启动了CameraService、AlarmManagerService、VrManagerService等服务,这些服务的父类为SystemService。从注释3、4、5的函数可以看出,官方把系统服务分为了三种类型,分别是引导服务、核心服务和其他服务,其中其他服务为一些非紧要和一些不需要立即启动的服务。系统服务大约有80多个,这里列出部分系统服务以及它们的作用如下表所示:

引导服务

作用

Installer

系统安装apk时的一个服务类,启动完成Installer服务之后才能启动其他的系统服务

ActivityManagerService

负责四大组件的启动、切换、调度。

PowerManagerService

计算系统中和Power相关的计算,然后决策系统应该如何反应

LightsService

管理和显示背光LED

DisplayManagerService

用来管理所有显示设备

UserManagerService

多用户模式管理

SensorService

为系统提供各种感应器服务

PackageManagerService

用来对apk进行安装、解析、删除、卸载等等操作

核心服务

BatteryService

管理电池相关的服务

UsageStatsService

收集用户使用每一个APP的频率、使用时常

WebViewUpdateService

WebView更新服务

其他服务

CameraService

摄像头相关服务

AlarmManagerService

全局定时器管理服务

InputManagerService

管理输入事件

WindowManagerService

窗口管理服务

VrManagerService

VR模式管理服务

BluetoothService

蓝牙管理服务

NotificationManagerService

通知管理服务

DeviceStorageMonitorService

存储相关管理服务

LocationManagerService

定位管理服务

AudioService

音频相关管理服务

...

....

比如要启动PowerManagerService则会调用如下代码:

SystemServiceManager的startService函数启动了PowerManagerService,startService函数如下所示。

frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

注释1处的代码用来创建SystemService,这里的SystemService是PowerManagerService,在注释2处将PowerManagerService添加到mServices中,这里mServices是一个存储SystemService类型的ArrayList。接着调用PowerManagerService的onStart函数启动PowerManagerService并返回,这样就完成了PowerManagerService启动的过程。 除了用mSystemServiceManager的startService函数来启动系统服务外,也可以通过如下形式来启动系统服务,以PackageManagerService为例:

直接调用了PackageManagerService的main函数:

frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

注释1处直接创建PackageManagerService并在注释2处将PackageManagerService注册到ServiceManager中,ServiceManager用来管理系统中的各种Service,用于系统C/S架构中的Binder机制通信:Client端要使用某个Service,则需要先到ServiceManager查询Service的相关信息,然后根据Service的相关信息与Service所在的Server进程建立通讯通路,这样Client端就可以使用Service了。还有的服务是直接注册到ServiceManager中的,如下所示。

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

4.总结SyetemServer进程

SyetemServer在启动时做了如下工作: 1.启动Binder线程池,这样就可以与其他进程进行通信。 2.创建SystemServiceManager用于对系统的服务进行创建、启动和生命周期管理。 3.启动各种系统服务。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 刘望舒 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1.Zygote启动SyetemServer进程
  • 2.SyetemServer进程启动过程
    • 启动Binder线程池
      • invokeStaticMain
      • 3.解析SyetemServer进程
      • 4.总结SyetemServer进程
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档