Android Framework实战开发视频--跨进程通信之Unix Socket通信

RK3588零拷贝跨进程通信实战:DMA-BUF与SCM_RIGHTS详解 在边缘AI与多路视频处理场景中,CPU频繁执行内存拷贝会导致性能下降和延迟增加,这是Linux进程间通信面临的核心挑战。零拷贝技术通过传递物理内存引用而非复制数据,从根本上解决了带宽与CPU占用问题。DMA-BUF作为内核标准共享内存机制,配合SCM_RIGHTS文件描述符传递,实现了跨进程的高效数据流转。该方案在RK3588平台上可结合NPU、VPU、RGA等硬件加速模块,构建从采集到推理再到编码的全链路零拷贝流水线,显著降低CPU负载与处理延迟。本文从内存管理原理切入,详细讲解DMA-BUF分配、fd传 阅读详情
AI摘要

本文介绍了如何在Android应用中使用Unix Domain Socket进行进程间通信,避免了网络通信的复杂性。通过实例展示了客户端和服务端的代码,并说明了Unix Socket与普通网络socket的主要区别,以及其在通信流程中的应用。

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论

android跨进程通信实战视频课程(加群获取优惠)

Android Framework实战开发视频–跨进程通信之Unix Socket

1 专门用于跨进程通信的Unix Socket

做过java相关app开发肯定学过socket通信等一些小程序来实现局域网通信,学会了通过ip地址来进行一种网络通信,但这种通信一般用于跨设备访问场景。而我们如果在同一个设备上,只是进程与进程之间的一种通信,那就完全没有必要使用这种网络通信方式,因为明显感觉不合适,进程间本身处于一个设备上,为啥还要通过ip网络,网卡走一圈再回来。所以针对这个问题就出现了本节课要讲的Unix Domain Socket通信。

UNIX Domain SOCKET 是在Socket架构上发展起来的用于同一台主机的进程间通讯(IPC)。它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序列号应答等。只是将应用层数据从一个进程拷贝到另一个进程。UNIX Domain SOCKET有SOKCET_DGRAM和SOCKET_STREAM两种模式,类似于UDP和TCP,但是面向消息的UNIX socket也是可靠的,消息既不会丢失也不会顺序错乱。

2 与正常网络socket的使用差异

因为默认已经对我们的网络socket有一定了解,没有了解的可以看我上一个blog,这里我们学习Unix Socket时候就只需要重点掌握一些它们的差异既可以。
最大差异看一下socket方法:

int socket(int protofamily, int type, int protocol);

//protofamily:即协议域,又称为协议族(family)。这里我们Unix Socket通信情况下选择AF_UNIX,协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
type:指定socket类型。常用的socket类型有,SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)。

int bind(int sockfd, const struct sockaddr addr, socklen_t addrlen);

这里的bind方法里面sockaddr 在上一节讲解网络通信时候时候用的是sockaddr_in结构体,传入最主要是端口和ip,这里unix socket对应结构体则是sockaddr_un:

struct sockaddr_un
{
  uint8_t sun_len;
  sa_family_t sun_family; /* AF_LOCAL */
  char sun_path[104]; /* null-terminated pathname */
};

sun_path主要传入一个绝对路径就可以,因为不需要ip进行网络通信。
其他部分基本和网络socket一样
通信流程图:
在这里插入图片描述

3 实战Unix Socket通信

客户端代码:

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

#define MAXLINE 80

char *client_path = "client-socket";
char *server_path = "server-socket";

int main() {
        struct  sockaddr_un cliun, serun;
        int len;
        char buf[100];
        int sockfd, n;

        if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
                perror("client socket error");
                exit(1);
        }

    memset(&serun, 0, sizeof(serun));
    serun.sun_family = AF_UNIX;
    strncpy(serun.sun_path,server_path ,
                   sizeof(serun.sun_path) - 1);
    if (connect(sockfd, (struct sockaddr *)&serun, sizeof(struct sockaddr_un)) < 0){
        perror("connect error");
        exit(1);
    }
    printf("please input send char:");
    while(fgets(buf, MAXLINE, stdin) != NULL) {
         write(sockfd, buf, strlen(buf));
         n = read(sockfd, buf, MAXLINE);
         if ( n < 0 ) {
            printf("the other side has been closed.\n");
         }else {
            printf("received from server: %s \n",buf);
         }
         printf("please input send char:");
    }
    close(sockfd);
    return 0;
}


