Android14之BpBinder构造函数Handle拆解(二百零四)

news2025/2/24 11:13:25

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质专栏:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:在阅读Android14源码,BpBinder代码时,发现它的构造函数特别有意思,随分享之。

2.BPBinder介绍

  • BPBinder是Android系统中Binder机制的一部分,负责在客户端和服务器之间进行进程间通信(Inter-Process Communication,IPC)。Binder机制是Android系统中实现跨进程通信的核心机制,它允许一个进程(客户端)调用另一个进程(服务器)中的方法,就像调用本地方法一样简单。
  • BPBinder是Binder代理对象,它存在于客户端进程中。当客户端进程想要与服务器进程通信时,它会创建一个BPBinder对象,并通过这个对象发送请求给服务器进程。BPBinder内部会通过Binder驱动程序与服务器进程中的BBinder对象进行通信,从而完成客户端和服务器之间的通信。
  • BPBinder的主要作用是封装客户端的请求,并将这些请求发送给服务器进程。它会将客户端的请求转化为一个IPC消息,然后将这个消息发送给Binder驱动程序。Binder驱动程序会将这个消息传递给服务器进程中的BBinder对象,由BBinder对象来处理这个请求,并将处理结果返回给客户端。
  • BPBinder的实现主要涉及到以下几个类:
  1. IBinder:这是一个接口,定义了Binder对象的基本操作,如transact()和linkToDeath()等。BPBinder和BBinder都实现了这个接口。
  2. BBinder:这是Binder实体对象,存在于服务器进程中。它负责处理客户端发送的请求,并将处理结果返回给客户端。
  3. BpBinder:这是Binder代理对象,存在于客户端进程中。它负责将客户端的请求发送给服务器进程,并将服务器进程的返回结果返回给客户端。
  4. 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 {
        sp<RpcSession> session;
        uint64_t address;
    };

using Handle = std::variant<BinderHandle, RpcHandle>;
  • 这里使用了C++17标准库提供的模板类,它表示一种可以容纳多种不同类型的值的类型安全的联合体(Union)。
  • 然后给std::variant<BinderHandle, RpcHandle>起了个别名,叫Handle,但是我们可以从别名Handle中取得联合体中的BinderHandle和RpcHandle两个结构体。

<3>.Bpbidner用Handle之前,需要判断下

bool BpBinder::isRpcBinder() const {
    return std::holds_alternative<RpcHandle>(mHandle);
}
  • 这里使用检查 std::holds_alternative模板类,判断mHandle是否包含 BinderHandle 类型,如果包含返回true;
  • 如果不包含则返回false。

<4>.判断完了mHandle,看看到底怎么用?

uint64_t BpBinder::rpcAddress() const {
    return std::get<RpcHandle>(mHandle).address;
}
  • 这里直接调用std::get(mHandle).address,可以分为两个步骤:
  • 第一:先通过std::get(mHandle)获取联合体mHandle中的RpcHandle结构体对象。
  • 第二:调用RpcHandle结构体的address变量。

<5>.再看俩例子

const sp<RpcSession>& BpBinder::rpcSession() const {
    return std::get<RpcHandle>(mHandle).session;
}

