`

Android 核心分析 之七------Service深入分析

阅读更多

原文地址: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 核心分析

    Android 核心分析 之七------Service 深入分析..............................................................21 Android 核心分析 之八------Android 启动过程详解................................................

    android核心分析pdf

    Android核心分析(07)----Service深入分析 Android核心分析(08)----Android 启动过程详解 Android核心分析(09)----Zygote Service Android核心分析(10)----Android GWES之基本原理篇 Android核心分析(11)--...

    [经典文档]Android核心分析

    核心分析之七 ----- Service 深入分析 核心分析之八 ----- Android 启动过程详解 核心分析之九 ----- Zygote Service 核心分析之十 ----- Android GWES之基本原理篇 核心分析之十一 ----- Android GWES之消息系统 ...

    Android核心设计思想分析

    Android核心分析之七------Service深入分析..............................................................21 Android核心分析之八------Android 启动过程详解.....................................................

    Android核心分析

    Android 核心分析 之七 ------Service 深入分析 .............................................................. 21 Android 核心分析 之八 ------Android 启动过程详解 ...........................................

    Android主要机制深入分析

    Android 核心分析之七------Service 深入分析..............................................................21 Android 核心分析之八------Android 启动过程详解..................................................

    Android核心分析(pdf)

    Android核心分析(07)----Service深入分析 Android核心分析(08)----Android 启动过程详解 Android核心分析(09)----Zygote Service Android核心分析(10)----Android GWES之基本原理篇 Android核心分析(11)--...

    Android 核心分析7

    [转]Android 核心分析 技术专题之七--Service深入分析

    android开发资料大全

    Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程 Android应用开发者指南:性能优化 android开发教程合集(推荐新手看下这一季教程) 新手入门 会员贡献电子图书整理(内含PDF下载) ...

    深入理解Android(卷2)

    第5章则对Android系统中负责电源管理的核心服务 PowerManagerService的原理进行了一番深入的分析;第6章以ActivityManagerService为分析重点,它的启动、Activity的创建和启动、BroadcastReceiver的工作原理、...

    深入理解Android:卷2,中文完整扫描版

    第5章则对Android系统中负责电源管理的核心服务 PowerManagerService的原理进行了一番深入的分析;第6章以ActivityManagerService为分析重点,它的启动、Activity的创建和启动、BroadcastReceiver的工作原理、...

    计算机毕业设计 - Android系统原理与开发要点详解-培训课件,保证可靠运行,计算机毕业生可参考,免费资源下载

    本项目旨在深入剖析Android系统的核心原理,并详细阐述其开发过程中的关键要点,为计算机专业的毕业生和Android开发者提供一套全面而系统的培训课件。 在内容方面,该培训课件首先介绍了Android系统的基本架构和...

    Android开发艺术探索

     第7章 Android动画深入分析 / 265  7.1 View动画 / 265  7.1.1 View动画的种类 / 265  7.1.2 自定义View动画 / 270  7.1.3 帧动画 / 272  7.2 View动画的特殊使用场景 / 273  7.2.1 LayoutAnimation / 273 ...

    Android并发开发

    第5-7章是本书的核心内容,深入探讨Android操作系统的细节,如Looper/Handler、Service、Binder、定时任务等。第8章介绍并发工具,如静态分析、注解、断言等。本书适合有Android开发经验的读者参考。如果你是一名...

    android开发入门与实战(下)

    3.3.1 开发的基石——AndroidAPI核心开发包介绍 3.3.2 拓展开发外延——Android可选API介绍 3.4 本章小结 第4章 赚钱的市场——AndroidMarket及应用发布 4.1 GoogleMarket产生背景与目的 4.2 体验“选货”的乐趣...

    《Google Android开发入门与实战》.pdf

    从技术实现上,讲解了5个android平台下的完整综合实例及源代码分析,分别是rss阅读器、基于google map的个人gps、豆瓣网(web 2.0)客户端、在线音乐播放器、手机信息查看助手。本书注重对实际动手能力的指导,在遵循...

Global site tag (gtag.js) - Google Analytics