服务端代码:

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>

#define MAXLINE 80

char *socket_path = "server-socket";

int main()
{
    struct sockaddr_un serun, cliun;
    socklen_t cliun_len;
    int listenfd, connfd, size;
    char buf[MAXLINE];
    int i, n;

    if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("socket error");
        exit(1);
    }

    memset(&serun, 0, sizeof(serun));
    serun.sun_family = AF_UNIX;
    strncpy(serun.sun_path,socket_path ,
                   sizeof(serun.sun_path) - 1);
    unlink(socket_path);//这个相当于把之前的地址要移除,不然上一个server没有结束,移除会报错already in use
    if (bind(listenfd, (struct sockaddr *)&serun, sizeof(struct sockaddr_un)) < 0) {
        perror("bind error");
        exit(1);
    }
    printf("UNIX domain socket bound\n");

    if (listen(listenfd, 20) < 0) {
        perror("listen error");
        exit(1);
    }
    printf("Accepting connections ...\n");

    while(1) {
        cliun_len = sizeof(cliun);
        if ((connfd = accept(listenfd, (struct sockaddr *)&cliun, &cliun_len)) < 0){
            perror("accept error");
            continue;
        }
        printf("new client connect to server,client sockaddr === %s \n",((struct sockaddr *)&cliun)->sa_data);
        while(1) {
            memset(buf,0,sizeof(buf));
            n = read(connfd, buf, sizeof(buf));
            if (n < 0) {
                perror("read error");
                break;
            } else if(n == 0) {
                printf("EOF\n");
                break;
            }

            printf("received: %s\n", buf);

            for(i = 0; i < n; i++) {
                buf[i] = toupper(buf[i]);
            }
            write(connfd, buf, n);
        }
        close(connfd);
    }
    close(listenfd);
    return 0;
}

结果截图:
服务先启动,然后客户端后启动,然后输入任何一个字符“hello”会立即受到服务端回复的大小字母“HELLO”
在这里插入图片描述

安卓Root设备绕过Google Play Protect检测的七步终极方案 在Android系统安全领域,系统完整性验证是保障设备与应用生态安全的核心机制。其原理在于通过多维度检测,如验证启动镜像签名、检查系统分区状态、探测特定二进制文件及调用远程证明API(如SafetyNet/Play Integrity),来判断设备是否被篡改。这项技术的价值在于平衡了系统安全性与开发者、高级用户进行深度定制的合法需求,例如自动化测试、系统级功能开发与老旧设备优化。常见的应用场景包括需要在已获取Root权限的设备上,使依赖Google服务框架的金融、支付类应用能正常运行。本文聚焦于利用Magi 阅读详情

相关推荐

概率论 知识图谱 + 实战案例解析

本文通过构建概率论知识图谱,系统梳理了从随机试验、概率、条件概率到随机变量与分布的核心概念及其内在联系。结合朴素贝叶斯分类器和蒙特卡洛模拟等实战案例,深入解析了条件概率、独立性及大数定律等理论如何应用于机器学习与实际问题求解,旨在帮助读者建立结构化思维,将理论有效转化为解决实际问题的能力。

weixin_29051193的博客 267

AF_UNIX 本地通信

unix本地多进程通讯

mayue_web的博客 1万+

AD(AltiumDesigner)封装导入allegro生成allegro封装

AD(AltiumDesigner)封装导入allegro生成allegro封装 貌似PCB的封装问题是一个无尽话题,为了简单我总是想找捷径(主要还是太懒了),因为也是近期才开始学习使用allegro进行PCB设计,在最近的一个设计中,很多器件封装allegro中都没有,一个一个画感觉很费时间,但是在AD(AltiumDesigner)的封装库中是有的,于是便想着AD的封装库能不能倒入到alleg...

yangh2560的博客 2万+

Android Framework实战开发视频--跨进程通信之Socket通信

