- 浏览: 33326 次
- 性别:
- 来自: 北京
最新评论
原文地址:http://blog.csdn.net/maxleng/article/details/5504485
Service深入分析
上一章我们分析了 Android IPC 架构 , 知道了 Android 服务构建的一些基本理念和原理,本章我们将深入分析 Android 的服务。 Android 体系架构中三种意义上服务:
- Native 服务
- Android 服务
- Init 空间的服务,主要是属性设置,这个IPC是利用Socket来完成的,这个我将在另外一章来讨论。
Navite 服务,实际上就是指完全在 C++ 空间完成的服务,主要是指系统一开始初始化,通过 Init.rc 脚本起来的服务,例如 Service Manger service,Zygote service,Media service , ril_demon service 等。
Android 服务是指在 JVM 空间完成的服务,虽然也要使用 Navite 上的框架,但是服务主体存在于 Android 空间。 Android 是二阶段初始( Init2 )初始化时建立的服务。
1 Service 本质结构
我们还是从 Service 的根本意义分析入手,服务的本质就是响应客户端请求。要提供服务,就必须建立接收请求,处理请求,应答客服端的框架。我想在 Android Service 设计者也会无时不刻把这个服务本质框图挂在脑海中。从程序的角度,服务一定要存在一个闭合循环框架 和请求处理框架
分析清楚服务框就必须弄清楚以下的机制及其构成。
(1 )闭合循环结构放置在哪里?
(2 )处理请求是如何分发和管理?
(3 )处理框架是如何建立的?
(4 )概念框架是如何建立的?
2 Service基本框架分析
Android设计中, Native Service 和 Android Service 采用了同一个闭合循环框架。这个闭合循环框架放置在 Native 的 C++ 空间中, ,ProcessState@ProcessState.cpp 和 IPCThreadState@IPCThreadState.cpp 两个类完成了全部工作。
在服务框架中, ProcessState 是公用的部分,这个公用部分最主要的框架就是闭合循环框架和接收到从 Binder 来的请求后的处理框架。我们将服务框架用 ProcessSate 来表示 , 简言之:
(1) addservice
(2) 建立闭合循环处理框架。
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
addService(String16("xxx0"), new xxx0Service());
addService(String16("xxx1"), new xxx1Service());
…
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();// 闭合循环框架
}
2.1 Native Service
Native Service是在系统 Init 阶段通过 Init.rc 脚本建立的服务。
首先来看看一个例子mediaserver@main_mediaserver.cpp 的建立过程。
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
我们将代码向下展开了一层,更能看到事物的本质。
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
defaultServiceManager()->addService(String16("media.audio_flinger"), new AudioFlinger());
…
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
(1 )服务进程建立了 ProcessState对象,并将给对象登记在进程的上下文中。
(2 )建立一个新 AudioFlinger对象,并将对象登记Service Manager Service 中。
(3 )开始就收请求,处理请求,应答这个循环闭合框架。
2.2 Android Service
Androids service是系统二阶段(Init2 ) 初始化时建立的服务。
Android的所有服务循环框架都是建立SystemServer@(SystemServer.java) 上。在SystemServer.java中看不到循环结构,只是可以看到建立了init2的实现函数,建立了一大堆服务,并AddService到service Manager。
main() @ com/android/server/SystemServer
{
init1();
}
Init1()是在 Native 空间实现的( com_andoird_server_systemServer.cpp )。我们一看这个函数就知道了,原来这个闭合循环处理框架在这里:
init1->system_init() @System_init.cpp
在system_init() 我们看到了这个久违的循环闭合管理框架。
{
Call "com/android/server/SystemServer", "init2"
…..
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
Init2()@SystemServer.java中建立了 Android 中所有要用到的服务:
Entropy Service
Power Manager
Activity Manager
Telephony Registry
Package Manager
Account Manager
Content Manager
System Content Providers
Battery Service
Hardware Service
Alarm Manager
Init Watchdog
Sensor Service
Window Manager
Bluetooth Service
statusbar
Clipboard Service
Input Method Service
NetStat Service
Connectivity Service
Accessibility Manager
Notification Manager
Mount Service
Device Storage Monitor
Location Manager
Search Service
Checkin Service
Wallpaper Service
Audio Service
Headset Observer
Backup Service
AppWidget Service
3 ProcessState和 IPCThreadState
从宏观来讲,PocessState 及其 IPCThreadState 处于 IPC 与内核打交道包装层。前面的章节已经提到,下面我将更详细的分析。有关 IPC 的 c++ 空间的实现都是从 ProcessState 这个对象完成的。
我们可以得出如下的结论:不管JVM 的 Binder 做了多么复杂的操作,最终还是需要利用 ProcessState 这个c++ 空间的对象把数据传递给 Binder Driver ,接收数据也是通过 ProcessState 这个对象完成, ProcessState 是所有 Binder IPC 必经的通道。
ProcessState放置在全局变量gProcess 中,每个进程只有一个 ProcessState 对象,负责打开 Binder 设备驱动,建立线程池等。而 IPCThreadState 每个线程有一个, IPCThreadState 实例登记在 Linux线程程的上下文附属数据中,主要负责Binder 数据读取,写入和请求处理框架 。IPCThreadSate在构造的时候,获取进程的 ProcessSate 并记录在自己的成员变量 mProcess 中 , 通过 mProcess 可以获取到 Binder 的句柄。
3.1 ProcessState的生命周期
既然ProcessState 是 Binder 通讯的基础,那么 Process 必须在 Binder 通讯之前建立。客户端,服务端都必须建立。由于现在重点讨论服务端,所以重心放置在服务端。在 Android 体系中有 c++ 空间的服务, JVM 空间的服务,这两类服务在本质上相同的,只是形式上不同,由于他们都是建立在ProcessState这个基础上,所以在形式上不同就仅仅表现在对 OnTransact 的回调处理的不同。
Native Service
我们直接可以看到使用sp<ProcessState> proc(ProcessState::self()),建立建立ProcessState ,一旦调用 ProcessState 就建立了,并且这个 self 将 ProcessSate 登记在 全局变量中。
Android Service
建立Android Service 服务 system_init @System_init.cpp 中我们可以看到相同的结构。有一点不同的是所有的 Android Service 都运行在一个进程中: systemsever 进程。
3.2 Binder Driver包装 @IPCThreadState
ProcessSate构造的时候 ,使用open_binder 打开 /driver/binder,并将句柄记录在mDriverFD,在ProcessState 中并不使用这个句柄,真正使用这个 Binder 设备句柄的是 IPCThreadState ,所有关于 Binder 的操作放置在 IPCThreadState 中:
(1)读取/ 写入: talkWithDriver () @IPCThreadState 对 ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) 进行包装。
(2)请求处理: executeCommand(...)@ IPCThreadState
(3)循环结构: joinThreadPool()
joinThreadPool()
{
While(1){
talkWithDriver(...)
...
executeCommand(...)
}
}
发表评论
-
Android核心分析(21)----Android应用框架之AndroidApplication
2012-02-13 14:34 775原文地址:http://blog.csdn ... -
Android核心分析(20)----Android应用程序框架之无边界设计意图
2012-02-13 14:31 894原文地址:http://blog.csdn ... -
Android核心分析(19)----电话系统之GSMCallTacker
2012-02-13 14:25 803原文地址:http://blog.csdn ... -
Android核心分析(18)-----Android电话系统之RIL-Java
2012-02-13 14:10 1142原文地址:http://blog.csdn.net/maxle ... -
Android核心分析(17) ------电话系统之rilD
2012-02-13 14:02 680原文地址:http://blog.csdn.net/maxle ... -
Android核心分析(16)-----Android电话系统-概述篇
2012-01-31 14:39 906原文地址:http://blog.csdn.net/m ... -
Android核心分析(15)--------Android输入系统之输入路径详解
2012-01-31 14:22 833原文地址:http://blog.csdn.net/maxle ... -
Android核心分析(14)------ Android GWES之输入系统
2012-01-31 10:47 950原文地址:http://blog.csdn ... -
Android 核心分析(13) -----Android GWES之Android窗口管理
2012-01-31 10:44 817原文地址:http://blog.csdn ... -
Android 核心分析(12) -----Android GEWS窗口管理之基本架构原理
2012-01-31 10:27 1031原文地址:http://blog.csdn.net/maxle ... -
Android SurfaceFlinger中的SharedClient -- 客户端(Surface)和服务端(Layer)之间的显示缓冲区管理
2012-01-11 11:00 1350原文地址:http://blog.csdn.net/Droid ... -
Android核心分析 之十一-------Android GWES之消息系统
2012-01-10 14:09 669原文地址:http://blog.csdn.net/maxle ... -
Android核心分析 之十-------Android GWES之基本原理篇
2011-12-30 15:08 735原文地址:http://blog.csdn ... -
Android核心分析 之九-------Zygote Service
2011-12-30 15:02 756原文地址:http://blog.csdn.net/maxle ... -
Android 核心分析 之八------Android 启动过程详解
2011-12-30 14:56 637原文地址:http://blog.csdn.net/maxle ... -
Android 核心分析 之六 -----IPC框架分析 Binder,Service,Service manager
2011-12-30 14:41 936原文地址:http://blog.csdn.net/maxle ... -
Android 核心分析 之五 -----基本空间划分
2011-12-29 11:13 654原文地址:http://blog.csdn.net/maxle ... -
Android核心分析之四 ---手机的软件形态
2011-12-29 11:09 654原文地址:http://blog.csdn.net/maxle ... -
Android是什么 之三-------手机之硬件形态
2011-12-29 11:07 637原文地址:http://blog.csdn.net/maxle ... -
Android核心分析 之二 -------方法论探讨之概念空间篇
2011-12-29 11:03 591原文地址:http://blog.csdn.net/maxle ...
相关推荐
Android 核心分析 之七------Service 深入分析..............................................................21 Android 核心分析 之八------Android 启动过程详解................................................
核心分析之七 ----- Service 深入分析 核心分析之八 ----- Android 启动过程详解 核心分析之九 ----- Zygote Service 核心分析之十 ----- Android GWES之基本原理篇 核心分析之十一 ----- Android GWES之消息系统 ...
Android核心分析之七------Service深入分析..............................................................21 Android核心分析之八------Android 启动过程详解.....................................................
### Android核心分析之Android启动过程详解 Android启动过程是一个复杂且有序的流程,涉及多个关键阶段,从硬件初始化到最终的用户界面呈现。这一过程可以分为四大步骤:init进程启动、Native服务启动、...
Android启动过程详解主要分为四个关键步骤,这四个步骤构建了Android系统的基石。下面将详细阐述这些步骤以及涉及...理解这个启动过程对于Android开发者和系统优化人员至关重要,有助于深入理解Android系统的运行机制。
#### 五、Service深入分析 **Android核心分析(07):** Service是Android系统中用于执行后台任务的重要组件。这部分内容详细介绍了Service的生命周期、创建方式以及与其他组件的交互方式。 #### 六、启动过程详解 ...
[转]Android 核心分析 技术专题之七--Service深入分析
“android-location-service-源码.rar”包含了Android系统中定位服务的核心源代码,包括LocationManagerService、LocationProvider、GpsLocationProvider、NetworkLocationProvider等关键类。通过对这些源码的深入...
Android核心分析是关于Android系统的深入研究和分析,涵盖了Android系统的架构设计、核心机制、软件和硬件形态、IPC框架、Service管理、启动过程、窗口管理、输入系统、电话系统、应用程序框架、GDI机制等方面的知识...
通过分析这个"Android auto-update-service-develop"源码,学生不仅可以掌握Android服务的编写,还能了解网络通信、权限控制、通知管理等多个重要模块,对于提升综合开发能力大有裨益。同时,这样的实践项目也为未来...
《Android核心机制深入分析》是针对Android系统内部工作原理的一篇详尽研究,旨在帮助开发者深化对Android系统核心机制的理解。这份PDF文档由TerryLog的分析整理而成,涵盖了Android的多个关键层面,包括但不限于...
6. 开发者工具:Android Studio提供了丰富的调试工具,如DDMS(Dalvik Debug Monitor Service)的替代品Android Device Monitor,用于内存分析、线程监控和文件管理;以及新的Java Profiler,帮助优化应用性能。 7....
- **Service深入分析**: - Service作为Android的核心组件之一,其工作原理、生命周期以及如何与Activity等其他组件进行交互都是需要重点掌握的内容。 - 例如,Service如何被启动、绑定,以及如何进行通信和数据...
这篇文档主要探讨了Android GWES(Global Workspace Environment System)中的窗口管理机制,特别是涉及到Window、DecorView、View、IWindow、ISession以及WindowState等核心组件之间的关系。 1. **基本构架原理** ...
Android电话系统是Android操作系统的核心组件之一,主要负责处理与通信相关的功能,如拨打电话、接收来电、发送短信、管理网络连接以及PIM(个人信息管理)。本文将深入探讨Android电话系统的基本构成、工作原理以及...
1. **Android基础**:首先,学生会学习Android系统架构和应用程序框架,理解Activity、Intent、BroadcastReceiver、Service等核心概念。 2. **用户界面设计**:使用XML布局文件创建各种视图组件,如TextView、...
其中包括Activity Manager、Content Provider、Broadcast Receiver、Service等核心组件,它们构成了Android应用的基本架构。 3. **系统服务**:Android系统服务如电源管理、位置服务、网络连接、硬件抽象层等,是...
这篇博客"Android Service深入解析Demo"通过实例深入讲解了Service的相关知识,下面将详细阐述Service的核心概念、生命周期、启动与绑定方式以及如何在实践中应用。 1. **Service核心概念** Service是Android系统...
Android Chromium是一款开源的浏览器项目,它是Google Chrome浏览器在Android平台上的核心组件。此源码提供了深入了解Android应用程序开发、Web浏览技术以及Chrome浏览器内部工作原理的宝贵资源。通过分析这份源码,...
### Android核心分析概览 #### 一、设计意图与方法论探讨 - **设计意图的重要性:** 开发者在深入研究Android系统时,首先要明确设计者的初衷与目标。只有理解了设计者的意图,才能更好地把握整个系统的架构和发展...