千里马Android Framework实战开发-native程序之间binder通信实战案例分析

Android Framework构建智能座舱双屏互动:架构、通信与车规级实践 在智能汽车与物联网融合的背景下,跨设备协同成为提升用户体验的关键技术。其核心原理在于构建高效、可靠的通信中间件,通过服务化架构抽象硬件差异,实现数据与状态在多终端间的实时同步。这项技术的核心价值在于打破信息孤岛,为安全、便捷的智能交互提供基础支撑,广泛应用于智能座舱、车载信息娱乐系统及物联网场景。以当前热门的“双屏互动”为例,它正是该技术在车载领域的具体实践,通过深度整合车机与手机能力,实现导航流转、疲劳监测等智能场景。本文聚焦于基于Android Framework构建高可靠跨设备通信通道与状态同步机制, 阅读详情
AI摘要

本文详细介绍了Android系统中native程序间如何使用Binder进行跨进程通信。通过示例展示了客户端和服务端的C++代码实现,包括数据读取、写入及回调函数的处理,帮助开发者理解并掌握在C++层实现双向Binder通信的方法。

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

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

千里马Android Framework实战开发-native程序之间binder通信实战案例分析

1、需求背景

在android系统开发中,不仅仅我们都停留在java层面,很可能也会遇到比如一些native的可执行程序,比如surfaceflinger,bootanimation等他们都是native的执行程序,这些程序之间也经常会有要进行binder跨进程通信的需求,所以这个时候学习native层进行跨进程通信是非常有必要的。

2、案例功能介绍

在app的java层面我们之前已经实现过了binder的双向通信,这里在c++层也一样来实现一个双向的binder通信
在这里插入图片描述

3、源码展示

client端:

#include <binder/IServiceManager.h>
#include <binder/IBinder.h>
#include <binder/Parcel.h>
#include <binder/ProcessState.h>
#include <binder/IPCThreadState.h>
#include <private/binder/binder_module.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <binder/Binder.h>

using namespace android;
#ifdef LOG_TAG
#undef LOG_TAG
#endif

#define LOG_TAG "binderCallbackClient"
#define SAMPLE_SERIVCE_DES "my_hello"
#define SAMPLE_CB_SERIVCE_DES "android.os.SampleCallback"
#define SRV_CODE 1
#define CB_CODE 1
class SampeCallback : public BBinder
{
public:
  SampeCallback()
  {
    ALOGE("Client ------------------------------ %d",__LINE__);
    mydescriptor = String16(SAMPLE_CB_SERIVCE_DES);
  }
  virtual ~SampeCallback() {
  }
  virtual const String16& getInterfaceDescriptor() const{
    return mydescriptor;
  }
protected:

  void callbackFunction(int val) {
    ALOGE(" -----------callback Client ok------------------- %d val = %d",__LINE__,val);
  }

  virtual status_t onTransact( uint32_t code, const Parcel& data,Parcel* reply,uint32_t flags = 0){
    ALOGD( "my_hello Client onTransact, line = %d, code = %d",__LINE__,code);
    int val_1,val_2,val_3;
    String8 str_1,str_2,str_3;
    switch (code){
    case CB_CODE:
      //1.读取int32类型数据
      val_1 = data.readInt32();
      val_2 = data.readInt32();
      val_3 = data.readInt32();
      //2.读取String8类型字符串;str_1.string()-->String8转换char类型数组
      str_1 = data.readString8();
      str_2 = data.readString8();
      str_3 = data.readString8();

      callbackFunction(1234567);
      break;

    default:
      return BBinder::onTransact(code, data, reply, flags);
    }
    return 0;
  }
private:
  String16 mydescriptor;
};

int main()
{
  sp<IServiceManager> sm = defaultServiceManager();
  sp<IBinder> ibinder = sm->getService(String16(SAMPLE_SERIVCE_DES));
  if (ibinder == NULL){
           return -1;
     }
     Parcel _data,_reply;
     SampeCallback *callback = new SampeCallback();
     //写入客户端的callback
     _data.writeStrongBinder(sp<IBinder>(callback));
     _data.writeInterfaceToken(String16(SAMPLE_CB_SERIVCE_DES));
     int ret = ibinder->transact(SRV_CODE, _data, &_reply, 0);
    printf("Client before joinThreadPool \n");
    IPCThreadState::self()->joinThreadPool();
    printf("Client ------------------------------ main end");
    return 0;
}


