Android内核之Binder消息处理:binder_transaction用法实例(七十三)

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

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

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

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

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.Android内核binder_transaction介绍
    • 🌻3.代码实例
      • 🐓3.1 Binder 服务端接收请求并回复
      • 🐓3.2 Binder 客户端向服务端发送请求
      • 🐓3.3 Binder 驱动中实现事务处理

🌻1.前言

本篇目的:Android内核之Binder消息处理:binder_transaction用法实例

🌻2.Android内核binder_transaction介绍

  • binder_transaction 函数是 Android Binder 驱动中的一个核心函数,它用于在 Binder 机制中实现客户端向服务端发送请求并接收响应的过程。以下是对 binder_transaction 函数作用的详细介绍:

  • 消息传递: 在 Android 中,Binder 机制允许不同的应用程序或系统组件之间进行进程间通信(IPC)。当一个客户端应用程序想要向一个服务端应用程序发送请求时,它会通过 Binder 机制将请求封装成一个消息,并发送给服务端。binder_transaction 函数负责将这个消息从客户端传递到服务端。

  • 消息解析: 一旦消息到达服务端,binder_transaction 函数会负责解析消息的内容,提取出请求的具体信息,例如请求调用的函数或方法名称、参数等。这个过程是非常关键的,因为服务端需要根据这些信息来执行相应的操作。

  • 请求处理: 服务端收到消息后,会根据消息中的内容执行相应的操作,并生成一个响应消息。binder_transaction 函数在服务端负责处理这个请求,调用相应的服务端函数或方法,并传递请求所需的参数。

  • 响应返回: 当服务端完成请求处理后,会生成一个响应消息,并通过 binder_transaction 函数将这个响应消息传递回客户端。客户端收到响应后,可以继续执行相应的操作,例如更新用户界面或者执行下一步操作。

  • 线程同步和错误处理: 在消息传递和处理的过程中,可能会涉及到线程同步和错误处理等问题。binder_transaction 函数需要确保消息的传递和处理是按照正确的顺序进行的,并且能够处理各种可能出现的错误情况,例如超时、服务端崩溃等。

  • binder_transaction 函数是 Android Binder 驱动中非常重要的一个函数,负责实现客户端与服务端之间的消息传递和请求处理过程。它的正确和高效运行对于 Android 系统的稳定性和性能至关重要。

🌻3.代码实例

🐓3.1 Binder 服务端接收请求并回复

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/binder.h>

#define BINDER_TEST_SERVICE 1

static int binder_test_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    struct binder_thread *thread = current->binder;
    struct binder_transaction_data *txn = (struct binder_transaction_data *)arg;
    int ret;

    if (cmd == BINDER_TRANSACTION) {
        // 处理客户端请求,并生成响应
        // 在这里可以执行相应的功能
        // 然后构造响应消息并发送
        struct binder_transaction_data reply;
        reply.target.handle = txn->sender_pid; // 客户端的PID
        reply.target.ptr = NULL;
        reply.code = 0; // 响应码
        reply.flags = 0;
        ret = binder_transaction(thread, &reply, sizeof(reply), NULL, 0);
        return ret;
    }

    return -ENOTTY;
}

static const struct file_operations binder_test_fops = {
    .owner = THIS_MODULE,
    .unlocked_ioctl = binder_test_ioctl,
};

static int __init binder_test_init(void)
{
    if (binderfs_create_file("binder_test", &binder_test_fops) != 0)
        return -ENOMEM;

    return 0;
}

static void __exit binder_test_exit(void)
{
    binderfs_remove_file("binder_test");
}

module_init(binder_test_init);
module_exit(binder_test_exit);

🐓3.2 Binder 客户端向服务端发送请求

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/binder.h>

#define BINDER_TEST_SERVICE 1

static int binder_test_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    struct binder_thread *thread = current->binder;
    struct binder_transaction_data txn;
    int ret;

    if (cmd == BINDER_TRANSACTION) {
        // 构造客户端请求消息
        txn.target.handle = BINDER_TEST_SERVICE; // 服务端的 handle
        txn.code = 0; // 请求码
        txn.flags = 0; // 请求标志
        // 可以添加其他请求数据

        // 发送请求并等待响应
        ret = binder_transaction(thread, &txn, sizeof(txn), NULL, 0);
        return ret;
    }

    return -ENOTTY;
}

static const struct file_operations binder_test_fops = {
    .owner = THIS_MODULE,
    .unlocked_ioctl = binder_test_ioctl,
};

