分类: LINUX
2010-04-27 09:02:59
各个类之间的关系如下所示:
1.2 servicemanager部分
servicemanager是一个守护进程,用于这个进程的和/dev/binder通讯,从而达到管理系统中各个服务的作用。
可执行程序的路径:
/system/bin/servicemanager
开源版本文件的路径:
frameworks/base/cmds/servicemanager/binder.h
frameworks/base/cmds/servicemanager/binder.c
frameworks/base/cmds/servicemanager/service_manager.c
程序执行的流程:
open():打开binder驱动
mmap():映射一个128*1024字节的内存
ioctl(BINDER_SET_CONTEXT_MGR):设置上下文为mgr
进入主循环binder_loop()
ioctl(BINDER_WRITE_READ),读取
binder_parse()进入binder处理过程循环处理
binder_parse()的处理,调用返回值:
当处理BR_TRANSACTION的时候,调用svcmgr_handler()处理增加服务、检查服务等工作。各种服务存放在一个链表(svclist)中。其中调用binder_等开头的函数,又会调用ioctl的各种命令。
处理BR_REPLY的时候,填充binder_io类型的数据结构
1.3 binder的库的部分
binder相关的文件作为Android的uitls库的一部分,这个库编译后的名称为libutils.so,是Android系统中的一个公共库。7 ~! }7 C6 {, Z& v+ G
主要文件的路径如下所示:bbs.chinabyte.com( s! B6 C6 c3 d0 W- j& F
frameworks/base/include/utils/*
frameworks/base/libs/utils/*
主要的类为:
RefBase.h :bbs.chinabyte.com4 N2 ~3 \- ~/ o% h) w; R0 L3 y% _: w
引用计数,定义类RefBase。
Parcel.h :( W( M/ P0 y; R
为在IPC中传输的数据定义容器,定义类Parcelbbs.chinabyte.com3 L5 X7 c; i5 y
IBinder.h:
Binder对象的抽象接口, 定义类IBinder: _' H# a& D4 ~8 U* l
Binder.h:比特网论坛" s5 c1 \) E% I
Binder对象的基本功能, 定义类Binder和BpRefBase
BpBinder.h:9 ^! b- l, B6 y p4 [% H% j
BpBinder的功能,定义类BpBinder( \0 _3 z. L( m3 `' X% W" u
IInterface.h:8 I: A" a& m( @. ~6 {
为抽象经过Binder的接口定义通用类,% {7 w8 n& U$ c- {/ A) J
定义类IInterface,类模板BnInterface,类模板BpInterface
ProcessState.h* x0 C4 y7 S3 M4 K$ \" t) f, b
表示进程状态的类,定义类ProcessState
IPCThreadState.h" {* {2 D% r2 ^9 [; n
表示IPC线程的状态,定义类IPCThreadState
在IInterface.h中定义的BnInterface和BpInterface是两个重要的模版,这是为各种程序中使用的。0 [5 H z8 P4 s+ h
BnInterface模版的定义如下所示:
template
class BnInterface : public INTERFACE, public BBinder. n0 x- _# b3 R5 z
{比特网论坛4 I3 C4 G4 t% p i- F9 e( n8 [
public:比特网论坛( h3 {- H1 Z$ V1 `$ s
virtual sp
virtual String16 getInterfaceDescriptor() const;
protected:. ^4 n# g Y# B5 ]
virtual IBinder* onAsBinder();bbs.chinabyte.com' _1 V/ l7 H) |/ b1 K
};
BnInterface模版的定义如下所示:2 W7 Y! R9 Z7 w, R7 f6 A( S
template
class BpInterface : public INTERFACE, public BpRefBase
{
public:" y/ ^0 e# H7 \+ h, ^3 H* Q
BpInterface(const sp
protected:bbs.chinabyte.com8 z/ ?; G3 e: Q
virtual IBinder* onAsBinder();
};
这两个模版在使用的时候,起到得作用实际上都是双继承:使用者定义一个接口INTERFACE,然后使用BnInterface和BpInterface两个模版结合自己的接口,构建自己的BnXXX和BpXXX两个类。
DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE两个宏用于帮助BpXXX类的实现: 比特网论坛( V) t& }6 Q9 H% I
#define DECLARE_META_INTERFACE(INTERFACE) bbs.chinabyte.com9 \* B" m* S3 G% Q
static const String16 descriptor;
static sp asInterface(const sp
virtual String16 getInterfaceDescriptor() const;
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) 比特网论坛8 n7 P" ?, i+ E3 Y% v* E
const String16 I##INTERFACE::descriptor(NAME);
String16 I##INTERFACE::getInterfaceDescriptor() const {
return I##INTERFACE::descriptor; + g1 ]* F- X2 O2 {7 N% {
} bbs.chinabyte.com0 x$ z2 G2 @' `
sp I##INTERFACE::asInterface(const sp
{
sp intr; , b- z: R3 o6 o" D& c" W% f. N
if (obj != NULL) {
intr = static_cast( # ?9 ^+ Y3 a: f5 x4 ?8 E
obj->queryLocalInterface(
I##INTERFACE::descriptor).get());
if (intr == NULL) {
intr = new Bp##INTERFACE(obj); bbs.chinabyte.com9 }: g, t% E% ^$ h/ \: H/ x w: b
} ! `) z$ d0 ~" o- y
} ) T# B j2 H; _4 {1 j( f7 r( W/ L
return intr; 比特网论坛: x3 `5 ] `$ l* B/ H/ d
}
在定义自己的类的时候,只需要使用DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE两个接口,并结
合类的名称,就可以实现BpInterface中的asInterface()和getInterfaceDescriptor()两个函数。