server端:


#include <binder/IServiceManager.h>
#include <binder/IBinder.h>
#include <binder/Parcel.h>
#include <binder/ProcessState.h>
#include <binder/IPCThreadState.h>

using namespace android;
#ifdef LOG_TAG
#undef LOG_TAG
#endif

#define LOG_TAG "sampleService"
#define SAMPLE_SERIVCE_DES "my_hello"
#define SAMPLE_CB_SERIVCE_DES "android.os.SampleCallback"
#define SRV_CODE 1
#define CB_CODE 1

class SampleService: public BBinder {
public:
  SampleService() {
    ALOGE("my_hello Server ------------------------------ %d",__LINE__);
    mydescriptor = String16(SAMPLE_SERIVCE_DES);
  }

  virtual ~SampleService() {
  }

  virtual const String16& getInterfaceDescriptor() const {
    return mydescriptor;
  }

protected:

  void callFunction(int val) {
    ALOGE("Server ------------------------------ %d",__LINE__);
    ALOGI( "Service: %s(), %d, val = %d",__FUNCTION__,__LINE__,val);
  }

  virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) {
    ALOGD( "Service onTransact,line = %d, code = %d",__LINE__, code);
    switch (code) {
    case SRV_CODE:
      //读取Client传过来的IBinder对象
      callback = data.readStrongBinder();

      if(callback != NULL)
       {
         Parcel _data, _reply;
	 _data.writeInt32(1);
	 _data.writeInt32(2);
	 _data.writeInt32(3);

	 //2.String8类型
	 _data.writeString8(String8("who..."));
	 _data.writeString8(String8("are..."));
	 _data.writeString8(String8("you..."));
	 //回调客户端
         int ret = callback->transact(CB_CODE, _data, &_reply, 0);
       }
      //调用server端的
      callFunction(6666);
      break;
    default:
      return BBinder::onTransact(code, data, reply, flags);
    }
    return 0;
  }

private:
  String16 mydescriptor;
  sp<IBinder> callback;
};

int main() {
  sp<IServiceManager> sm = defaultServiceManager();
  SampleService* samServ = new SampleService();
  status_t ret = sm->addService(String16(SAMPLE_SERIVCE_DES), samServ);
  printf("server before joinThreadPool \n");
  IPCThreadState::self()->joinThreadPool( true);
  printf("server after joinThreadPool \n");
  return 0;
}
Android Framework开发工程师:核心职责、技术深度与面试指南 本文深入剖析了Android Framework开发工程师的岗位职责与核心技术要求。作为连接底层系统与上层应用的关键角色,工程师需精通WMS、AMS等核心服务机制,掌握JNI和Binder通信原理,具备系统性能优化和稳定性问题排查能力。文章详细解析了系统启动流程、Activity启动机制等核心原理,并提供了ANR分析、内存优化等实际问题解决方案。同时推荐了AOSP源码、技术书籍等学习资源,为开发者系统掌握Framework开发提供了全面指导。 阅读详情

相关推荐

Android Framework实战开发篇

广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主,让你自己动手可以定制自己喜欢的Android系统,让你的Android职业道路越走越顺。 学完本课程能让你学会如下知识点: -学习对BootAnimation的启动源码分析 -学习对BootAnimation的opengl绘制源码分析 -学习对BootAnimation的zip方式绘制源码分析 -学习制作一个带有时间的显示的BootAnimation的动画 -深入理解zip方式定制BootAnimation -学习android native层的posix线程实现 -学习android native层封装的Threads类源码及使用 -学习zygote的启动源码分析 -学习zygote的进程创建过程源码分析 -学习zygote启动systemserver过程分析 -学习systemserver的启动分析 -学习systemserver的Home

android framework项目开发案例-动态隐藏Launcher上图标2

上节课已经把代码写好了,可惜我们发现一点击就crash啦,因为CHANGE_COMPONENT_ENABLED_STATE权限需要系统权限才可以 2021-12-17 23:09:15.078 4198-4198/com.android.things.privateapplication1 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.android.things.privateapplication1, PID: 4198 jav

liaosongmao1的专栏 465

