一个Binder例子
C++使用binder实例

C++使⽤binder实例Android系统最常见也是初学者最难搞明⽩的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的。
所以搞明⽩Binder的话,在很⼤程度上就能理解程序运⾏的流程。
这是⼀个⽤C++写的binder,⼀个服务器⼀恶搞客户端,代码如下:server.cpp1 #include <binder/IServiceManager.h>2 #include <binder/IBinder.h>3 #include <binder/Parcel.h>4 #include <binder/ProcessState.h>5 #include <binder/IPCThreadState.h>6 #include <android/log.h>7using namespace android;8 #ifdef LOG_TAG9#undef LOG_TAG10#endif11#define LOG_TAG "testService"1213#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "ProjectName", __VA_ARGS__)14#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "ProjectName", __VA_ARGS__)15#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "ProjectName", __VA_ARGS__)16#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "ProjectName", __VA_ARGS__)17#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "ProjectName", __VA_ARGS__)1819class MyService : public BBinder20 {21public:22 MyService()23 {24 mydescriptor = String16("media.hello");25 n=0;26 }27virtual ~MyService() {}28//This function is used when call Parcel::checkInterface(IBinder*)29virtual const String16& getInterfaceDescriptor() const30 {31 LOGE("this is enter ==========getInterfaceDescriptor");32return mydescriptor;33 }34protected:35void show()36 {37 LOGE("this is for test show");38 LOGE("this is for test show");39 LOGE("this is for test show");40 LOGE("this is for test show");41 LOGE("this is for test show");42 }43virtual status_t onTransact( uint32_t code,const Parcel& data,Parcel* reply,uint32_t flags = 0)44 {45 LOGD("enter MyService onTransact and the code is %d",code);46/*47 if (data.checkInterface(this))48 LOGD("checkInterface OK");49 else50 {51 LOGW("checkInterface failed");52 return BBinder::onTransact(code, data, reply, flags);53 }54*/55switch (code)56 {57case1:58 LOGD("MyService interface 1");59break;60case2:61 LOGD("MyService interface 2");62 cb = data.readStrongBinder();63break;64case3:65 {66 LOGD("MyService interface 3, exit");67//No unregister service routine?68//It should return to client first and then call exit in another place.69 exit(0);70break;71 }72case4:73 {//call cb74 LOGD("MyService interface 4 before if================");75 cb = data.readStrongBinder();76if (cb != NULL)77 {78 LOGD("MyService interface 4");79 Parcel in, out;80in.writeInterfaceToken(String16("android.os.ISetupCallback"));81in.writeInt32(n++); //向客户端发送数据8283in.writeCString("This is a string !");84 cb->transact(2, in, &out, 0);85 show();86 }87break;88 }89default:90return BBinder::onTransact(code, data, reply, flags);91 }92return0;93 }94private:95 String16 mydescriptor;96 sp<IBinder> cb;97int n;98 };99int main()100 {101 sp<IServiceManager> sm = defaultServiceManager(); //获取ServiceManager服务代理102 status_t ret;103//register MyService to ServiceManager104 MyService* srv = new MyService();105 ret = sm->addService(String16("media.hello"), srv); // 注册服务106 LOGD("addservice media.hello return %d", ret);107//call binder thread pool to start108 ProcessState::self()->startThreadPool();109 IPCThreadState::self()->joinThreadPool(true); //参数默认也是true,进⼊服务的循环监听状态110return0;111 }clinet.cpp1 #include <binder/IServiceManager.h>2 #include <binder/IBinder.h>3 #include <binder/Parcel.h>4 #include <binder/ProcessState.h>5 #include <binder/IPCThreadState.h>6 #include <private/binder/binder_module.h>7 #include <android/log.h>89using namespace android;10 #ifdef LOG_TAG11#undef LOG_TAG12#endif13#define LOG_TAG "testCallback"1415#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "ProjectName", __VA_ARGS__)16#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "ProjectName", __VA_ARGS__)17#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "ProjectName", __VA_ARGS__)18#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "ProjectName", __VA_ARGS__)19#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "ProjectName", __VA_ARGS__)2021class MySetupCallback : public BBinder22 {23public:24 MySetupCallback()25 {26 mydescriptor = String16("android.os.ISetupCallback");27 }28virtual ~MySetupCallback() {}29virtual const String16& getInterfaceDescriptor() const30 {31return mydescriptor;32 }33protected:34virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0)35 {36 LOGD("enter MySetupCallback onTransact, code=%u", code);37if (data.checkInterface(this)) //检查 mydescriptor 类描述字符串38 LOGD("checkInterface OK");39else40 {41 LOGW("checkInterface failed");42return -1;43 }44switch (code) //code为服务器发送的code,根据code实现不同的函数45 {46case1:47 LOGD("From Server code = %u", code);48 LOGD("From Server code = %u", code);49break;50case2:51 {52 LOGD("From Server code = %u", code);53 LOGD("Frome server data = %d", data.readInt32()); //从服务端接收数据54 LOGD("Frome server string = %s", data.readCString());5556break;57 }58default:59break;60 }61return0;62 }63private:64 String16 mydescriptor;65 };6667int main()68 {69 sp<IServiceManager> sm = defaultServiceManager(); //获取ServiceManager服务代理70 sp<IBinder> b = sm->getService(String16("media.hello")); //查询服务71if (b == NULL)72 {73 LOGW("Can't find binder service \"media.hello\"");74return -1;75 }76 Parcel in1,out1;77 MySetupCallback *cb = new MySetupCallback();78 in1.writeStrongBinder(sp<IBinder>(cb));79int ret = b->transact(4, in1, &out1, 0); //TRANSACTION_registerSetup = 480 LOGD("transact(4) return %d", ret);81 ProcessState::self()->startThreadPool();82 IPCThreadState::self()->joinThreadPool(); //参数默认也是true,进⼊服务的循环监听状态83return0;84 }Android.mk# Copyright 2006 The Android Open Source ProjectLOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SHARED_LIBRARIES := \libcutils \libbinder \libutils \libhardwareLOCAL_SRC_FILES:= client.cppLOCAL_MODULE_TAGS = eng testsLOCAL_MODULE:= testClientinclude $(BUILD_EXECUTABLE)include $(CLEAR_VARS)LOCAL_SHARED_LIBRARIES := \libcutils \libbinder \libutils \libhardwareLOCAL_SRC_FILES:=server.cppLOCAL_MODULE:= testServerLOCAL_MODULE_TAGS = eng testsinclude $(BUILD_EXECUTABLE)客户端运⾏结果如下:以上代码参考别⼈写的做了点修改,有错误的地⽅欢迎指出来,谢谢。
Android进程间通信机制(Binder)介绍

