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

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

系统服务分类:本地系统服务和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设备中,如下图:

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

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

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

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

运行系统服务

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

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

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

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

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



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

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

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

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的启动过程分析(从进程和Framework的角度

Android的Context Manager(服务管理器)源码剖析

Android Binder IPC详解

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

Android系统服务详解-android学习之旅(95)的更多相关文章

  1. 【Android】详解Android Service

    目录结构: contents structure [+] Service简单概述 Service在清单文件中的声明 Service启动服务 Service绑定服务 扩展Binder类 使用Messen ...

  2. 【Android】详解Android的menu菜单

    在软件应用过程中,菜单的存在是必不可少的,我这次讲一下,我对android菜单的一个基础做法吧 Android的菜单分为三种类型:选项菜单(Option Menu).上下文菜单(Context Men ...

  3. 【Android】详解Android Activity

    目录结构: contents structure [+] 创建Activity 如何创建Activity 如何创建快捷图标 如何设置应用程序的名称.图标与Activity的名称.图标不相同 Activ ...

  4. 【Android】详解Android动画

    目录结构: contents structure [+] 补间动画 使用java代码实现Alpha.Rotate.Scale.Translate动画 通过xml文件实现Alpha.Rotate.Sca ...

  5. 【Android】详解Android 网络操作

    目录结构: contents structure [+] 判断网络 判断是否有网络连接 判断WIFI网络是否可用 判断MOBILE网络是否可用 获取当前网络连接的类型信息 监听网络 获取网络信息需要在 ...

  6. 【Android】详解Android动画之Interpolator插入器

    Interpolator英文意思是: 篡改者; 分类机; 校对机 SDK对Interpolator的描述是:An interpolator defines the rate of change of ...

  7. Android Binder IPC详解-Android学习之旅(96)

    linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...

  8. Android进阶(十四)Android Adapter详解

    Android Adapter详解 Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View.因为layout五花八门,很多数据都不能直接绑定上去, ...

  9. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

随机推荐

  1. 学习Tensorflow,反卷积

    在深度学习网络结构中,各个层的类别可以分为这几种:卷积层,全连接层,relu层,pool层和反卷积层等.目前,在像素级估计和端对端学习问题中,全卷积网络展现了他的优势,里面有个很重要的层,将卷积后的f ...

  2. 在ubuntu上部署一个samba服务器

    今天公司装了一天新电脑,准备把它装成服务器,于是为了方便开发的使用,我在上面部署了一个samba,用来实现window和linux的联系: 具体步骤,我详细的查看了百度,高手云集,以下就是总结了网友的 ...

  3. Java基础---集合框架---迭代器、ListIterator、Vector中枚举、LinkedList、ArrayList、HashSet、TreeSet、二叉树、Comparator

    为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合类同是容器,有何不同? 数组虽然也可以存储对 ...

  4. UNIX网络编程——信号驱动式I/O

    信号驱动式I/O是指进程预先告知内核,使得当某个描述符上发生某事时,内核使用信号通知相关进程. 针对一个套接字使用信号驱动式I/O,要求进程执行以下3个步骤: 建立SIGIO信号的信号处理函数. 设置 ...

  5. (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计

    在这新的系列中,我们来尝试完成一款经典的游戏:炸弹人 这是以前红白机上的炸弹人,由于游戏可玩性强,玩法又简单,在后面的机型上陆续推出了很多款续作. 在随后的触屏设备上也出现了炸弹人的模拟版,用的是模拟 ...

  6. android修改HOLO对话框风格

    andriod中修改对话框的风格,可以通过设置theme来实现,部分元素需要通过Java代码来修改,下面以修改对话框的标题为例说明各步骤. 1.编写一个文本样式. DIALOG的标题是一个textvi ...

  7. Ubuntu 15.10下的WebStorm-11.0.3完美破解

    由于最新的JetBrains 发布了最新版本的IntelliJ IDEA的各个版本,而且更换了注册机的使用方式,这就导致了之前对WebStorm的破解方法不能在使用了.所以我们就必须另寻他法咯.如题, ...

  8. J2EE进阶(二)从零开始之Struts2

    J2EE进阶(二)从零开始之Struts2 以前自己总是听说什么SSH框架,不明觉厉.现在自己要重整旗鼓,开始系统性的学习SSH框架了.首先开始Struts2的学习.其实自己之前参与过Struts2项 ...

  9. android打包方法超过65k错误

    近日,Android Developers在Google+上宣布了新的Multidex支持库,为方法总数超过65K的Android应用提供了官方支持. 如果你是一名幸运的Android应用开发者,正在 ...

  10. iOS开发中 常用枚举和常用的一些运算符(易错总结)

    1.色值的随机值: #define kColorValue arc4random_uniform(256)/255.0 // arc4random_uniform(256)/255.0; 求出0.0~ ...