android UI框架 实例项目 demo

android UI框架 实例项目 demo 如图,有源码,可以运行。

千里马Android Framework实战开发-binder通信之Messenger介绍

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) Messenger是什么? Messenger是基于AIDL实现的轻量级IPC方案。 这里立马就会有疑问为什么要它呢?明明有了aidl 上节课大家学完了aidl进行binder通信是否感觉到使用起来其实还是有点复杂,毕竟通信什么的要写aidl,而且客户端和服务端都需要aidl文件,两个过程里面都需要,相对来说还是比较麻烦,对于项目过程中可能就是一些简单的跨进程数据传

liaosongmao1的专栏 276

长短期记忆网络(Long Short-Term Memory networks, LSTM)

如何简单的理解LSTM——其实没有那么复杂:

weixin_39910711的博客 2万+

Mediapipe手势识别实战——基于关节角度计算实现动态手势分类

本文详细介绍了如何利用Mediapipe进行手势识别,通过计算手指关节弯曲角度实现动态手势分类。文章从基础原理出发,讲解了关节角度计算的数学方法,并提供了Python实现代码。同时,还分享了数字手势和OK手势的识别实战经验,以及性能优化和工程实践中的关键技巧,帮助开发者快速掌握实时手势识别技术。

weixin_26891599的博客 403

android framework项目开发案例-动态隐藏Launcher上图标

hi,粉丝朋友们大家好!今天开始我们来开发一个android手机上如何动态隐藏桌面图标案例! 项目背景: 手机上桌面图标有时候不想被其他人发现,我们安装了某些应用,比如陌陌,xxx交友,和平精英等等 具体实现方案讨论: 方案1:在桌面launcher上面进行对应图标隐藏既可以 缺点:只能隐藏桌面图标,但是一些应用中心等也一样有入口,所以不彻底 方案2:在桌面launcher隐藏,而且framework层面实现拦截跳转,如framework在startActivity地方进行拦截 缺点:这里可能会让第三方应用

learnframework的博客 3324

机械臂速成小指南(七):从旋转矩阵到齐次变换——机械臂位姿的数学表达

本文详细介绍了机械臂位姿描述的数学基础,包括旋转矩阵、欧拉角和齐次变换等核心概念。通过解析旋转矩阵的几何意义和合成方法,以及欧拉角的直观描述,帮助读者理解机械臂位姿的数学表达。文章还探讨了齐次变换在工程实践中的应用,并提供了数值稳定性、坐标系约定和计算效率等实用建议。

cuda7parallel的博客 835

Android Binder机制的Native应用—双向通信

http://blog.youkuaiyun.com/tankai19880619/article/details/21224151 mkdir testbinder  //创建testbinder目录 Android.mk [plain] view plaincopy include $(call all-subdir-makefiles)    一、接口类 1.正向

Gabby 1415

JDK8升级JDK17过程中遇到的那些坑

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

BASK2312的博客 6685

闲人闲谈PS之十二——WBS-BOM在装备制造项目中的实战解析

本文深入解析了WBS-BOM在装备制造项目中的核心应用。针对按订单设计/生产的行业痛点,WBS-BOM作为项目专属物料清单,完美连接SAP PS与PP模块,确保MRP能基于项目进行精准物料需求计算,实现从设计到生产的全链路项目化跟踪与管理。

weixin_29284885的博客 399

千里马Android Framework实战开发-跨进程通信专题博客总结

千里马Android Framework实战开发-跨进程通信专题课表介绍 因为课程还剩下最后一部分binder驱动没有讲完,但是粉丝同学们已经迫不及待想要要提前看,这里就先分享一个课表给大家,提醒一下,课表的很大,你忍一下。。。。。 预计一星期左右可以上线全部视频,大家敬请期待课程杀青 ...

learnframework的博客 4279

D19: OpenClaw 安全性配置指南

在 OpenClaw 的 30 天探索旅程中,我们已经探讨了邮件自动化(D18)。今天进入安全专题,我将分享一个至关重要的话题:OpenClaw 安全性配置指南。 随着 OpenClaw 深入工作流核心,它掌握了越来越多的敏感信息: API Keys(GitHub、飞书、Notion、Jira...) 企业数据(代码库、文档、聊天记录) 个人数据(日历、邮件、任务) 系统权限(文件读写、命令执行、网络访问) 安全不是可选项,而是必选项。一次配置失误可能导致: API Key 泄露 → 账号被盗用权限