先看下 Binder 相关的一个简单类图
以一个简单的 binder 应用示例来看 Android 中 binder 这一进程间通信机制,文件结构: ~/MyFolder/ans/packages/apps/bitest$ tree . . |-- Android.mk // 同时生成 libdxyhservice.so、dxyh_service、dxyh_client 的.mk |-- dxyhclient // 一可执行程序与 service 通信(当然也可是 java 通过 jni 来与服务通信) | `-- DxyhClient.cpp |-- dxyhservice // 服务程序(类似于 mediaserver 这一可执行程序) | |-- DxyhService.cpp | |-- DxyhService.h | `-- main_dxyhservice.cpp |-- include // 头文件 | `-- IDxyhService.h `-- libdxyhservice // 动态库 `-- IDxyhService.cpp 示例相关类图:
//! Flags for onIncStrongAttempted() enum { FIRST_INC_STRONG = 0x0001 }; virtual virtual virtual virtual void void bool void onFirstRef(); onLastStrongRef(const void* id); onIncStrongAttempted(uint32_t flags, const void* id); onLastWeakRef(const void* id);
//! DEBUGGING ONLY: Print references held on object. inline void printRefs() const { getWeakRefs()->printRefs(); } //! DEBUGGING ONLY: Enable tracking of object. inline void trackMe(bool enable, bool retain) { getWeakRefs()->trackMe(enable, retain); } // used to override the RefBase destruction. class Destroyer { friend class RefBase; public: virtual ~Destroyer(); private: virtual void destroy(RefBase const* base) = 0; }; // Make sure to never acquire a strong reference from this function. The // same restrictions than for destructors apply. void setDestroyer(Destroyer* destroyer); protected: RefBase(); virtual ~RefBase(); //! Flags for extendObjectLifetime() enum { OBJECT_LIFETIME_WEAK = 0x0001, OBJECT_LIFETIME_FOREVER = 0x0003 }; void extendObjectLifetime(int32_t mode);
[IT计算机]androidbinder机制
![[IT计算机]androidbinder机制](https://img.taocdn.com/s3/m/eb114ac0cf2f0066f5335a8102d276a20029607a.png)
Android进程间通信-Binder机制目录一.简要介绍和学习计划二.Service Manager成为Binder守护进程之路三.Server和Client获得Service Manager接口之路四.Server启动过程源代码分析五.Client获得Server远程接口过程源代码分析六.应用程序框架层的Java接口源代码分析一、Android进程间通信(IPC)机制Binder 简要介绍和学习计划我们知道,在Android系统中,每一个应用程序都是由一些Activity和Service组成的,一般Service 运行在独立的进程中,而 不同的Activity有可能运行在同一个进程中,也可能运行在不同的进程中。
这很自然地想到,不在同一个进程的Activity和Service是如何 通信的呢?毕竟它们要协作在一起来完成一个完整的应用程序功能。
这就是本文中要介绍的Android系统进程间通信机制Binder了。
我们知道,Android系统是基于Linux内核的,而Linux内核继承和兼容了丰富的Unix系统进程间通信(IPC)机制。
有传统的管道 (Pipe)、信号(Signal)和跟踪(Trace),这三项通信手段只能用于父进程与子进程之间,或者兄弟进程之间;后来又增加了命令管道 (Named Pipe),使得进程间通信不再局限于父子进程或者兄弟进程之间;为了更好地支持商业应用中的事务处理,在AT&T的Unix 系统V中,又增加了 三种称为“System V IPC”的进程间通信机制,分别是报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore);后来BSD Unix对“System V IPC”机制进行了重要的扩充,提供了一种称为插口(Socket)的进程间通信机制。
若想进一步详细了解这些进程间通信机制,建议参考Android学习启动篇一文中提到《Linux内核源代码情景分析》一书。
binder通信实例 -回复

