Android - Binder应用分析

android的IBinder简单使用 android中IPC机制的IBinder简单使用,简要说明下IBinder中两个重要方法 立即下载

1.1.1           机制

1.1.1.1          摘录
1.1.1.1.1      Android-Binder框架在Framework层的C++中的使用

简单来说,Binder就是规定了客户端和服务端通信的一堆API,这些API被定义在一个接口当中。假设名字为IMyName,注意,一定是I+名字的结构。这个接口一定要继承IInterface。现在,这个IMyName就是Binder的client端与server端通信的协议了。

然后,我们通过IMyName扩展出分别用于client端和server端的接口,BpInterface和 BnInterface。通过这两个接口,client端和server端分别实现了两个类BpMyName和 BnMyName。

最后,BpMyName和BnMyName中都对每个IMyName中的接口做了实现。

BpMyName中实现每个接口时,都是调用IBinder.transact()并传入相应方法的ID来做到。

而BnMyName就要复杂一些。首先,定义一个类SomeClass来继承并实现BnMyName,这个类在命名上没有要求。在 SomeClass中对IMyName中每个接口都做了实现。在BnMyName中有一个onTransact方法,它与BpMyName中调用 IBinder.transact方法是对应的。这样,在BnMyName的onTransact方法中,根据不同的code调用不同的IMyName中的方法,而这些方法都是在SomeClass中实现的。

下面的图示意一下,可能更清楚:

IInterface

|

IMyName

| |

BpInterface BnInterface

| |

BpMyName BnMyName

|

SomeClass

当某个类使用到了IMyName中的API时,你会发现IMyName仅是个接口,里面的API全是抽象的。要找到这个API的实现,就需要根据上面示意的层次找到这个SomeClass类,这个类在命名上没有什么特征,只有一点儿,它继承了BnMyName。

1.1.2           服务

声明一个服务时,一般该服务都要继承BinderService<xxx>和Bnxxx。

1.1.2.1          BinderService

它是Binder服务模块要继承的基类,主要用于将该Binder服务注册到ServiceManager中。如CameraService。

当然也不是服务模块必须继承BinderService,如MediaPlayerService。

要成为一个服务端,最重要的是往ServiceManager注册。

1.1.2.2          Bnxxx

Bnxxx是Service要继承的基类,它负责和客户端通信。所有的Bnxxx都只有一个函数onTransact,它是根据收到的消息码调用相应的Service函数进行处理。

Bnxxx继承Ixxx和BBinder,Ixxx定义的服务端和客户端之间的通信接口;BBinder定义了onTransact。

1.1.3           客户端

1.1.3.2          Bpxxx
是service在客户端的代理(镜像),客户端要和service通信,就要通过Bpxxx句柄和Bnxxx通信,然后Bnxxx再调用service相关方法处理。
Bpxxx在客户端的进程,Bnxxx在service的进程,两个之间的接口就是Ixxx定义的接口,每个Ixxx声明中,都会有一个定义了很多功能代号的enum,Bp就是通过设定功能代号向Bnxxx说明要调用的服务功能的。
1.1.3.3          句柄
客户端的类名字可以设定为任意,客户端完成的任何功能,都需要调用Bpxxx(Ixxx)句柄,然后将请求发送到service。

1.1.4           Ixxx的作用

Ixxx规定的是服务端提供的接口,客户端要通过这些接口来向服务端请求,所以客户端保存的服务端标识都是Ixxx mXxx型的变量。客户端不可能直接调用Xxx类,因为它们在两个进程。

上面的描述有一点不合适,客户端有时也定义了Ixxx的接口,它一般是服务端对客户端的回调。所以Ixxx更准确的表达是本模块向外提供的接口,本模块既可以是服务端也可以是客户端。

下面我们以Camera为例进行说明。

1.1.5           DeathRecipient

当Binder服务端出现异常时,对客户端的通知。用户要实现DeathRecipient定义的binderDied虚函数,一般是对某些资源的释放。每个客户端都有自己的DeathRecipient对象,需要将这个对象注册到自己的服务端,代码如下defaultServiceManager()->getService(String16("media.camera"))->linkToDeath(mDeathNotifier),当服务端异常后,会掉用相应的binderDied通知。

当然如果客户端异常或者提前释放时,也要将这个DeathRecipient对象从服务端注销,代码如下defaultServiceManager()->getService(String16("media.camera"))->unlinkToDeath(mDeathNotifier)。