刘一说的IT专栏 203

千里马Android Framework实战开发-am命令怎么编译生成及native程序与java程序的binder通信实战

千里马Android Framework实战开发-am命令怎么编译生成及native程序与java程序的binder通信实战 背景: 大家如果看到binder通信native和java,肯定以为java是apk,但本节课就非要带大家了解点android中其实除了apk这种java程序,还有一类jar的运行程序,这样让大家就可以收获更多的知识点。当然大家学习完了觉得还想去apk上实验当然没有问题,不过这里唯一要提醒大家就是可能apk直接与native binder通信可能会有selinux问题,所以,可以se

learnframework的博客 959

Geogebra中级篇016—矩阵(Matrices)

在GeoGebra中,矩阵是一种强大的工具,广泛应用于线性代数、几何变换和数据处理等领域。通过矩阵,我们可以轻松实现复杂的计算和图形变换,如旋转、平移和缩放等操作。不仅如此,GeoGebra的矩阵功能还支持多种运算,如加法、乘法、求逆等,使得用户能够高效地处理线性方程组和向量空间问题。在本文中,我们将深入探讨GeoGebra中的矩阵功能,详细介绍如何创建矩阵、执行常见的矩阵运算,并通过实例展示这些操作在数学和工程应用中的实际价值。这篇文章将为你提供关于GeoGebra矩阵操作的全面指南。

八荒启-交互动画的博客 2584

彻底解决Win11锁屏界面黑屏或者图片不变化

windows锁屏后黑屏

renkai721的专栏 1万+

千里马Android Framework实战课程-应用程序app的Binder启动篇

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) 上一个学习专题zygote启动app进程时候,有简单讲过一下binder启动,但没有详细进行分析。这一节进行重点详细分析。 Android Framework实战视频–SystemServer启动篇 进程通过zygote进行fork后调用ZygoteInit.nativeZygoteInit(),是一个native方法,实现在AndroidRuntime里面,最后调

liaosongmao1的专栏 157

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

千里马android Framework实战开发-你真的懂aidl转换吗(aidl命令转cpp)

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) 千里马android Framework实战开发-你真的懂aidl转换吗(aidl命令转cpp,aidl命令转java) 原来讲解aidl时候给大家讲过是转换成java文件情况,也给大家展示了怎么使用命令来吧aidl文件转换成java。 但是这里有个疑问了,难道aidl文件就只能转换成java文件么,难道不可以转换成cpp文件么?如果可以转换成cpp文件那是不是对我

liaosongmao1的专栏 805

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

假人有限元模型

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

千里马android framework开发解决Accessing hidden method限制,让应用访问隐藏方法(需要可以修改系统源码方案)

hi,粉丝朋友们大家好! 今天来给大家分享一下,就是经常大家会做安卓系统开发工作问到一个问题,那就是我如果framework代码中增加了一个方法啥的,但是我又不想公开给第三方应用知道,只想让我系统的应用知道,那该怎么办呢?其实这个时候经常就会用到一个hidden的标签,来代表这个方法是隐藏方法,隐藏方法就是给系统内部用的,意味着第三方app就无法使用。这个其实也很常见,自从android p开始android系统就开始对访问hidden的限制越来越严格,虽然我们网络上有各种奇葩招来逃避不允许调用hidden

learnframework的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

clearCallingIdentity与restoreCallingIdentity-千里马framework系统源码实战详解

hi,粉丝朋友大家好:今天带大家来学习一个系统开发过程中大家即“熟悉”又陌生的两个方法,分别是clearCallingIdentity和restoreCallingIdentity,一般他们是成对出现在我们的framework代码中,但大家平时分析源码时候好像并没有在意他的真正作用是什么?为啥在框架代码分析时候可以看到他的大量出现?

learnframework的博客 1308
上一篇: Android Framework实战开发-socketpair介绍及它在android系统源码使用分析
下一篇: 千里马Android Framework实战开发-am命令怎么编译生成及native程序与java程序的binder通信实战
千里马学框架
博客等级 码龄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、付费专栏及课程。

余额充值