安卓底层开发学习经验第二十期

这一期我们来学习一下 Android  SystemServer 所做的事情以及他的一个启动过程。
首先我们要明白 systemService 是我们 zygote 孵化出来的第一个 Android 服务程序,而这个服务程序会在他的启动过程中,启动我们所有的 Android 的核心服务,下面我们来介绍几个主要的服务

其中 Android systemserver 他会派生出下面几个主要服务,首先是我们的电源相关的 PowerManagerService 以及 BatteryService ,一个是用来管理我们的电源,第二个是我们电池的一些服务,比如我们要从应用层得到我们电池的电量,我们就需要调用 PowerManagerService ,在写应用的时候要写上要有访问这个服务的权限。第二个是 ActivityManagerService ,这个是我们 Android 的一个核心服务,它主要用于我们 Activity 的一个管理。第三个是我们的 PackageManagerService ,他的启动过程需要一点时间,因为他在启动过程中要扫描我们系统中一些原有的 jar 包,如果我们用升级的方式将系统升级了,那么他会进行一下扫描,如果发现和我们升级前有所区别的话,就会重新生成这些包,第二个是要扫面我们系统中所有的应用程序,所提他的整个启动时间也需要 1~2 秒的时间。它主要是程序包的一个管理服务。第四个核心服务是 WindowManagerService ,它主要是用于管理我们窗口的一个服务,我们每一个 activity 申请的窗口都需要他来进行管理,而他主要是和我们的 surfaceflinger 这个服务来进行交互,我们没申请一个应用,他都需要拿过来申请一个窗口。第五个是我们打电话的服务。第六个是 ContentService ,这个主要提供进程数据交换的服务

一些外设的服务包括传感器服务,包括 LightsService 光感服务,和我们的震动服务 VibratorService 。当我们打电话时,手机接近我们的耳朵时,屏幕就会变黑,这就是我们光感来管理的。当我们来短信或者铃声时,手机会震动,它是由我们的震动服务来管理的。如果我们想操作手机震动,那么就必须获得这个服务,他才能触发底层的硬件,来完成这个动作。接下来就是我们的网络服务,他是我们 Android 系统中的一个重要的服务,在软件方面来看,也就是我们的上层来看,他可以分为手机网络管理服务;手机网络状态服务,他就是用来判断我们有没有连上网,联网的状态 3g 或者 4g ;还有就是 WiFi 热点的服务 p2p 的服务;还有就是 WiFi service ,它主要是用于连接外网。最后一个是我们的网络连接状态服务。这些服务,他都是为我们 WiFi 这块来工作的。下面一个服务就是蓝牙服务,它主要是用来管理蓝牙的一些外设交互。还有就是一些其他的系统服务,比如输入法的服务等等,所以说我们 Android systemservice 是我们系统中很重要的一个服务。
下面我们来看一下 systemservice 的一个启动过程

首先我们 zygote 启动之后他会启动我们的 systemservice ,创建一个进程,然后调用我们 systemservice 这噶函数的 main 方法去启动 systemservice ,当他启动之后,首先会对我们的 dalvik.set 进行一下自己的设置,然后去 load 我们 systemservice 所需要的 native 的库, load 进来之后调用 native 的方法去把我们所需要的资源初始化一下,这个初始化过程主要是初始化 sensorservice ,比如我们的传感器,他都会在这里初始化完成,最后就会计入到我们的 initAndLoop ,把我们上边所说的所有服务,一条一条的初始化完成,嫁到我们的 servicemanager 中,加载完之后就会调用我们 loop 类中的 loop 方法,去处理一些消息,这个就是 systemservice 的一个启动过程
下面我们来看一下代码 systemservice 是如何启动的,我们打开源代码 frameworks/base/service/java/com/android/server/SystemServer.java ,然后找到入口函数

在这里首先会进行一个 SystemProperties.set 的一个设置,设置完成之后,会对 dalvik 进行一下清理,然后进行一下自己的设置,然后 load 了我们的 android_service .so, 它主要是做一下 sensorService 的初始化工作,在这里也会调用我们的 native 方法,去把我们的 sensorService 初始化完成,我们来看一下这个 native services 。这个 nativeInit 是在我们的 frameworks/base/services/jni/com_android_server_SystemServer.cpp

这里边只有一个 jni 的接口,就是我们的 android_server_SystemServer_nativeInit ,我们来看一下

他所做的事情就是service 的一个初始化,当我们 systemserver 初始化的时候我们会在这里初始化 sensorService ,当他初始化完成之后,我们就进入到了 initAndLoop ,在这里我们会启动系统的所有服务

他在这里有一个 setThreePriority 的方法,它实际上就是定义一下我们线程的优先级,因为我们 Android 是一个多进程、多线程的一个操作系统。当我们使用这个方法来设置我们当前线程优先级的时候,我们 Linux 系统会根据你设置的优先级的策略,来决定他调度的一个频繁度,如果设置的等级比较高,那么他得到的调度时间和机会就比较大,在我们上层也可以设置这个 setThreePriority 。然后他就做了一些启动的操作,定义了所有相关的 service ,比如账号管理服务、 LightsService 等当我们把这些定义完之后,他会在接下来的操作过程中一个一个的进行初始化,就是创建一个对象,然后添加到我们的 service 的一个过程。其中一些服务是需要在我们 systemservice 的服务中来进行初始化的,比如我们的 powermanagerservice ,他在这里需要进行一个 init ,完成之后 systemservice 还需要判断一下他是否已经 ready ,这个就是来看一下我们的 powermanagerservice 是否完全起来,如果没有正常起来,那么就会剖出一个异常,打印一些消息出来,这时候我们必须保证我们这些关键的服务能正常 init 的。如果我们没有做这些 ready 的选项,那么当我们系统做一些其他操作的时候,我们很有可能去查一下他们有没有 ready ,如过没有 ready ,那么一些服务是不可用的,这时候就会出一些问题。当我们的 systemservice 把整个系统的服务全部启动,并且等待他完成之后呢,就会进入到一个 Looper.loop() ,他在这里要处理消息。我们来看一下

他在这里就是接收消息,处理一下消息,这些就是我们systemservice 的一个启动过程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值