Android Binder - service proxy
来源:互联网 发布:淘宝站外推广有哪些 编辑:程序博客网 时间:2024/05/21 12:14
Service Manager)我们学习了Service Manager(服务管家)在Android Binder中的作用——服务(Service)注册,服务(Service)查询和获取等功能。
(一)服务代理应用模型
(1)首先客户端向Service manager查找相应的Service。这在前一篇文中有比较详细的介绍,这里不做赘述。
(2)Android系统的binder机制将会为客户端进程中创建一个Service代理,这个创建过程是本文的重点,下面会详细介绍。
(3)客户端视角只有Service代理,他所有对Service的请求都发往Service代理,然后由Service代理把用户请求转发给Service本身。
(4)Service处理完成之后,把结果返回给Service代理,Service代理负责把处理结果返回给客户端。
(二)MediaService
framework\base\Media\MediaServer\Main_mediaserver.cpp
int main(int argc, char** argv)
{
sp proc(ProcessState::self());
sp sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
(1)ProcessState
private:
ProcessState();
sp ProcessState::self()
{
if (gProcess != NULL) return gProcess;//如果已经创建了,//则直接返回这个全局的ProcessState对象
AutoMutex _l(gProcessMutex);
//如果第一次创建,调用其构造函数
if (gProcess == NULL) gProcess = new ProcessState;
return gProcess;
}
还记得Main函数中的第一句:
sp proc(ProcessState::self());
ProcessState::ProcessState()定义如下:
ProcessState::ProcessState()
: mDriverFD(open_driver())
, mVMStart(MAP_FAILED)
, mManagesContexts(false)
, mBinderContextCheckFunc(NULL)
, mBinderContextUserData(NULL)
, mThreadPoolStarted(false)
, mThreadPoolSeq(1)
{
……
mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);//映射内存
……
}
这里ProcessState对象打开了/dev/binder设备,并保留了文件描述符,那么打开设备文件,自然是要用它进行通讯了,不过在ProcessState中你还真的很难找到,使用这个文件描述符进行通讯的代码。那么它在什么地方使用呢?我们会在后面介绍IPCThreadState时候在有说明。
(2)defaultServiceManager()
……
sp sm = defaultServiceManager();
Frameworks\base\libs\binder\IserviceManager.cpp
p defaultServiceManager()
{
if (gDefaultServiceManager != NULL)
return gDefaultServiceManager;//如果已经创建过,//直接返回
{
AutoMutex _l(gDefaultServiceManagerLo ck);
if (gDefaultServiceManager == NULL) {
gDefaultServiceManager = interface_cast(ProcessState::self()->getContextObject(NULL)); //创建代理对象
}
}
return gDefaultServiceManager;
}
这个函数中调用了下面的语句:
gDefaultServiceManager = interface_cast(ProcessState::self()->getContextObject(NULL));
sp ProcessState::getContextObject(const sp& caller)
{
if (supportsProcesses()) {
return getStrongProxyForHandle(0);
} else {
return getContextObject(String16("default"), caller);
}
}
sp ProcessState::getStrongProxyForHandle(int32_t handle)
{
sp result;
AutoMutex _l(mLock);
handle_entry* e = lookupHandleLocked(handle);
if (e != NULL) {
IBinder* b = e->binder;
if (b == NULL || !e->refs->attemptIncWeak(this)) {
b = new BpBinder(handle);
e->binder = b;
if (b) e->refs = b->getWeakRefs();//增加引用计数
result = b;
} else {
result.force_set(b);
e->refs->decWeak(this);
}
}
return result;
}
BpBinder::BpBinder(int32_t handle)
: mHandle(handle)
, mAlive(1)
, mObitsSent(0)
, mObituaries(NULL)
{
LOGV("Creating BpBinder %p handle %d\n", this, mHandle);
extendObjectLifetime(OBJECT_LIFETIME_WEAK);
IPCThreadState::self()->incWeakHandle(handle);
}
Framework\base\include\binder\Iiterface.h
template
inline sp interface_cast(const sp& obj)
{
return INTERFACE::asInterface(obj);
}
template
inline sp< IserviceManager > interface_cast(const sp& obj)
{
return IserviceManager::asInterface(obj);
}
Framework\base\include\binder\IserviceManager.h
class IServiceManager : public IInterface
{
public:
DECLARE_META_INTERFACE(ServiceManager);
……
virtual status_t addService( const String16& name,
const sp& service) = 0;
……
};
Framework\base\include\binder\Iiterface.h
#define DECLARE_META_INTERFACE(INTERFACE)\
static const String16 descriptor; \
static sp asInterface(const sp& obj); \
virtual const String16& getInterfaceDescriptor() const; \
I##INTERFACE(); \
virtual ~I##INTERFACE(); \
#define DECLARE_META_INTERFACE(serviceManager)
{
static const String16 descriptor;
static sp asInterface(const sp& obj);
virtual const String16& getInterfaceDescriptor() const;
IserviceManager();
virtual ~IserviceManager();
}
IMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager");
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)\
const String16 I##INTERFACE::descriptor(NAME); \
const String16& I##INTERFACE::getInterfaceDescriptor() const { \
return I##INTERFACE::descriptor; \
} \
sp I##INTERFACE::asInterface(const sp& obj) \
{ \
sp intr; \
if (obj != NULL) { \
intr = static_cast( \
obj->queryLocalInterface( \
I##INTERFACE::descriptor).get()); \
if (intr == NULL) { \
intr = new Bp##INTERFACE(obj); \
} \
} \
return intr; \
} \
I##INTERFACE::I##INTERFACE() { } \
I##INTERFACE::~I##INTERFACE() { }
#define IMPLEMENT_META_INTERFACE(serviceManager, "android.os.IServiceManager")
const String16 IserviceManager::descriptor("android.os.IServiceManager");
const String16& IserviceManager::getInterfaceDescriptor() const {
return IserviceManager::descriptor;
}
sp IserviceManager::asInterface(const sp& obj)
{
sp intr;
if (obj != NULL) {
intr = static_cast(
obj->queryLocalInterface(IserviceManager::descriptor).get());
if (intr == NULL) {
intr = new BpserviceManager (obj);
}
}
return intr;
}
I##INTERFACE::IserviceManager () { }
I##INTERFACE::~IserviceManager () { }
(三)服务器端初始化
framework\base\Media\MediaServer\Main_mediaserver.cpp
int main(int argc, char** argv)
{
……
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
……
}
Framework\base\camera\libcameraservice\cameraservice.cpp
void CameraService::instantiate() {
defaultServiceManager()->addService(
String16("media.camera"), new CameraService());
}
(四)ThreadState:: startThreadPool()
Void Main()
{
……
……
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
(1)创建了ProcessState对象,用来管理本进程中获取的服务代理对象。注意:每一个进程只能创建一个该对象。
(2) 获取了Service Manager的服务代理对象,可以通过这个对象和服务管家通讯了。
(3)实例化了一些服务,并向服务管家成功添加了这些服务。
void ProcessState::startThreadPool()
{
AutoMutex _l(mLock);
if (!mThreadPoolStarted) {
mThreadPoolStarted = true;
spawnPooledThread(true);
}
}
void ProcessState::spawnPooledThread(bool isMain)
{
if (mThreadPoolStarted) {
……
sp t = new PoolThread(isMain);
//创建线程池,然后跑起来
t->run(buf);
}
}
status_t Thread::run(const char* name, int32_t priority, size_t stack)
{
……
if (mCanCallJava) {
res = createThreadEtc(_threadLoop,
this, name, priority, stack, &mThread);
//这里创建了一个_threadLoop线程函数,这时候线程运行起来
} else {
res = androidCreateRawThreadEt c(_threadLoop,
this, name, priority, stack, &mThread);
}
……
}
int Thread::_threadLoop(void* user)
{
Thread* const self = static_cast(user);
do {
if (first) {
first = false;
self->mStatus = self->readyToRun();
……
} else {
result = self->threadLoop();//调用PoolThread的threadLoop()
}
……
} while(strong != 0);
return 0;
}
Framework\base\libs\binder\ProcessThread.cpp
virtual bool threadLoop()
{
IPCThreadState::self()->joinThreadPool(mIsMain);
return false;
}
(五)IPCThreadState
status_t IPCThreadState::transact(int32_t handle,
uint32_t code, const Parcel& data,
Parcel* reply, uint32_t flags)
{
……
if ((flags & TF_ONE_WAY) == 0) {
if (reply) {
err = waitForResponse(reply);
} else {
Parcel fakeReply;
err = waitForResponse(&fakeReply);
}
} else {
err = waitForResponse(NULL, NULL);
}
return err;
}
status_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult)
{
int32_t cmd;
int32_t err;
while (1) {
if ((err=talkWithDriver()) < NO_ERROR) break;
err = mIn.errorCheck();
cmd = mIn.readInt32();
switch (cmd) {
case BR_TRANSACTION_COMPLETE:
if (!reply && !acquireResult) goto finish;
break;
……
}
return err;
}
status_t IPCThreadState::talkWithDriver(bool doReceive)
{
……
do {
if (ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) >= 0)
……
} while (err == -EINTR);
……
}
(1)维护当前进程中所有对/dev/binder的读写。换句话说当前进程通过binder机制进行跨进程调用都是通过IPCThreadState对象来完成的。
(2)IPCThreadState也可以理解成/dev/binder设备的封装,用户可以不直接通过ioctl来操作binder设备,都通过IPCThreadState对象来代理即可。
private:
friend class IPCThreadState;
void IPCThreadState::joinThreadPool(bool isMain)
{
androidSetThreadScheduli ngGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT);
status_t result;
do {
int32_t cmd;
result = talkWithDriver();
result = executeCommand(cmd);
}
} while (result != -ECONNREFUSED && result != -EBADF);
mOut.writeInt32(BC_EXIT_LOOPER);
talkWithDriver(false);
}
(六)总结
- Android Binder - service proxy
- Android Binder(二)——Service Proxy Object
- android binder proxy
- android binder 中的proxy 模式
- 【android】binder机制-service
- Android Binder - Service Manager
- android service 之 Binder
- Android Service : Binder原理
- Android service:Binder
- android service 实现Binder类
- Android Media Service Binder Machine
- 图解Android - Binder 和 Service
- Android创建Native Binder Service
- 图解Android - Binder 和 Service
- android service binder 和AIDL
- 图解Android - Binder 和 Service
- Android 远程 service 和 Binder
- android service 的简单实例 binder service
- android:布局参数,控件属性及各种xml的作用
- 生日是第几天
- 题目1163:素数
- 跟我一起写MakeFile
- 一些道理
- Android Binder - service proxy
- 如果一切需要重学,2014年应该学哪些技术?
- eCos与uC/OS-II内核实现的比较
- 澄海玩具凭借研发实力走向全球
- 环形缓冲区(ring buffer),环形队列(ring queue) 原理
- c语言实现面向对象编程
- undo表空间管理测试2-----修改参数文件initORCL.ora配置,查看undo状态
- nginx整合fastdfs(转载)
- 田新:市场是研发的原动力