转发 Binder 请求

以添加请求到 ServiceManager 为例

public void addService(String name, IBinder service, boolen allowIsolated){
    Parcel data = Parcel.obtain();
    Parcel reply = Parcel.obtain();
    data.writeInterfaceToken(IServiceManager.descriptor);
    data.writeString(name);
    data.writeStrongBinder(service);
    data.writeInt(allowIsolated ? 1 : 0);
    mRemote.transact(ADD_SERVICE_TRANSACTION, data, reply, 0);
    reply.recycle();
    data.recycle();
}
//IBinder.java
int FIRST_CALL_TRANSACTION  = 0x00000001;
//IServiceManager.java
int ADD_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;




//.../frameworks//native/libs/binder/BpBinder.cpp
status_t BpBinder::transact(uint32_code, const Parcel& data, Parcel& data, Parcel* reply, unit32_t flags){
    //IPCThreadState 是线程单例,
    //本例中mHandle是0,code 是 3,data 是 java 层封装好的参数,reply 是准备回复给 java 层的,flags 为0
    status_t status = IPCThreadState::self()0>transact(mHandle, code, data, reply, flags);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容