binder通信实例-回复Binder通信实例在计算机科学领域中,Binder通信是Android操作系统中用于进程间通信的一种机制。
它允许不同应用程序之间共享数据和功能,以实现更强大的功能集成和交互体验。
本文将以Binder通信实例为主题,逐步介绍Binder通信的原理和应用。
首先,我们需要了解Binder通信的基本原理。
Binder是一种轻量级的进程间通信机制,通过它,可以在不同的进程间传输数据和调用远程方法。
Binder机制包含了三个核心组件:Binder驱动程序、Binder服务和Binder 代理。
Binder驱动程序是Binder通信的底层实现,它负责管理Binder通道的创建、销毁和数据传输。
在Android系统启动时,Binder驱动程序会加载并初始化。
它提供了两种类型的Binder通道:Binder本地通道和Binder 远程通道。
Binder服务是一个运行在后台的进程,它提供了需要共享的数据和方法。
Binder服务中的数据和方法可以通过Binder代理暴露给其他应用程序使用。
在Binder通信中,Binder服务相当于服务器端,负责接收和处理来自其他应用程序的请求。
Binder代理是运行在客户端的应用程序组件,它用于与Binder服务进行通信。
Binder代理可以通过Binder服务提供的接口实现数据传输和方法调用。
Binder代理相当于客户端,负责向Binder服务发起请求并接收相应的结果。
接下来,我们将通过一个示例来展示Binder通信的具体应用。
假设我们有两个应用程序:应用程序A和应用程序B。
应用程序A需要获取应用程序B中的某个数据,并对其进行处理。
首先,在应用程序B中创建一个Binder服务,用于管理需要共享的数据和方法。
在Binder服务中,我们定义一个接口,包含获取数据和处理数据的方法。
然后,将该接口暴露给其他应用程序使用。
接着,我们在应用程序A中创建一个Binder代理,用于与应用程序B的Binder服务进行通信。
使用aidl编写binder实例