static int __init binder_test_init(void)
{
    if (binderfs_create_file("binder_test", &binder_test_fops) != 0)
        return -ENOMEM;

    return 0;
}

static void __exit binder_test_exit(void)
{
    binderfs_remove_file("binder_test");
}

module_init(binder_test_init);
module_exit(binder_test_exit);
MODULE_LICENSE("GPL");

🐓3.3 Binder 驱动中实现事务处理

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/binder.h>

#define BINDER_TEST_SERVICE 1

static int binder_test_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    struct binder_thread *thread = current->binder;
    struct binder_transaction_data *txn = (struct binder_transaction_data *)arg;
    int ret;

    if (cmd == BINDER_TRANSACTION) {
        // 在这里根据请求参数执行相应的功能
        // 并构造响应消息
        struct binder_transaction_data reply;
        reply.target.handle = txn->sender_pid; // 客户端的PID
        reply.target.ptr = NULL;
        reply.code = 0; // 响应码
        reply.flags = 0;
        ret = binder_transaction(thread, &reply, sizeof(reply), NULL, 0);
        return ret;
    }

    return -ENOTTY;
}

static const struct file_operations binder_test_fops = {
    .owner = THIS_MODULE,
    .unlocked_ioctl = binder_test_ioctl,
};

static int __init binder_test_init(void)
{
    if (binderfs_create_file("binder_test", &binder_test_fops) != 0)
        return -ENOMEM;

    return 0;
}

static void __exit binder_test_exit(void)
{
    binderfs_remove_file("binder_test");
}

module_init(binder_test_init);
module_exit(binder_test_exit);
MODULE_LICENSE("GPL");

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

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

相关文章

overflow:hidden对解决外边距塌陷的个人理解

外边距塌陷&#xff1a; 子元素的上外边距大于父元素的上外边距&#xff0c;导致边距折叠&#xff0c;取两者之间最大值&#xff0c;即子元素外边距&#xff0c;导致父元素上外边距失效。 解决办法&#xff1a;在父元素样式添加overflow:hidden;或者border:1px solid black;(不…

Python数据分析实战

文章目录 第1关&#xff1a;读取MoMA数据集第2关&#xff1a;计算艺术家年龄第3关&#xff1a;把年龄换算成年代第4关&#xff1a;总结年代数据第5关&#xff1a;将变量插入字符串第6关&#xff1a;创建艺术家频率表第7关&#xff1a;创建显示艺术家信息的函数第8关&#xff1a…

Ubuntu下halcon软件的下载安装

由于工作需求&#xff0c;点云配准需要使用halcon进行实现&#xff0c;并且将该功能放入QT界面中 1.下载halcon 进入halcon官网进行下载 官网链接&#xff1a;https://www.mvtec.com/products/halcon/ 注意&#xff1a;要注册登陆之后才能进行下载 接着点击Downloads->H…

SOCKET编程(3):相关结构体与函数

相关结构体与函数 sockaddr、sockaddr_in结构体 sockaddr和sockaddr_in详解 struct sockaddr共16字节&#xff0c;协议族(family)占2字节&#xff0c;IP地址和端口号在sa_data字符数组中 /* Structure describing a generic socket address. */ struct sockaddr {__SOCKADDR…

Apache POI入门学习

Apache POI入门学习 官网地址 excel中使用到的类读取excel表格内容表格内容maven依赖方式一测试结果 方式二测试结果 向excel中写入数据方式一方式二方式三测试结果 从 Excel 工作表中的公式单元格读取数据测试结果 Excel 工作表中写入公式单元格从受密码保护的Excel中读取数据…

Apple 发布新款 iPad Pro 和 iPad Air:性能和设计的巨大飞跃

Apple 发布新款 iPad Pro 和 iPad Air&#xff1a;性能和设计的巨大飞跃 概述 苹果公司最近的“Let Loose”活动在科技界掀起了轩然大波&#xff0c;推出了最新的 iPad Pro 和 iPad Air 型号&#xff0c;在性能、设计和功能方面取得了前所未有的改进。在本文中&#xff0c;我…

【XR806开发板试用】使用FDCM操作Flash记录开机次数

一、寻找系统分配的自定义用户数据地址 &#xff08;1&#xff09;XR806的Flash布局 如图1所示&#xff0c;FLASH的布局有两种&#xff1a; 1、没有开启OTA模式&#xff1b;Image1PaddingSysinfo 2、开启OTA模式&#xff1b;Image1PaddingSysinfoOTA area Image2 Padding 如图…

智算中心“火”了?引领算力发展新潮流