1.1.6           匿名服务

之前我们说到的服务都是要注册到defaultServiceManager的服务,还有很多服务没有进行注册,也可以使用。下面我们以Camera客户端Connect到CameraService后,CameraService要创建一个Client来服务Camera客户端,而这个Client其实就是一个未注册的Service。

sp<ICameraClient> cameraClient =interface_cast<ICameraClient>(data.readStrongBinder());

sp<ICamera> camera =connect(cameraClient, data.readInt32());

reply->writeStrongBinder(camera->asBinder());

首先获得客户端cameraClient,然后创建Client服务camera,然后通过writeStrongBinder将camera设为服务。

1.1.7           案例说明

以Camera为例说明,共三种关系。

ICameraService

客户端要请求Service完成拍照的功能,首先要让Service创建一个子项专门处理该客户端的请求,这个子项就是CameraService::Client。

该接口主要提供获得摄像头的个数、创建CameraService::Client等功能。如下图:



ICamera

定义摄像头的功能接口,如设置参数、拍照、停止等操作。框架如下图:



ICameraClient

客户端提供的回调函数接口,也可见,不一定Service才能够向外提供服务,客户端照样可以,框架如下图:



1.1.8           重要代码

1.1.8.1          宏和函数

函数

功能说明

使用方法

 

 

 

DECLARE_META_INTERFACE

对I**的声明

声明接口的构造和析构函数

DECLARE_META_INTERFACE(Camera)等同于

static const android::String16 descriptor;

    static android::sp<ICamera> asInterface(const android::sp<android::IBinder>& obj);

    virtual const android::String16& getInterfaceDescriptor() const;

    ICamera ();                                                     \

    virtual ~ICamera ();

IMPLEMENT_META_INTERFACE

对Bp**的建立

1.       asInterface:新建Bp****

2.       构造和析构函数的实现

IMPLEMENT_META_INTERFACE(Camera, "android.hardware.ICamera");等同于

const android::String16 ICamera::descriptor("android.hardware.ICamera");           

    const android::String16&ICamera::getInterfaceDescriptor() const {             

        return ICamera::descriptor;                                

    }                                                                   

    android::sp< ICamera> ICamera::asInterface(const android::sp<android::IBinder>& obj)                  

    {                                                                   

        android::sp<ICamera> intr;                                 

        if (obj != NULL) {                                              

            intr = static_cast< ICamera *>(obj->queryLocalInterface(ICamera::descriptor).get());              

            if (intr == NULL) {                                         

                intr = new BpCamera (obj);                         

            }                                                           

        }                                                              

        return intr;                                                    

    }                                                                   

    ICamera:: ICamera () { }                                    

    ICamera::~ ICamera () { }                                  






深入解析Unity3D中PostLateUpdate突然占用大量时间的原因 在Unity3D的生命周期中,是一个在LateUpdate之后被调用的方法。它通常用于处理一些需要在所有更新(包括物理更新和动画更新)之后进行的逻辑。由于它在游戏循环的后期阶段被调用,因此它通常用于处理与渲染直接相关的任务,如相机调整、UI更新等。突然占用大量时间的问题可能由多种原因引起,包括复杂的逻辑处理、频繁的资源加载、不恰当的渲染优化、插件或第三方库的副作用以及内存泄漏或垃圾回收等。为了解决这个问题,开发者需要仔细审查和优化中的代码,同时利用Unity提供的工具来监控和分析游戏性能。 阅读详情

相关推荐

DRAM知识整理系列(三):部分时序参数整理

