联通网站备案系统网站策划建设方案书
联通网站备案系统,网站策划建设方案书,移动互联网开发实习报告,中国建设银行公积金网站首页简介#xff1a; CSDN博客专家#xff0c;专注Android/Linux系统#xff0c;分享多mic语音方案、音视频、编解码等技术#xff0c;与大家一起成长#xff01; 优质专栏#xff1a;Audio工程师进阶系列【原创干货持续更新中……】#x1f680; 优质专栏#xff1a;多媒… 简介 CSDN博客专家专注Android/Linux系统分享多mic语音方案、音视频、编解码等技术与大家一起成长 优质专栏Audio工程师进阶系列【原创干货持续更新中……】 优质专栏多媒体系统工程师系列【原创干货持续更新中……】 优质专栏AAOS车载系统AOSP14系统攻城狮入门实战课【原创干货持续更新中……】 人生格言 人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注Android系统攻城狮 1.前言 本篇目的在阅读Android14源码BpBinder代码时发现它的构造函数特别有意思随分享之。 2.BPBinder介绍
BPBinder是Android系统中Binder机制的一部分负责在客户端和服务器之间进行进程间通信Inter-Process CommunicationIPC。Binder机制是Android系统中实现跨进程通信的核心机制它允许一个进程客户端调用另一个进程服务器中的方法就像调用本地方法一样简单。BPBinder是Binder代理对象它存在于客户端进程中。当客户端进程想要与服务器进程通信时它会创建一个BPBinder对象并通过这个对象发送请求给服务器进程。BPBinder内部会通过Binder驱动程序与服务器进程中的BBinder对象进行通信从而完成客户端和服务器之间的通信。BPBinder的主要作用是封装客户端的请求并将这些请求发送给服务器进程。它会将客户端的请求转化为一个IPC消息然后将这个消息发送给Binder驱动程序。Binder驱动程序会将这个消息传递给服务器进程中的BBinder对象由BBinder对象来处理这个请求并将处理结果返回给客户端。BPBinder的实现主要涉及到以下几个类
IBinder这是一个接口定义了Binder对象的基本操作如transact()和linkToDeath()等。BPBinder和BBinder都实现了这个接口。BBinder这是Binder实体对象存在于服务器进程中。它负责处理客户端发送的请求并将处理结果返回给客户端。BpBinder这是Binder代理对象存在于客户端进程中。它负责将客户端的请求发送给服务器进程并将服务器进程的返回结果返回给客户端。Parcel这是一个数据容器用于在客户端和服务器之间传递数据。客户端将请求数据写入Parcel对象然后将这个对象发送给服务器。服务器处理完请求后将结果写入Parcel对象然后将这个对象返回给客户端。
BPBinder的使用非常简单客户端只需要创建一个BPBinder对象然后调用它的transact()方法即可发送请求给服务器。transact()方法有两个参数第一个参数是请求码用于标识请求的类型第二个参数是请求数据通常是一个Parcel对象。服务器进程中的BBinder对象会根据请求码和请求数据进行处理并将处理结果写入一个Parcel对象中返回给客户端。总之BPBinder是Android系统中Binder机制的重要组成部分它实现了客户端和服务器之间的进程间通信。通过BPBinder客户端可以像调用本地方法一样调用服务器进程中的方法从而实现跨进程通信。
3.BpBinder构造函数拆解
1.先看BpBinder::BpBinder构造函数的参数
BpBinder::BpBinder(Handle handle): mStability(0),mHandle(handle),mAlive(true),mObitsSent(false),mObituaries(nullptr),mDescriptorCache(kDescriptorUninit),mTrackedUid(-1) {extendObjectLifetime(OBJECT_LIFETIME_WEAK);
}BpBinder构造函数只有一个参数然后初始化列表给了mHandle。
2.再看Handle类型
struct BinderHandle {int32_t handle;};struct RpcHandle {spRpcSession session;uint64_t address;};using Handle std::variantBinderHandle, RpcHandle;这里使用了C17标准库提供的模板类它表示一种可以容纳多种不同类型的值的类型安全的联合体Union。然后给std::variantBinderHandle, RpcHandle起了个别名叫Handle但是我们可以从别名Handle中取得联合体中的BinderHandle和RpcHandle两个结构体。
3.Bpbidner用Handle之前需要判断下
bool BpBinder::isRpcBinder() const {return std::holds_alternativeRpcHandle(mHandle);
}这里使用检查 std::holds_alternative模板类判断mHandle是否包含 BinderHandle 类型如果包含返回true如果不包含则返回false。
4.判断完了mHandle看看到底怎么用
uint64_t BpBinder::rpcAddress() const {return std::getRpcHandle(mHandle).address;
}这里直接调用std::get(mHandle).address可以分为两个步骤第一先通过std::get(mHandle)获取联合体mHandle中的RpcHandle结构体对象。第二调用RpcHandle结构体的address变量。
5.再看俩例子
const spRpcSession BpBinder::rpcSession() const {return std::getRpcHandle(mHandle).session;
}int32_t BpBinder::binderHandle() const {return std::getBinderHandle(mHandle).handle;
}和在第四步用法一样没啥说的。
3.仿BpBinder构造函数用法实例
v1.0
#include iostream
#include variant
#include string
using namespace std;struct BinderHandle {BinderHandle(int han) : handle(han){}int32_t handle;
};
struct RpcHandle {RpcHandle(string han) : address(han){}string address;
};// 定义 Handle 类型别名表示可以是 BinderHandle 或 RpcHandle 类型的变量
using Handle std::variantBinderHandle, RpcHandle;int main() {// v1.0 使用 BinderHandleHandle handle1 BinderHandle(123);BinderHandle binder std::getBinderHandle(handle1); // 提取 handle1 中的 BinderHandle 类型值std::cout BinderHandle with id: binder.handle std::endl;// v2.0 使用RpcHandleHandle handle2 RpcHandle(Hello Handle.); // 创建一个 Handle 变量并用 RpcHandle 初始化RpcHandle rpc std::getRpcHandle(handle2); // 提取 handle2 中的 RpcHandle 类型值std::cout RpcHandle with id: rpc.address std::endl;return 0;
}
v2.0
#include iostream
#include variant
#include string
using namespace std;struct BinderHandle {BinderHandle(int han) : handle(han){}int32_t handle;
};
struct RpcHandle {RpcHandle(string han) : address(han){}string address;
};// 定义 Handle 类型别名表示可以是 BinderHandle 或 RpcHandle 类型的变量
using Handle std::variantBinderHandle, RpcHandle;int main() {// v1.0 使用 BinderHandleHandle handle1 BinderHandle(123);if (std::holds_alternativeBinderHandle(handle1)) { // 检查 handle1 是否包含 BinderHandle 类型的值BinderHandle binder std::getBinderHandle(handle1); // 提取 handle1 中的 BinderHandle 类型值std::cout BinderHandle with id: binder.handle std::endl;}// v2.0 使用RpcHandleHandle handle2 RpcHandle(Hello Handle.); // 创建一个 Handle 变量并用 RpcHandle 初始化if (std::holds_alternativeRpcHandle(handle2)) { // 检查 handle1 是否包含 RpcHandle 类型的值RpcHandle rpc std::getRpcHandle(handle2); // 提取 handle2 中的 RpcHandle 类型值std::cout RpcHandle with id: rpc.address std::endl;}return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89673.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!