本文是看完android框架揭秘第六章后的总结

android系统服务提供最基本的,最稳定的核心功能,如设备控制,信息通知,通知设定,以及消息显示等,存在于Android Framework与Android Libraries,如下图:

Android系统服务详解-android学习之旅(95)_第1张图片

系统服务分类:本地系统服务和java层系统服务

1.本地系统服务主要包括Audio Flinger,Surface Flinger,Media Player Service,Camera Service,Audio Policy Service等 ,除了Surface Flinger由System Server进程启动之外,其他都由Media Server进程启动

Audio Flinger介绍:Audio Flinger服务混合多种应用程序的音频数据,并发送到耳机,扬声器等音频输出设备中。在android设备种中,所有的音频数据都经过Audio Flinger进行输出,如下图:

Surface Flinger服务介绍:Surface Multimedia的一部分,在Android的实现中,它是一个服务,她提供系统范围的Surface Composer功能,能够将各种应用程序的Surface组合后,渲染到Frame Buffer设备中,如下图:

Android系统服务详解-android学习之旅(95)_第2张图片

java系统服务介绍:java系统服务由SystemServer系统进程启动,它分为:核心平台服务和硬件服务

核心平台服务一般不会与应用程序进行交互,他们是Android Framework运行所必须的服务。主要的服务如下表:

Android系统服务详解-android学习之旅(95)_第3张图片

硬件服务提供了一系列的API,用于控制底层的硬件,主要服务如下表:

Android系统服务详解-android学习之旅(95)_第4张图片

使用java系统服务 :无论是在Framework内部还是android的程序中,都需要使用能够与各服务通信的Local Manager对象,如下图:

Android系统服务详解-android学习之旅(95)_第5张图片

运行系统服务

一般的使用应用程序服务前,先调用strat Service()启动应用程序的服务,但是系统服务不需要,直接调用getSystemService()即可。因为Android在系统启动的过程中,init进程已经启动了这些系统服务。

在Android启动时候,系统服务具体由媒体服务器(Media Server进程) 与系统服务服务器(System Server进程)启动。具体如下图:

Android系统服务详解-android学习之旅(95)_第6张图片

Media Server进程的运行代码分析,这个进程运行除了Surface Flinger之外的本地系统服务,是由init进程启动

这里写图片描述

生成并初始化本地服务是由Media Server的main()函数负责的,主要代码如下:

Android系统服务详解-android学习之旅(95)_第7张图片

分析系统服务的初始化代码 :系统服务与Framework中的其他模块通信时,使用Binder IPC,系统服务这类服务提供者必须把相关的信息注册到Context Manager。代码如下图:

Android系统服务详解-android学习之旅(95)_第8张图片
Android系统服务详解-android学习之旅(95)_第9张图片

defaultServiceManager()函数会返回Service Manager对象,它是一个代理对象,用来实现Service Manager与Binder之间的通信。在Framework中,若想使用Context Manager的注册和获取服务的功能,必须使用Service Manager。如下图:

分析System Server进程的运行代码 :init.rc脚本的代码如下:

Android系统服务详解-android学习之旅(95)_第10张图片

加载android_server库:SystemServer的main()方法的主要功能是加载android-server的库(libandroid-serve.so),并调用init1() 方法,init1()方法通过JNI调用system-init()本地函数,代码如下:

Android系统服务详解-android学习之旅(95)_第11张图片

Surface Flinger是寄予C++的服务,而System Server是java进程,所以必须经由JNI通过System_init()函数来运行Surface Fliger服务,初始化代码如下:

上面的callStatic()方法是C++调用java方法的JNI方法,它调用了init2()

java系统服务的注册和初始化

init2()方法完成对java系统服务的初始化,init2()创建ServerThread对象,然后启动他。ServerThread是一个java 线程,它可以初始化java的所有的系统服务

java系统服务的注册和本地系统服务的注册有一定差别,它是通过调用ServiceManager类的addService()方法,讲自身注册到Context Manager ,代码如下:

Android系统服务详解-android学习之旅(95)_第12张图片

相关的几篇博客链接如下:

Android的启动过程分析(从进程和Framework的角度
Android的Context Manager(服务管理器)源码剖析
Android Binder IPC详解

总结一下java系统服务的启动过程,如下图:

Android系统服务详解-android学习之旅(95)_第13张图片

更多相关文章

  1. Android中使用代码开关GPS、移动网络(GPRS)、WiFi
  2. android多进程实验
  3. Android 使用反射机制获取或设置系统属性(SystemProperties)
  4. SONY 系列手机 Android 5.1 系统 Root 方法

随机推荐

  1. 既然android service是运行在主线程中的,
  2. Json解析(GSON开源库——最简单的json解析
  3. android 应用程序意见反馈
  4. Android筆記
  5. .NET开源了,Visual Studio开始支持 Androi
  6. 报告称Android和iOS设备正慢慢侵蚀PC市场
  7. Android登录界面的实现代码分享
  8. Android中OnkeyDown事件和OnBackPressed
  9. Android中使用GPS和NetWork获取定位信息
  10. java/android 设计模式学习笔记(5)---对象