一、tCL-tRCD-tRP-tRAS(第一时序) 内存是根据行和列寻址的,当请求触发后,最初是tRAS(Active to precharge Delay),预充电后,内存才真正开始初始化RAS(Row Address Strobe)。一旦tRAS激活后,RAS开始进行需要数据的寻址。首先是行地址,然后初始化tRCD(RAS to CAS Delay),周期结束,接着通过CAS(Column Address Strobe)访问所需数据的十六进制地址。其中,从CAS开始到CAS结束,就是CAS延迟(即t

不吃鱼的猫的博客 7万+

MediaPlayer-MediaPlayerService-MediaPlayerService::Client的三角关系

1. MediaPlayer是客户端 2. MediaPlayerService和MediaPlayerService::Client是服务器端。 2.1 MediaPlayerService实现IMediaPlayerService定义的业务逻辑,其主要功能是根据MediaPlayer::setDataSource输入的URL调用create函数创建对应的Player. 2.2 Media

MyArrow的专栏 1万+

给IC设计新人的Tessent Scan入门指南:从RTL到ATPG的完整DFT流程解析

本文为IC设计新手提供Tessent Scan的完整DFT流程指南,从RTL代码检查到ATPG测试向量生成,详细解析扫描链配置、插入及验证的关键步骤。通过实战案例和工具命令示例,帮助工程师快速掌握Tessent工具链的应用技巧,提升芯片可测试性设计的效率和质量。

weixin_32541663的博客 451

Android深入浅出之Binder机制

先转过来,再慢慢研究。 原文:http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html Android深入浅出之Binder机制 一 说明  Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的。所以搞明白Binder的话,在很大程度上

JerryMo06的专栏 1026

保姆级教程:用TI IWR6843雷达板跑通3D人体追踪demo(附CCS/UniFlash避坑指南)

本文提供了一份详尽的TI IWR6843毫米波雷达开发板3D人体追踪demo实现指南,涵盖开发环境搭建、工程导入编译、固件烧录及可视化工具配置全流程。特别针对CCS和UniFlash使用中的常见问题给出解决方案,帮助开发者快速掌握3D People Tracking技术应用。

weixin_29159441的博客 503

强化学习入门8—深入理解DDPG

本文是强化学习入门系列的第八篇,前面我们讲Actor-Critic时提到了DDPG。DDPG是google DeepMind团队提出的一种用于输出确定性动作的算法,它解决了Actor-Critic 神经网络每次参数更新前后都存在相关性,导致神经网络只能片面的看待问题这一缺点。同时也解决了DQN不能用于连续性动作的缺点。

小菜羊的博客 4314

C++ binder 实现自定义Android Native Service

代码很简单, 定义一个类继承自IInterface, 里面接口就是我们自己要用到的, 其中DECLARE_META_INTERFACE(DeviceMac);要实现跨进程, 自然是使用Binder了, 因此我们首先要定义一个用于跨进程的接口, 我们通过一个读取和设置蓝牙地址的例子为例, 来讲解具体实现方法, 接口名为。可以看到我们定义IDeviceMac后, 还定义了一个类BnDeviceMac,这个是Binder调用的一个规范, 即定义Ixxx接口后,Bpxxx和Bnxxx都需要我们去实现具体内容,

xfb的博客 1188

NVIDIA NCCL 源码解析:从XML拓扑到高性能通信图的构建

本文深入解析了NVIDIA NCCL如何将XML硬件拓扑文件转化为高性能通信图的核心过程。详细阐述了从创建CPU、GPU、NIC等节点,到建立PCIe、NVLink连接,再到计算链路带宽并进行关键排序的完整建图流程。该图是NCCL实现最优通信路径规划、充分发挥NVLink等高速互联性能的基石,直接影响分布式深度学习训练的效率。

convnet3designer的博客 307

Binder机制,从Java到C (7. Native Service)

1.什么是NativeService Native Service,是通过C或C++代码写出來,提供给Java进行远程调用的RemoteService。向Android开机就启动的surfaceflinger,media都是native service。在前一篇中,我們总结了Binder通信的整個流程:Java Proxy代码走到JNI实现的BinderProxy的transact()...

dhjfnfzqyfkbbb1824的博客 164

光流法实战:如何用OpenCV的Farneback算法实现图像对齐(附调参技巧)

本文详细介绍了如何使用OpenCV的Farneback稠密光流算法实现图像对齐,包括核心原理、参数调优和工程实现。通过实战代码和参数优化策略,帮助开发者解决动态场景中的图像对齐问题,提升多帧融合和视频处理的效果。

weixin_29266007的博客 291

MoveIt 运动学、运动规划、混合规划、move_group

混合规划是运动规划方法的一个术语,它将异构运动规划器结合起来,以产生更稳健或反应更快的解决方案。这种通用方法在导航领域已经非常成熟,并在导航2等流行项目中成功实施。MoveIt 的混合规划架构结合了一对全局规划器和局部规划器,它们以不同的规划速度和问题范围并行、并发运行。全局规划器的任务是解决全局运动规划问题,这与 “感知-规划-行动 ”应用中使用的规划器非常相似。所使用的规划器算法应该是完整的,因此假定其计算时间相对较慢。此外,全局规划器不要求实时安全,这意味着无法保证规划器在特定期限内找到解决方案。

机器人控制与仿真应用 2131

Android Binder之应用层总结与分析

概述通过前两篇( Android 深入浅出AIDL(一) Android 深入浅出AIDL(二))文章对AIDL进行运用与分析,对于Android跨进程通讯有了不少的了解,深入分析AIDL通讯过程,我们发现跨进程的主导元素是Binder,但是这个Binder是Android中很重要又很复杂的概念,本文就不深入到底层和驱动层去研究,有兴趣的童鞋可以滑动到文章底部,有详细的Binder深入探究的文章推荐

凶残的程序员 1万+

OpenClaw简介--windows系统安装OpenClaw

在windows安装OpenClaw实现代替人工操作。步骤流程详细,图文并茂。

直到世界的尽头 5348

Binder Trace实战教程:如何拦截和分析Android应用通信的终极指南

Binder Trace是一款功能强大的Android Binder消息拦截和解析工具,被誉为"Binder的Wireshark"。这个开源工具能够帮助开发者和安全研究人员深入理解Android应用之间的通信机制,是Android逆向工程和安全分析的利器。 ## 📱 Binder Trace是什么? Binder是Android系统中进程间通信(IPC)的核心机制,几乎所有Android应用

gitblog_02482的博客 244

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android Binder 应用程序Binder 启动源码分析

android8.1启动过程(七) SystemServer_we1less的博客-优快云博客 这篇文章说道SystemServer进程主要用于创建系统服务,同时初始化Zygote 调用gCurRuntime->onZygoteInit();本文从这继续解析binder的启动过程。 onZygoteInit AOSP/frameworks/base/cmds/app_process/app_main.cpp virtual void onZygoteInit() { ...

转载和创作优秀的博客 607

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

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

Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

From:http://blog.youkuaiyun.com/luoshengyang/article/details/6633311

MaximusKiang的专栏 1243

Android应用程序启动Binder线程源码分析

Android的应用程序包括Java应用及本地应用,Java应用运行在davik虚拟机中,由zygote进程来创建启动,而本地服务应用在Android系统启动时,通过配置init.rc文件来由Init进程启动。Zygote启动Android应用程序的过程请查看文章Zygote孵化应用进程过程的源码分析,关于本地应用服务的启动过程在Android Init进程源码分析中有详细的介绍。无论是And

深入剖析Android系统 5537

android binder(二)应用层编程实例

ref:https://juejin.cn/post/7214342319347712057Android系统--Binder系统具体框架分析(一) - lkq1220 - 博客园第5课第1节_Binder系统_C程序示例_框架分析_哔哩哔哩_bilibiliXRefAndroid - Support AOSP 15.0 AndroidXRef & OpenHarmony 5.0https://cs.android.com/android/platform/superproject/main

wwwlyj123321的博客 631

java安卓j建立进程_Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析...

在前面几篇文章中,我们详细介绍了Android系统进程间通信机制Binder的原理,并且深入分析了系统提供的Binder运行库和驱动程序的源代码。细心的读者会发现,这几篇文章分析的Binder接口都是基于C/C++语言来实现的,但是我们在编写应用程序都是基于Java语言的,那么,我们如何使用Java语言来使用系统的Binder机制来进行进程间通信呢?这就是本文要介绍的Android系统应用程序框架...

weixin_39935319的博客 132

八、Android中 IPC 机制(5)之 Binder --- Android 应用层分析

什么是 Binder?通过上一篇文章的分析,我们知道了 Binder 就是 Android 系统自己提供的一种跨进程通信的方式,该通信方式在 Linux 中没有。那我们该如何使用它完成跨进程通信呢?这个时候,就从 Android 应用层来出发,Android 系统提供了一个 Binder 类,而这个类对象就是 Server 端和 Client 端进行通信的媒介,当 bindService ...

丶一个有梦想的老实人 的博客 420
上一篇: C++ - 对象模型之 编译器何时才会自行添加构造函数
下一篇: C++ - 对象模型之 类对象在执行时是如何生成的
G机器猫
博客等级 码龄16年 106粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值