使用aidl编写binder实例AIDL(Android Interface Definition Language)是一种用于在Android应用程序之间进行进程间通信(IPC)的接口定义语言。
通过AIDL,我们可以定义客户端和服务端之间通信的接口,并使用Binder来实现这些接口。
首先,我们需要创建一个AIDL文件来定义我们的接口。
假设我们要创建一个简单的服务,该服务具有一个add方法,用于将两个整数相加。
我们可以创建一个名为IAddService.aidl的文件,并在其中定义我们的接口,如下所示:// IAddService.aidl.interface IAddService {。
int add(int a, int b);}。
接下来,我们需要实现这个接口。
我们可以创建一个名为AddService.java的类,并在其中实现IAddService接口。
在这个类中,我们需要创建一个继承自IAddService.Stub的内部类,并实现add方法,如下所示:// AddService.java.public class AddService extends Service {。
private final IBinder mBinder = newIAddService.Stub() {。
@Override.public int add(int a, int b) {。
return a + b;}。
};@Override.public IBinder onBind(Intent intent) {。
return mBinder;}。
}。
在这个示例中,我们创建了一个AddService类,该类继承自Service,并实现了IAddService接口。
在onBind方法中,我们返回了实现了IAddService接口的mBinder对象。
最后,我们需要在AndroidManifest.xml文件中注册我们的服务。
Android Binder设计与实现 – 设计篇

Android Binder设计与实现–设计篇摘要Binder是Android系统进程间通信(IPC)方式之一。
Linux已经拥有管道、system V IPC、socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具有无可比拟的优势。
深入了解Binder并将之与传统 IPC做对比有助于我们深入领会进程间通信的实现和性能优化。
本文将对Binder的设计细节做一个全面的阐述,首先通过介绍Binder通信模型和Binder通信协议了解Binder的设计需求;然后分别阐述Binder在系统不同部分的表述方式和起的作用;最后还会解释Binder在数据接收端的设计考虑,包括线程池管理,内存映射和等待队列管理等。
通过本文对Binder的详细介绍以及与其它IPC通信方式的对比,读者将对Binder的优势和使用Binder 作为Android主要IPC方式的原因有深入了解。
1.引言基于Client-Server的通信方式广泛应用于从互联网和数据库访问到嵌入式手持设备内部通信等各个领域。
智能手机平台特别是Android 系统中,为了向应用开发者提供丰富多样的功能,这种通信方式更是无处不在,诸如媒体播放,视音频捕获,到各种让手机更智能的传感器(加速度、方位、温度、光亮度等)都由不同的Server负责管理,应用程序只需作为Client与这些Server建立连接便可以使用这些服务,花很少的时间和精力就能开发出令人眩目的功能。
Client-Server方式的广泛采用对进程间通信(IPC)机制是一个挑战。
目前linux 支持的IPC包括传统的管道、System V IPC、即消息队列/共享内存/信号量,以及socket中只有socket支持Client-Server的通信方式。
当然也可以在这些底层机制上架设一套协议来实现Client-Server通信,但这样增加了系统的复杂性,在手机这种条件复杂,资源稀缺的环境下可靠性也难以保证。
Androidnative进程间通信实例-binder篇之——简单的单工通信

