IBinder和BpBinder
引言
总结以往的学习内容,对于ServiceManager,如果想使用服务,首先导入ServiceManagerProxy,到上层则为ServiceManager.java和servicemanagernative
创建ServiceManagerProxy时,我们传递了IBinder对象,并使用其transact方法与Binder驱动程序进行了通信。
其次,分析IBinder的实现原理
IBinder
IBinder接口必须有与Binder一致的接口方法,即实现命令的方法
publicbooleantransact(intcode、Parcel data、Parcel reply、int flags )。
throws远程执行;
要检索IBinder对象,需要一个新类来检索名为BinderInternal的对象。 获取方法如下。
publicstaticfinalnativeibindergetcontextobject (;
很明显,这里也会继续调用朴素方法。 因为最终需要与Binder驱动程序相关联。
(staticjobjectandroid _ OS _ binder internal _ getcontextobject (JNI env * env,jobject clazz ) ) ) ) ) ) ) )
{
SPB=处理状态:3360 self (-getcontextobject (null ) );
returnjavaobjectforibinder(env,b );
}
可以看到,它利用了调用getContextObject方法并最终返回BpBinder对象的ProcessState
Bp绑定器
IBinder只是接口类,在朴素层由BpBInder继承,在java层由Binder.java中的BinderProxy实现。
执行命令时,必须用JNI转换命令。 首先,它从Java层Binder中的BinderProxy开始,用于JNI。
Ibinder*target=(Ibinder* ) env-getlongfield(obj,gBinderProxyOffsets.mObject );
使用getLongField获取BpBinder的内存地址,并继续调用BpBinder的处理请求函数。
satus _ TBP binder :3360 transact (
uint 32 _ t代码,const Parcel data,Parcel* reply,uint32_t flags )
{
//Once a binder has died,it will never come back to life。
if(malive ) {
status _ tstatus=ipcthreadstate :3360 self (-transact (
mHandle、code、data、reply和flags;
if(status==dead_object ) mAlive=0;
返回状态;
}
return DEAD_OBJECT;
}
可以看出,在该函数中仍然使用IPCThreadState进行Binder驱动的通信。