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

简介: 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解人工智能(概念、发展、机遇与挑战)

前言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门新兴的技术科学&#xff0c;是指通过模拟、延伸和扩展人类智能的理论、方法、技术和应用系统&#xff0c;以实现对人类认知、决策、规划、学习、交流、创造等智能行为的模拟、延伸和扩展…

Linux 线程互斥、互斥量、可重入与线程安全

目录 一、线程互斥 1、回顾相关概念 2、抢票场景分析代码 多个线程同时操作全局变量 产生原因 如何解决 二、互斥量 1、概念 2、初始化互斥量&#xff1a; 方法1&#xff1a;静态分配 方法2&#xff1a;动态分配 3、销毁互斥量&#xff1a; 4、加锁和解锁 示例抢…

MySQL 8.0.13安装配置教程

写个博客记录一下&#xff0c;省得下次换设备换系统还要到处翻教程&#xff0c;直接匹配自己常用的8.0.13版本 1.MySQL包解压到某个路径 2.将bin的路径加到系统环境变量Path下 3.在安装根目录下新建my.ini配置文件&#xff0c;并用编辑器写入如下数据 [mysqld] [client] port…

基于jsp网上教师点评系统

基于jsp网上教师点评系统 关键词&#xff1a;教师点评 信息技术 JSP技术 系统实现 首页 评分规则 教室信息 后台首页 相关技术介绍 B/S架构 对于架构&#xff0c;听起来说我们可能比较陌生&#xff0c;但对于通俗的语法讲。他的访问方式是通过网址还是说通过点图标这…

YoloV8改进策略:Neck改进|GCNet(独家原创)|附结构图

摘要 本文使用GCNet注意力改进YoloV8,在YoloV8的Neck中加入GCNet实现涨点。改进方法简单易用&#xff0c;欢迎大家使用&#xff01; 论文:《GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond》 非局部网络&#xff08;NLNet&#xff09;通过为每个查…

Flex布局:打造灵动、响应式网页设计的利器

Flex布局&#xff08;Flexible Box Layout&#xff09;&#xff0c;也称为弹性盒布局&#xff0c;是一种现代CSS布局模式&#xff0c;旨在为复杂、响应式的网页设计提供更加灵活、简洁的解决方案。Flex布局通过定义一个弹性容器&#xff08;flex container&#xff09;及其内部…

49岁前港姐退圈出嫁「南丫岛王子」,打排卵针高龄连生两女。

现年49岁的吴忻熹&#xff08;原名吴文忻&#xff09;1998年参选香港小姐夺得季军入行&#xff0c;在TVB签约发展平平&#xff0c;继而转战影坛&#xff0c;凭性感演出而为人熟悉。其后她在2011年嫁给有「南丫岛王子」之称的金融才俊&#xff0c;并在近40岁开始诞下两名女儿。吴…

Set a Light 3D Studio:探索光影艺术的全新维度mac/win中文版

Set a Light 3D Studio 是一款领先的三维建模和渲染软件&#xff0c;它将设计师、艺术家和摄影师的创意想法转化为生动逼真的三维场景。这款软件以其强大的功能和直观的界面&#xff0c;成为行业内众多专业人士的首 选工具。 set.a.light 3D STUDIO中文版软件获取 在Set a Lig…

最简单的 AAC 音频码流解析程序

最简单的 AAC 音频码流解析程序 最简单的 AAC 音频码流解析程序原理源程序运行结果下载链接参考 最简单的 AAC 音频码流解析程序 参考雷霄骅博士的文章&#xff1a;视音频数据处理入门&#xff1a;AAC音频码流解析 本文中的程序是一个AAC码流解析程序。该程序可以从AAC码流中…

信息系统项目管理师——第17章项目干系人管理

本章节内容属于10大管理知识领域&#xff0c;选择、案例、论文都会考。 选择题&#xff0c;稳定考1-2分左右&#xff0c;新教材基本考课本原话&#xff0c;这个分不能丢。 案例题&#xff0c;本期考的概率一般。 论文题&#xff0c;202205期考过。 1管理基础 管理的重要性 为…

QT5-qmediaplayer播放视频及进度条控制实例

qmediaplayer是QT5的播放视频的一个模块。它在很多时候还是要基于第三方的解码器。这里以Ubuntu系统为例&#xff0c;记录其用法及进度条qslider的控制。 首先&#xff0c;制作一个简单的界面文件mainwindow.ui&#xff1a; 然后&#xff0c;下载一个mp4或其他格式视频&#x…

爬虫 红网时刻 获取当月指定关键词新闻 并存储到CSV文件

目标网站&#xff1a;红网 爬取目的&#xff1a;为了获取某一地区更全面的在红网已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&#xff0c;csv&#xff0c;bs4&…

计算多个元素的累乘结果累乘器start默认初始为1 math.prod()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算多个元素的累乘结果 累乘器start默认初始为1 math.prod() [太阳]选择题 请问题目中的代码最后输出什么? import math list1 [1, 2, 3] print("【显示】list1 ",list1) pri…

如何将本地仓库放到远程仓库中

在我们仓库创建好之后&#xff0c;我们复制好ssh 接着我们需要使用git remote add<shortname><url>这个命令 shortname就是我们远程仓库的别名 接着使用git remote -v这个命令查看一下目前远程仓库的别名和地址 原本还有一个指令git branch -M main 指定分支的名…

智能试卷分析、智能组卷系统

本课题开发一个新型智能试卷分析评价系统&#xff0c;该系统实现了学生试卷的生成与评估以及对各种评估信息的管理和维护。该系统使用SpringBoot MysqlVue搭建的框架为设计平台&#xff0c;以B/S模式开发与设计题库及试卷管理模块。 学生功能&#xff1a;登录&#xff0c;答题考…

RD55UP06-V 三菱iQ-R系列C语言功能模块

RD55UP06-V 三菱iQ-R系列C语言功能模块 RD55UP06-V用户手册&#xff0c;RD55UP06-V功能&#xff0c;RD55UP06-V系统配置 RD55UP06-V参数规格&#xff1a;10BASE-T/100BASE-TX/1000BASE-T 1通道&#xff1b;字节存储次序格式小端模式; 可使用SD存储卡插槽&#xff1b;工作RAM 1…

dddddd

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

vulhub打靶记录——healthcare

文章目录 主机发现端口扫描FTP—21search ProPFTd EXPFTP 匿名用户登录 web服务—80目录扫描search openemr exp登录openEMR 后台 提权总结 主机发现 使用nmap扫描局域网内存活的主机&#xff0c;命令如下&#xff1a; netdiscover -i eth0 -r 192.168.151.0/24192.168.151.1…

更高效、更简洁的 SQL 语句编写丨DolphinDB 基于宏变量的元编程模式详解

元编程&#xff08;Metaprogramming&#xff09;指在程序运行时操作或者创建程序的一种编程技术&#xff0c;简而言之就是使用代码编写代码。通过元编程将原本静态的代码通过动态的脚本生成&#xff0c;使程序员可以创建更加灵活的代码以提升编程效率。 在 DolphinDB 中&#…

数据结构(初阶)第一节:数据结构概论

本篇文章是对数据结构概念的纯理论介绍&#xff0c;希望系统了解数据结构概念的友友可以看看&#xff0c;对概念要求不高的友友稍做了解后移步下一节&#xff1a; 数据结构&#xff08;初阶&#xff09;第二节&#xff1a;顺序表-CSDN博客 正文 目录 正文 1.数据结构的相关概…