Androidnative进程间通信实例-binder篇之——简单的单⼯通信⽹上找了很多binder相关⽂章,⼤部分都是在跟踪binder实现源代码,然后再把框架代码贴出来,看着实在费⼒。
这篇⽂章从实际出发,直接⽤⼀个案例下⼿,后续想了解binder相关原理的话,可以参考《深⼊理解Android》或者其它博客。
如果有疑问可以在下⽅评论,博主会根据⾃⼰的认知程度来回复的。
(⼩提⽰:要会使⽤binder通信,其实只需要了解binder通信有⼀个服务端和客户端,服务端创建特定字符串,然后客户端通过这个特定字符串找到服务端,进⾏客户端对服务端的通信。
)1. 代码共享话不多说直接贴上已经经过调试ok的代码,代码不过50⾏,看起来应该不那么费⼒吧!a. ⾸先是服务端Android.mk代码:LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)#需要编译的cpp⽂件LOCAL_SRC_FILES:= mybinderserver.cppLOCAL_C_INCLUDES := \external/skia/include/core \bionic \external/stlport/stlport#编译为可执⾏⽂件LOCAL_MODULE:= mybinderserverLOCAL_MODULE_TAGS := optional#添加依赖库⼀定要有libbinderLOCAL_SHARED_LIBRARIES := \libcutils \libutils \libbinder \libgui \libskia \libuiinclude $(BUILD_EXECUTABLE)b. 然后是服务端mybinderserver.cpp代码:#include <binder/IServiceManager.h>#include <binder/IPCThreadState.h>#include <binder/Parcel.h>#include <binder/IInterface.h>#include<stdio.h>#define LOG_TAG "binderserver"using namespace android;class MyBinderService : public BBinder{status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){printf("MyBinderService onTransact code = %d\n", code);if(code == 123){int readInt = 0;readInt = data.readInt32();printf("MyBinderService onTransact readInt = %d\n", readInt);reply->writeInt32(234);}printf("return NO_ERROR\n");return NO_ERROR;}};int main(int argc, char** argv){sp<IBinder> serverBinder = new MyBinderService();defaultServiceManager()->addService(String16("mybindertag"), serverBinder); printf("main addService \n");sp<ProcessState> proc(ProcessState::self());ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();printf("never return!!! \n");return 0;}c. 然后是客户端Android.mk:LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)#需要编译的cpp⽂件LOCAL_SRC_FILES:= mybinderclient.cppLOCAL_C_INCLUDES := \external/skia/include/core \bionic \external/stlport/stlport#编译为可执⾏⽂件LOCAL_MODULE:= mybinderclient#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES) LOCAL_MODULE_TAGS := optional#添加依赖库⼀定要有libbinderLOCAL_SHARED_LIBRARIES := \libcutils \libutils \libbinder \libgui \libskia \libuiinclude $(BUILD_EXECUTABLE)d. 最后是客户端mybinderclient.cpp代码:#include <binder/IServiceManager.h>#include <binder/IPCThreadState.h>#include <binder/Parcel.h>#include <binder/IInterface.h>#include<stdio.h>#define LOG_TAG "binderclient"using namespace android;int main(int argc, char** argv){sp<IServiceManager> sm = defaultServiceManager();sp<IBinder> binder = sm->checkService(String16("mybindertag"));if (binder == 0){printf("service is not found !\n");return 0;}else{sp<IBinder> binder = defaultServiceManager()->getService(String16("mybindertag"));}while(1){Parcel data, reply;int transCode = 0;int writeInt = 0;int replyInt = 0;printf("please input transCode : \n");scanf("%d", &transCode);getchar();if(123 == transCode){printf("please input int you need transfer: \n");scanf("%d", &writeInt);getchar();data.writeInt32(writeInt);}binder->transact(transCode, data, &reply);replyInt = reply.readInt32();printf("get reply data = %d\n", replyInt);}return 0;}e. 编译这两个⽂件,把可执⾏⽂件mybinderserver和mybinderclient通过adb push 推⼊到设备的/system/bin⽬录下,有的新⼿可能不了解怎么编译可执⾏⽂件,这⾥稍微科普⼀下操作⽅法,⽐如以mybinderserver为例吧,在 frameworks\base\cmds 创建相应的⽂件夹mybinderserver,把Android.mk和mybinderserver.cpp拷贝进去编译的时候1. 执⾏. build/envsetup.sh2. lunch 选择对应的版本3. mmm frameworks/base/cmds/mybinderserver/4. adb root5. adb remount6. adb push out/target/product/rk3368/system/bin/mybinderserver system/bin同理mybinderclient 也是这样操作。
android binder用法