Android Framework实战开发视频–跨进程通信之Socket通信 1 Socket是什么呢? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 2、Socket的方法介绍 既然是相互之间的通信,那就肯定有客户端和服务端,那么使用socket通信时候二者的具体流程是怎么样的?那我

learnframework的博客 1735

AI人工智能与模拟退火:碰撞出的智慧火花

本文旨在为读者全面介绍模拟退火算法在人工智能领域的应用。我们将涵盖从基础理论到实际实现的完整知识体系,帮助读者理解这一受自然界启发的优化技术如何解决复杂的计算问题。文章首先介绍模拟退火的基本概念,然后深入其工作原理和数学基础,接着通过Python实现展示具体应用,最后讨论实际应用场景和未来发展方向。模拟退火(Simulated Annealing, SA):一种受物理退火过程启发的概率性优化算法能量函数(Energy Function):评估系统状态的函数,对应优化问题的目标函数。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 452

嵌入式工程师成长之路(10)——项目举例

送给大学毕业后找不到奋斗方向的你(每周不定时更新)

云轩阁 5万+

Android Framework实战开发-socket跨进程通信之native程序与apk java通信

unix socket前面几节课已经讲过了,但都是基于linux下面的c程序,那么在android中往往经常会遇到c代码的native程序要与 apk的java程序进行socket通信,本节课我们来实现一下: 直接上代码: native端作为服务端: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h&gt

learnframework的博客 1413

2023年高教社杯全国大学生数学建模竞赛 E 题:《黄河水沙监测数据分析》真题解析与 MATLAB 解决方案

🏆 本文已收录于专栏:《滚雪球学数学建模(含历年真题)》,持续更新最新及历年数学建模竞赛资料,每篇内容力求做到“问题讲透、模型讲清、代码可用、论文可参考”,帮助你从零开始逐步建立完整的数学建模知识体系。

**My Coding Family** 904

Android Framework实战开发-socketpair介绍及它在android系统源码使用分析

Android Framework实战开发-socketpair介绍及它在android系统源码使用分析 1.socketpair介绍 在linux下,使用socketpair函数能够创建一对套节字进行进程间通信(IPC)。 函数原形: #include <sys/types.h> #include <sys/socket.h> int socketpair(int domain, int type, int protocol, int sv[2]); 参数1(domain):表示协

learnframework的博客 1608

YOLOv11【第二章:核心模块进阶篇·第3节】LDConv线性可变形卷积改进YOLOv11!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 7440

人工智能 (Artificial Intelligence, AI) 原理与代码实例讲解

人工智能 (AI) 机器学习 (Machine Learning) 深度学习 (Deep Learning) 算法 模型 代码实例 应用场景 1. 背景介绍 人工智能 (Artificial Intelligence, AI) 作为一项前沿科技,近年来发展迅速,已渗透到生活的方方面面

AI架构师小马 1227

Android Framework实战视频--init进程的bootanimation启动源码分析(补充Android 10部分的BootAnimation的启动源码分析)

课程答疑和新课信息:QQ交流群:422901085进行课程讨论 FrameWork入门课视频链接:https://edu.youkuaiyun.com/course/detail/30298 FrameWork实战课1视频链接:https://edu.youkuaiyun.com/course/detail/30275 FrameWork跨进程通信视频链接:https://edu.youkuaiyun.com/course/detail/35911 专题博客系列: Android 8.1 zygote 启动过程源码 Android Frame

liaosongmao1的专栏 273

194、产线 Camera 校准与测试:终检测试项、规格线制定与量产数据监控

摘要: 文章通过"绿屏门"案例揭示了产线Camera校准测试中的关键问题,提出了系统性改进方案。在终检测试方面,建议增加多增益暗电流测试、混合光源色温测试和径向亮度梯度测试,覆盖用户真实场景。规格线制定强调用CPK替代固定百分比,区分硬软规格并建立动态调整机制。量产监控需关注参数趋势、边界模组分布,构建失效模式数据库。实践建议包括测试冗余设计、规格余量预留、自动化监控、供应商数据共享和人工抽检保留。文章指出Camera产线质量管控需形成"测试设计-规格优化-数据监控"闭环,以数据驱动决策避免客诉风险。