去年大模型的空前发展&#xff0c;人工智能也终于迎来了属于自己的“文艺复兴”&#xff0c;众多的模型相继发布&#xff0c;继而催生了整个行业对于智能算力需求的激增。 市场需求与技术驱动仿佛现实世界的左右脚&#xff0c;催动着世界文明的齿轮向前滚动。在全球经济角逐日…

django中的cookie与session

获取cookie request.COOKIE.GET 使用cookie response.set-cookie views.py from django.http import HttpResponse from django.shortcuts import render# Create your views here. def cookie_test(request):r HttpResponse("hello world")r.set_cookie(lan, py…

AQ6360 横河 光谱分析仪精华帖,收藏保存

AQ6360是一款由日本横河&#xff08;YOKOGAWA&#xff09;生产的光谱分析仪&#xff0c;其主要技术参数包括波长范围、波长精度和波长线性度等。AQ6360的波长范围为1200~1650nm &#xff0c;具有较高的波长精度&#xff0c;在1520~1580nm范围内为0.02nm&#xff0c;在1580~1620…

Colab/PyTorch - 001 PyTorch Basics

Colab/PyTorch - 001 PyTorch Basics 1. 源由2. PyTorch库概览3. 处理过程2.1 数据加载与处理2.2 构建神经网络2.3 模型推断2.4 兼容性 3. 张量介绍3.1 构建张量3.2 访问张量元素3.3 张量元素类型3.4 张量转换&#xff08;NumPy Array&#xff09;3.5 张量运算3.6 CPU v/s GPU …

从0开始学习python(六)

目录 前言 1、循环结构 1.1 遍历循环结构for 1.2 无限循环结构while 总结 前言 上一篇文章我们讲到了python的顺序结构和分支结构。这一章继续往下讲。 1、循环结构 在python中&#xff0c;循环结构分为两类&#xff0c;一类是遍历循环结构for&#xff0c;一类是无限循环结…

【工具推荐定制开发】一款轻量的批量web请求命令行工具支持全平台:hey,基本安装、配置、使用

背景 在开发 Web 应用的过程中&#xff0c;作为开发人员&#xff0c;为了确认接口的性能能够达到要求&#xff0c;我们往往需要一个接口压测工具&#xff0c;帮助我们快速地对我们所提供的 Web 服务发起批量请求。在接口联调的过程中&#xff0c;我们通常会用 Postman 等图形化…

气死!又被数据骗了!

做数据分析的人做的久了&#xff0c;就会自然而然产生一种想法&#xff0c;认为数据展示出来的东西一定是正确的。毕竟如果连我们自己都质疑数据分析的权威性和说服力&#xff0c;那我们数据分析人的工作不就成了白费功夫了嘛。 一开始&#xff0c;我也认为这是一条不可撼动的…

JVM认识之垃圾收集算法

一、标记-清除算法 1、定义 标记-清除算法是最基础的垃圾收集算法。它分为标记和清除两个阶段。先标记出所有需要回收的对象&#xff08;即垃圾&#xff09;&#xff0c;在标记完成后再统一回收所有垃圾对象。 2、优点和缺点 优点&#xff1a;实现简单缺点&#xff1a; 可能…

C++类和对象详解(一)

目录 面向过程和面向对象初步认识类的引入类的定义类的两种定义方式声明和定义全部放在类体中 声名定义分离 类的作用域成员变量命名规则建议访问限定符 类的封装类的实例化类对象模型类的对象大小的计算扩展 结构体内存对齐规则 感谢各位大佬对我的支持,如果我的文章对你有用,…

Linux系统一步一脚印式学习

Linux操作系统具有许多特点和优势。首先&#xff0c;它是开放源代码的&#xff0c;也就意味着任何人都可以对源代码进行查看和修改。其次&#xff0c;可以同时支持多个用户且可以同时执行多个任务&#xff0c;此外&#xff0c;Linux操作系统也非常稳定和安全。相对于其他操作系…

MyBatis认识

一、定义 MyBatis是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java O…

关于zabbix简介及zabbix服务端的部署

文章目录 一、zabbix概念1、zabbix简介2、zabbix主要特点3、zabbix运行机制4、zabbix应用场景5、zabbix监控原理6、zabbix的子程序7、zabbix监控的架构模式7.1 server-client架构7.2 server-proxy-client架构7.3 master-node-client 二、部署zabbix1、服务器配置2、服务器环境3…

ruoyi-nbcio 基于flowable规则的多重并发网关的任意跳转

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…