int32_t BpBinder::binderHandle() const {
    return std::get<BinderHandle>(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::variant<BinderHandle, RpcHandle>;

int main() {
  // v1.0 使用 BinderHandle
  Handle handle1 = BinderHandle(123);
  BinderHandle binder = std::get<BinderHandle>(handle1); // 提取 handle1 中的 BinderHandle 类型值
  std::cout << "BinderHandle with id: " << binder.handle << std::endl;


  // v2.0 使用RpcHandle
  Handle handle2 = RpcHandle("Hello Handle."); // 创建一个 Handle 变量,并用 RpcHandle 初始化
  RpcHandle rpc = std::get<RpcHandle>(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::variant<BinderHandle, RpcHandle>;

int main() {
  // v1.0 使用 BinderHandle
  Handle handle1 = BinderHandle(123);
  if (std::holds_alternative<BinderHandle>(handle1)) { // 检查 handle1 是否包含 BinderHandle 类型的值
    BinderHandle binder = std::get<BinderHandle>(handle1); // 提取 handle1 中的 BinderHandle 类型值
    std::cout << "BinderHandle with id: " << binder.handle << std::endl;
  }

  // v2.0 使用RpcHandle
  Handle handle2 = RpcHandle("Hello Handle."); // 创建一个 Handle 变量,并用 RpcHandle 初始化
  if (std::holds_alternative<RpcHandle>(handle2)) { // 检查 handle1 是否包含 RpcHandle 类型的值
    RpcHandle rpc = std::get<RpcHandle>(handle2); // 提取 handle2 中的 RpcHandle 类型值
    std::cout << "RpcHandle with id: " << rpc.address << std::endl;
  }

  return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1564801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python文件处理:解析docx/word文件文字、图片、复选框

前言 因为一些项目原因&#xff0c;我需要提供解析docx内容功能。本来以为这是一件比较简单的工作&#xff0c;没想到在解析复选框选项上吃了亏&#xff0c;并且较长一段时间内通过各种渠道都没有真正解决这一问题&#xff0c;反而绕了远路。 终于&#xff0c;我在github pytho…

Kafka架构概述

Kafka的体系结构 Kafka是由Apache软件基金会管理的一个开源的分布式数据流处理平台。Kafka具有支持消息的发布/订阅模式、高吞吐量与低延迟、持久化、支持水平扩展、高可用性等特点。可以将Kafka应用于大数据实时处理、高性能数据管道、流分析、数据集成和关键任务应用等场景。…

测开——基础理论面试题整理

1. 测试流程 需求了解分析需求评审制定测试计划【包括测试人员、时间、每人负责的模块、测试的风险项以及预防】编写自动化测试用例 —— 测试评审【尽量丰富测试点】编写测试框架和脚本&#xff08;若是功能测试 可省去这步骤&#xff09;执行测试提交缺陷报告测试分析与评审…

BIM转Power BI数据集

在本博客中&#xff0c;我们将了解如何使用从 SSAS 表格、Power BI Desktop 或 Power BI 服务数据集中提取的 Model.bim 文件在本地或 PBI 服务上生成新数据集。 1、设置&#xff08;SSAS 表格和 PBI 服务通用&#xff09; 我建议你创建一个专门用于此任务的新 Python 环境&a…

docker部署DOS游戏

下载镜像 docker pull registry.cn-beijing.aliyuncs.com/wuxingge123/dosgame-web-docker:latestdocker-compose部署 vim docker-compose.yml version: 3 services:dosgame:container_name: dosgameimage: registry.cn-beijing.aliyuncs.com/wuxingge123/dosgame-web-docke…

微软云学习环境

微软公有云 - Microsoft Azure 本文介绍通过微软学习中心Microsoft Learn来免费试用Azure上的服务&#xff0c;也不需要绑定信用卡。不过每天只有几个小时的时间。 官网 https://docs.microsoft.com/zh-cn/learn/ 实践 比如创建虚拟机&#xff0c;看到自己的账号下多了Learn的…

常量分类、常量优化

常量分类 常量&#xff0c;程序运行期间&#xff0c;不发生改变的量 整型常量&#xff1a;100&#xff0c;200&#xff0c;-300等浮点型常量&#xff1a;100.0&#xff0c;-3.14&#xff0c;0.0等布尔常量&#xff1a;只有true、false两个取值字符常量&#xff1a;英文单引号…

linux设置Nacos自启动

前提&#xff1a;已经安装好nacos应用 可参考&#xff1a;Nacos单机版安装-CSDN博客 1. 创建nacos.service 1.1 在 /lib/systemd/system 目录底下&#xff0c;新建nacos.service文件 [Unit] Descriptionnacos Afternetwork.target[Service]Typeforking# 单机启动方式&#…

javascript常见的事件属性

焦点事件 focus/blur <input type"text" /><script>const input document.querySelector("input")// 绑定焦点事件input.addEventListener("focus" ,function(){console.log("有焦点触发")})// 失去焦点事件input.addEve…

RIP协议(路由信息协议)

一、RIP协议概述 RIP协议&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的内部网关协议&#xff0c;即根据跳数来度量路由开销&#xff0c;进行路由选择。 相比于其它路由协议&#xff08;如OSPF、ISIS等&#xff09;&#…

SpringBoot(48)-使用 SkyWalking 进行分布式链路追踪

Spring Boot&#xff08;48&#xff09;- 使用 SkyWalking 进行分布式链路追踪 介绍 在分布式系统中&#xff0c;了解各个服务之间的调用关系和性能表现是非常重要的。SkyWalking 是一款开源的分布式系统监控与分析平台&#xff0c;能够帮助我们实现分布式系统的链路追踪、性…

24/04/02总结

API: bigdecima: 方法名 说明 public static BigDecimal valueof( double val) 静态获取对象 public BigDecimal add(BigDecimal val) 加法 public BigDecimal subtract(BigDecimal val…

从C到C++过渡知识 下(深入理解引用与指针的关系)

引用 引用时C引入的一个新的概念&#xff0c;他和指针有着千丝万缕的关系。 首先我们要了解的是引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。语法格式如下…

hibernate session接口

hibernate session接口 Session接口是hibernate向应用程序提供的操纵数据库的最主要的接口&#xff0c;提供了保存、更新、删除和加载Java对象的方法。 session具有一个缓存&#xff0c;位于缓存中的对象成为持久化对象&#xff0c;和数据库中的相关记录对应。session能够在某些…

智能视频翻译和配音处理工具:Pyvideotrans

pyVideoTrans&#xff1a;一键字幕识别翻译配音带新语言字幕和配音的视频 - 精选真开源&#xff0c;释放新价值。 概览 Pyvideotrans是一款卓著的智能化视频处理系统&#xff0c;专精于视频翻译与配音艺术&#xff0c;以其卓越的技术实力实现对原始视频中音频信息的精准捕捉、…

CCIE-03-Layer2-LAN-TS

目录 实验条件网络拓朴实验目标 开始排错问题1. SW2上的DHCP中继没有配置正确问题2. SW1/SW2的SVI接口被关闭问题3. 安全端口配置了不同的MAC地址 实验条件 网络拓朴 Output1 Output2 实验目标 排除故障使得PC101访问Server1时符合图片中给出的Output 开始排错 根据要求…

并发编程01-深入理解Java并发/线程等待/通知机制

为什么我们要学习并发编程&#xff1f; 最直白的原因&#xff0c;因为面试需要&#xff0c;我们来看看美团和阿里对 Java 岗位的 JD&#xff1a; 从上面两大互联网公司的招聘需求可以看到&#xff0c; 大厂的 Java 岗的并发编程能力属于标配。 而在非大厂的公司&#xff0c; 并…

基于栈结构的非递归二叉树结点关键字输出算法

基于栈结构的非递归二叉树结点关键字输出算法 一、引言二、二叉树基本概念三、非递归遍历算法基础四、算法设计五、算法实现六、C代码示例七、算法分析八、优化与讨论 一、引言 在计算机科学中&#xff0c;二叉树是一种重要的数据结构&#xff0c;它广泛应用于各种算法和数据结…

笔记: javaSE day17天笔记

第十七天课堂笔记 Java常用类 数学类★★★ math java.lang.Math , 数学类 round(x) : 四舍五入 , 把 x加0.5 后向下取整 ceil(x) : 返回大于等于x的最小整数 , 向上取整 floor(x) : 返回小于等于x的最大整数 , 向下取整 sqrt(x) : 平方根 cbrt(x): 立方根 pow(a , b)…

App应用的服务器如何增加高并发能力

大家好&#xff01;我是你们的好朋友咕噜铁蛋&#xff01;近年来&#xff0c;随着移动互联网的蓬勃发展&#xff0c;各类App应用如雨后春笋般涌现&#xff0c;用户量呈现爆发式增长。然而&#xff0c;随之而来的高并发访问问题也开始频繁出现&#xff0c;给服务器带来了极大的挑…