sundong_81的博客 192

Android4.0(Phone)拨号启动过程分析(三)与Framework层通信

由于Android几乎所有的代码都是公开的,如果要对Framework层分析就必需先拿到Framework层的代码,我在前面已经搭建好了ubuntu14.04的环境,下载好了Android4.0的源码,其中也包括了Framework层和Package的代码,导出到宿主机Windows XP中用Source Insight 3.5工具来查看源码,Package中的代码可以导入到Eclipse下查看,

DMT专栏 3291

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OpenClaw Android工程化:突破沙盒与SELinux的本地Agent实践

AI Agent并非仅限于云端调用或网页自动化,其在移动终端的真正可用性取决于能否深度融入操作系统底层。Android的沙盒隔离、Activity生命周期限制与SELinux安全策略,共同构成了Agent落地的核心障碍。本文聚焦‘本地化智能体’这一关键技术路径,解析如何通过ADB Root权限利用、system_app域服务注入、Unix Domain Socket进程通信等工程手段,实现低延迟(17ms级)输入事件直连与后台持久化运行。结合OpenClaw框架,展示从Python技能逻辑到Android原

banglvfei0870的博客 456

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android简单的聊天室开发(client与server沟通)

请尊重他人的劳动成果。转载请注明出处:Android开发之简单的聊天室(client与server进行通信) 1. 预备知识:Tcp/IP协议与Socket TCP/IP 是Transmission Control Protocol/Intemet Protocol的简写,中文译名为传输控制协议/因特网互联协议。又叫网络通信协议,这个协议是Internet最主要...

weixin_30673611的博客 172

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android输入子系统架构与排查实战:从EventHub到事件分发

在Android应用开发中,触摸事件响应、按键映射或输入卡顿等问题往往涉及从硬件到应用层的完整链路。理解输入子系统(Input Subsystem)的工作原理,是从应用层走向系统层的关键一步。该系统由EventHub负责内核设备事件的采集,InputReader完成原始事件的语义化转换,而InputDispatcher则根据窗口信息与焦点状态,将事件精准分发至目标应用,并通过InputChannel实现跨进程通信。掌握这一机制,不仅能帮助开发者快速定位点击无响应、ANR或事件错乱等典型故障,还能为ROM定制

weixin_33970449的博客 415

第一板块:Android 系统基石与运行原理 | 第一篇:Android 系统架构分层与 AOSP 规范

Android系统架构与AOSP规范摘要 Android是基于Linux内核构建的分层操作系统,采用清晰的五层架构设计: Linux内核层:提供进程调度、内存管理、驱动支持等基础功能,包含Binder等Android特有组件 硬件抽象层(HAL):通过标准C接口屏蔽硬件差异,实现驱动与上层解耦 系统运行库层:包含Native库和ART运行时,执行核心功能与字节码 Java API框架层:以系统服务形式暴露核心功能给应用 应用层:运行在独立沙箱中的各类应用 各层间定义清晰的接口边界,通过JNI、HAL标准接口

9年Android老兵,专注车载系统与移动架构。深耕Java/Kotlin,玩转Lua/Python。擅长百度/高德地图深度定制,分享拒绝浅尝辄止的硬核干货。 709

跨平台C++开发实战:架构设计、工具链与平台适配全解析

跨平台开发是软件工程中的核心挑战之一,其本质在于通过统一的技术方案解决不同操作系统、硬件架构和系统API之间的差异。从原理层面看,这通常涉及构建平台抽象层(PAL)来封装平台特定实现,使业务逻辑与底层细节解耦。在技术价值上,跨平台方案能显著提升代码复用率、降低维护成本,并确保应用在多种环境下行为一致。常见的应用场景包括游戏引擎、工业控制软件、音视频处理和高频交易系统等对性能和可控性要求极高的领域。本文基于CMake构建系统和现代C++标准,深入探讨了如何通过条件编译、抽象接口以及持续集成等工程实践,构建健壮

weixin_30596023的博客 488
上一篇: Android Framework实战开发视频--跨进程通信之Socket通信
下一篇: Android Framework实战开发-跨进程通信之 epoll详细讲解
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值