android binder用法
Android Binder是Android系统中的一种进程间通信(IPC)机制,用于在不同的进程之间传递数据和进行方法调用。
以下是Android Binder的一些常见用法:
1. 远程服务:Android Binder可以用于创建远程服务,将服务运行在独立的进程中,其他应用可以通过Binder跨进程调用该服务提供的方法。
2. 跨进程通信:Android Binder可以在不同的进程之间传递数据,应用通过Binder将数据发送到目标进程,然后在目标进程中接收数据。
3. 远程回调:Android Binder可以用于实现远程回调,即将一个接口传递到另一个进程,并在另一个进程中调用该接口的方法,实现跨进程的事件回调。
4. 跨进程共享数据:Android Binder可以用于在不同的进程之间共享数据,应用可以通过Binder在一个进程中修改数据,在另一个进程中读取修改后的数据。
5. 系统服务:Android系统中的一些核心服务例如ActivityManagerService、WindowManagerService等都是通过Binder提供给其他应用调用的。
总之,Android Binder提供了一种方便的方式进行进程间通信和数据共享,可以满足不同应用之间的各种需求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个Binder例子
BpXXX、BnXXX同时实现一个接口IXXX。
BpXXX主要是用来处理java层传下来的服务请求,然后通过transact将处理请求传给BnXXX(通过binder)。
BpINTERFACE是client 端的代理接口,BnINTERFACE是server端的代理接口。
首先,定义IXXX接口:
class ITestDaemon : public IInterface, public IBinder::DeathRecipient {
virtual void init();
virtual void testFunc();
}
BpBinder(Binder Proxy):主要功能是负责client向Bn发送调用请求的数据。
它是client端binder通信的核心对象,通过调用transact函数,client就可以向Bn发送调用请求和数据。
class BpTestDaemon : public BpInterface<ITestDaemon> {
void init() {
Parcel data, reply;
data.writeInterfaceToken(descr iptor);
remote()->transact(init, data, &reply);
}
void testFunc() {
Parcel data, reply;
data.writeInterfaceToken(descriptor);
remote()->transact(testFunc, data, &reply);
}
}
BnBinder(Binder Native):BnBinder就是具体干事情的对象。
.H声明
class BnTestDaemon: public BnInterface<ITestDaemon> {
public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);
//由于IXXX是个纯虚类,而BnXXX只实现了onTransact函数,所以BnXXX依然是一个纯虚类};
.cpp实现:
status_t BnTestDaemon::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
switch (code) {
case init: {
CHECK_INTERFACE(ITestDaemon, data, reply);
init(); //调用虚函数
return NO_RROR;
}
case testFunc: {
CHECK_INTERFACE(ITestDaemon, data, reply);
testFunc(); //调用虚函数
return NO_ERROR;
}
}
写Service,实现接口的虚函数
.H
class TestDaemonProxy : public BnTestDaemon {
public:
static TestDaemonProxy* getInstance() {
if (sInstance == NULL) {
sInstance = new TestDaemonProxy();
}
return sInstance;
}
// These reflect binder methods.
virtual void init();
virtual void testFunc();
};
.cpp:
void TestDaemonProxy::init() {
.... //具体实现
}
void TestDaemonProxy::testFunc() {
.... //具体实现
}
主函数中,获得ServiceManager,添加Service。
int main()
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
sm->addService(“”,new TestDaemonProxy());
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
binder通信是一种client-server的通信结构
1.从表面上来看,是client通过获得一个server的代理接口,对server进行直接调用;
2.实际上,代理接口中定义的方法与server中定义的方法是一一对应的;
3.client调用某个代理接口中的方法时,代理接口的方法会将client传递的参数打包成为Parcel对象;
4.代理接口将该Parcel发送给内核中的binder driver.
5.server会读取binder driver中的请求数据,如果是发送给自己的,解包Parcel对象,处理并将结果返回;
6.整个的调用过程是一个同步过程,在server处理的时候,client会block住。
系统AudioFlinger服务的Binder框架,供参考:。