Binder通信

深入浅出Android-Binder机制(图文+源码深入剖析) 所以 到底是什么,它就是一个用于表达 提供的功能的一个契约,也就是说 里有的方法, 都能提供,调用者你别管用的是 还是什么,只要拿到 ,你就可以直接调用里面的方法,它就是一个接口。同时 虽然实现了 ,但是并没有实现厘米的任何方法,它是一个抽象类,开发者需要自己子类化 去实现具体的功能。 实现了 ,并且实现了里面的方法,这些方法的实现我们下面再说。为什么 要分 和 呢?这是为了要适用于本地调用和远程调用两种情况。如果 Service 运行在同一个进程,那就直接用 ,因为它直接实现了 Ser 阅读详情

学习和使用Android Service也有一段时间了,今天有点总结和记录下个人感悟的想法。


首先,我们要明白,Binder只是Android中众多IPC方式中的一种。只不过相对于其它IPC方式,在Android中,Binder更为灵活和方便而已。

其次,Binder通信和业务之间的关系:

1>  Binder 是通信机制

2> 业务只是基于Binder进行通信,当然也可以使用别的IPC方式通信

说白了,Binder只是一种传递数据的方式,是为业务服务的。而Android帮我们把Binder的这种通信机制和我们的业务巧妙地封装融合在一起,使我们在实际应用过程中不用花费大量的精力和时间在IPC通信上,而是更加专注在业务逻辑的实现上。


AIDL 文件:


    package com.test.demo;   
      
    interface ITestService {       
        int Add();  
    }  

Build Java工程会根据ITestService.aidl文件生成ITestService.java文件:


/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: C:\\src\\com\\test\\demo\\ITestService.aidl
 */
package com.test.demo;
public interface ITestService extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.test.demo.ITestService
{
private static final java.lang.String DESCRIPTOR = "com.test.demo.ITestService";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
 * Cast an IBinder object into an com.test.demo.ITestService interface,
 * generating a proxy if needed.
 */
public static com.test.demo.ITestService asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.test.demo.ITestService))) {
return ((com.test.demo.ITestService)iin);
}
return new com.test.demo.ITestService.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_Add:
{
data.enforceInterface(DESCRIPTOR);
int _result = this.Add();
reply.writeNoException();
reply.writeInt(_result);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements com.test.demo.ITestService
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
@Override public int Add() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_Add, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
static final int TRANSACTION_Add = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
}
public int Add() throws android.os.RemoteException;
}

ITestService.java 中定义了ITestService接口和子类Stub以及Stub的子类Proxy

Stub类是一个抽象类,从Binder和ITestService接口派生而来,它是给Server端即Service使用的。我们要在Service中定义一个Stub类实例,并且实现这样一个Stub类实例中对应的ITestService的接口函数。

Proxy类也是从ITestService派生而来,它是给Client端用的。它其实就是Client访问Service的一个代理,它内部有一个BpBinder,通过它可以和Service里的BBinder进行通信。

Client访问Proxy感觉就像Client直接访问Service一样。


很好奇为什么Stub中的asInterface为什么不是直接返回Proxy对象?竟然有可能返回一个Stub对象?

/**
 * Cast an IBinder object into an com.test.demo.ITestService interface,
 * generating a proxy if needed.
 */
public static com.test.demo.ITestService asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.test.demo.ITestService))) {
return ((com.test.demo.ITestService)iin);
}
return new com.test.demo.ITestService.Stub.Proxy(obj);
}

Binder类中的queryLocalInterface和attachInterface方法:

    public IInterface queryLocalInterface(String descriptor) {  
        if (mDescriptor.equals(descriptor)) {  
            return mOwner;  
        }  
        return null;  
    }


   public void attachInterface(IInterface owner, String descriptor) {  
     mOwner = owner;  
     mDescriptor = descriptor;  
   }  

而我们从Stub的构造函数中可以看到,owner就是Stub对象的this指针,即当前的Stub对象自己
    /** Construct the stub at attach it to the interface. */  
    public Stub() {  
        this.attachInterface(this, DESCRIPTOR);  
    }  

所以,asInterface从一个IBinder对象可以转换成一个Proxy或是一个Stub对象。Proxy对象,很好理解,即Proxy里是封装了BpBinder, 通过BpBinder和server端的BBinder进行通信。 那Stub对象呢,什么时候会返回一个Stub对象呢? 我个人的理解是当service是一个本地service的时候,只有这种情况的时候拿到IBinder对象后是不需要Proxy进行跨进程通信,而直接可以使用Server端实现的Stub对象来访问service的方法(个人猜测,未经证实。后面有时间可以去测试下)。

Android Binder通信原理详解 相比其他的跨进程通信方式Binder有其自身特有的优点: 1. Binder使用mmap机制,只拷贝了一次数据,性能上仅次于**共享内存** 2. 采用Client/Server架构,实现面向对象的调用方式,调用如同调用Java对象,**使用简单** 3. 为每个App分配了UID/PID来鉴别身份标识,通信时检测UID/PID进行有效性检测,提高了**安全性** 在Android开发中常常使用Binder,但是却对其细节原理一知半解,自我重新学习总结一下Binder知识,希望我的学习心得对各位看官有用。 阅读详情

相关推荐

基于AIDL实现Binder通信 demo

A demo about Binder and AIDL

qq_59700927的博客 1508

android Binder queryLocalInterface 本地与远程

在使用Binder 通信的时候有一个疑问,他是如何判断我们是否需要跨进程也就是返回的是本地的Binder 对象还是BinderProxy。 带着问题,我们先来看下service 的绑定过程,我们通过 ServiceConnection 接口监听绑定情况,大致是这样的 bindService(new Intent(this, MyService.class), new ServiceCo...

豌豆的专栏 4245

Android Binder 进程间通信

Linux 中的系统内存可以分为两个不同的区域:内核空间和用户空间。内核空间是内核(即操作系统的核心)执行(即运行)并提供其服务的地方。内存由 RAM(随机存取存储器)单元组成,其内容可以以极高的速度访问(即读取和写入),但只能临时保留(即,在使用时或最多在电源保持开启时保留)。它的目的是保存当前正在使用的程序和数据,从而充当 CPU(中央处理器)和速度慢得多的存储之间的高速中介,后者通常由一个或多个硬盘驱动器 (HDD) 组成。用户空间是用户进程(即内核以外的所有内容)运行的内存位置的集合。

LiuYong_01的博客 1965

Android Framework跨进程通信IPC之5——Binder的三大接口

本片文章的主要目的是让大家对Binder有个初步的了解,既然是初步了解,肯定所是以源码上的注释为主,让大家对Binder有一个更直观的认识。PS:大部分注释我是写在类里面了, 重要的我会单独的拿出来。主要内容如下:1、IInterface 2、IBinder 3、Binder与BinderProxy类 4、总结所以可以这样说IInterface接口提供了类型转化的功能,将服务或者服务代理类转为IBinder类型。

Gaga246的博客 1112

【CubeMX】STM32G474 HRTIM 互补PWM与死区时间配置实战

本文详细介绍了如何使用STM32CubeMX配置STM32G474的高分辨率定时器HRTIM生成互补PWM波形并精确设置死区时间。通过实战步骤讲解时钟配置、死区计算与高级功能,帮助工程师在电机驱动和电源应用中实现精准控制,避免上下桥臂直通风险。

grpc6streamer的博客 722

Unity 实现动态网格地图生成与交互组件

本文详细介绍了在Unity中实现动态网格地图生成与交互组件的完整方案。从基础网格单元实现到高级交互功能,涵盖网格生成器核心逻辑、事件驱动架构、性能优化技巧以及六边形网格等特殊实现。特别适合游戏开发者学习如何构建战棋、模拟经营类游戏的可交互地图系统,提升开发效率与用户体验。

weixin_29015483的博客 1066

Android系统篇之—-Binder机制和远程服务调用机制分析

转载于:http://www.wjdiankong.cn/android系统篇之-binder机制和远程服务调用机制分析 一、前景概要 最近要实现Android中免注册Activity就可以运行的问题,那么结果是搞定了,就是可以不用在AndroidManifest.xml中声明这个Activity即可运行,主要是通过骗取系统,偷龙转凤技术的,这个知识点后面会详细讲解的,

09的专栏 696

ADS(Arm Developer Suite)安装的坑!

实验课老师让我们区安装ADS,作为嵌入式开发的工具,原本以为这只是一个简单的软件,但是当我安装的时候,我才发现这软件太难了!安装了我大半天,看了其他的博客之后,最终才安装成功???????? 安装过程的一个巨坑就是:安装路径!以及安装许可注册文件 如果没有注意路径,最后安装成功以后打开软件就是蜜汁报错???? 报错了怎么办?删掉已安装的东西,重新安装吧,而且要删干净 再次安装的时候,打开安装包是这个提示...

weixin_42795819的博客 8217

Android系统中的Binder通信机制分析(7)- Java 层的 Binder 机制

声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾… 文中参考了很多书籍及博客内容,可能涉及的比较多先不具体列出来了; 本文使用的代码是LineageOS的cm-14.1,对应Android 7.1.2,可以参考我的另一篇博客:cm-14.1 Android系统启动过程分析(1)-如何下载Nexus5的LineageOS14.1(cm-14.1)系统源码并编译、刷机

Android系统工程师--小馬佩德罗 1390

4.图像sensor的特性和驱动解析

例子:sensor驱动自己提供操作曝光时间的函数和获取曝光时间的函数,然后将这个函数注册到ISP库和3A算法库,3A算法库根据外部光照强度计算出一个Sensor曝光时间的设置值,ISP库得到这个设置值,然后通过Sensor之前注册的回调函数,把这个值设置到Sensor的硬件寄存器中去,实现整个过程。是为 ISP 配置正确的输入时序。(1)修改驱动源码(sambashar\Hi3518E_SDK_V1.0.3.0\package\mpp\component\isp\sensor\ar0130)

weixin_53762042的博客 3566

StarUML最新版汉化与破解二合一教程:5分钟搞定永久使用

本文提供StarUML最新版的高效使用指南,涵盖从安装到深度定制的全流程优化方案。包括软件获取最佳实践、界面个性化设置、核心建模技巧、团队协作策略及性能优化建议,帮助架构师和开发团队提升UML建模效率。特别推荐版本控制集成和文档自动化输出方案,适用于各类规模的项目开发。

weixin_42530732的博客 450

Binder通信原理

Binder进程间通信全面解析,包括Binder驱动、引用计数技术、内存映射、JAVA和C++层的代码等

z1804362542的博客 6166

LLC谐振变换器软启动,不只是“慢启动”,还是“智能启动”

LLC谐振变换器的软启动,不只是“慢慢来”,而是要在控制时序、限流、响应速度之间精妙权衡。而数字控制,特别是用查表法或混合信号法,为实现真正的“最佳轨迹”提供了可能。✨小Tips:如果你的系统成本敏感,选择查表法准没错;如果你的设计目标是超高速响应,那就上混合信号的高配方案!

weixin_43199439的博客 689

Android 大话binder通信

用故事的方式把binder通信的整个过程都描述出来,binder通信都经历了哪些节点,在这些节点上的数据有哪些变化,同时还对binder通信的关键细节进行介绍。通过本文您能对binder通信整体和细节都有一个全面的认识,比如*startActivity*方法到底都经历了哪些过程。

niurenwo的专栏 1553

基于深度学习的智能监考系统(UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集)

行为检测与识别:能够自动识别考生在考试中的异常行为,如作弊、看手机、交头接耳等。实时监控:在考试期间,系统能够对考生的行为进行实时监控,及时发出警报。用户交互:通过简洁易用的UI界面,便于监考人员进行实时监控、查看警报和视频回放等操作。行为分析与反馈:系统能够识别出考生的违规行为,并提供反馈。本文详细介绍了如何构建基于YOLOv5的智能监考系统,从数据集的准备、YOLO模型的训练,到UI界面的设计与实现,展示了一个完整的深度学习监控系统。

YOLO 781

【DRAM存储器三十五】LPDDR4介绍--主要技术特性之VREF training,为什么要做VREF training?

详述DDR4、LPDDR4需要做vref training的原因和训练过程

highman110的博客 2914

【Binder】Android跨进程通信:详解 Binder机制

粘合剂,意思为粘合了两个不同的进程。

qq_30885821的博客 1865

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

说说Binder通信

是否理解binder可以说是android学习的一个分水岭,因为这个概念太重要了,对于我们理解一系列android先关其它知识都是特别重要的,比如我们要分析Activity以及Service组件启动、ActivityManagerService以及WindowManagerService等系统服务,Binder通信都是绕不过去的一个重要知识点。这篇博客就来Binder的通信原理吧 ...

Yoryky的专栏 805

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android10.0 Binder通信原理(二)-Binder入门篇

Modify the binder to request 1M - 2 pages instead of 1M. The backing store in the kernel requires a guard page, so 1M allocations fragment memory very badly. Subtracting a couple of pages so that they fit in a power of two allows the kernel to make more e

IngresGe 的专栏 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Binder 通信机制(ServiceManager、AIDL、Binder Proxy)

Binder 是 Android 的核心 IPC 机制,它允许不同进程之间进行通信。Android 中的进程通常是隔离的,Binder 作为中介桥梁,通过对象引用的传递来解决进程间通信的问题。Binder 不仅支持不同应用之间的通信,还能在应用与系统服务之间进行高效的数据交换。Android 中的 Binder 机制是进程间通信(IPC)的基石,它通过AIDL和等组件实现了跨进程的高效通信。提供了服务注册和查找的机制,AIDL定义了进程间接口,则作为客户端与远程服务之间的桥梁,传递调用请求。

qq1014206292的博客 1246

【新手入门】Android基础知识(二):Binder进程间通信,理解Binder工作原理以及Binder实体、Binder引用、Binder代理概念

Android Binder机制是一种跨进程通信(IPC)解决方案,采用C/S架构实现进程间通信。核心组件包括:服务端(Server)提供功能服务并在ServiceManager注册;客户端(Client)通过ServiceManager获取服务引用;内核Binder驱动负责数据传输。通信过程涉及三个关键对象:服务端的Binder实体、客户端的Binder代理以及内核的Binder引用。服务调用时,客户端通过代理发起请求,请求经Binder驱动转发至服务端处理,结果再沿原路径返回。该机制实现了进程间透明的方

Chesnut. 1381

Binder跨进程通信

中文即 粘合剂,意思为粘合了两个不同的进程。binder是一种Android 实现跨进程通信(IPC)的方式,即Binder机制模型作用是实现跨进程通信。是一种虚拟的物理设备驱动,即binder驱动作用是连接service进程、client进程、service manager进程从Android代码的实现角度来说:是一个类,实现了IBinder接口,即Binder类作用是将binder机制模型以代码的形式实现。

L_2162的博客 1453

Android Binder通信01 - 架构介绍

其实这个binder通信就像打电话一样,ServiceManager就相当于运营商,你去向运营商开卡,就相当于注册了服务,这个服务在运营商的网络中可能一直用一个电话卡的ip来标识,由于ip非常难记住,运行商就给起了一个friendly name(友好的名字),也就是电话号码;当你拨通电话号码的过程中,你的拨号软件可能会先去运营商问问,这个这个电话号码的handle(ip地址)是多少,我要发语音信号过去。然后就很好理解了。

Ziwubiancheng的博客 1589

一文了解 Android Binder通信机制

Binder通信基础是Kernel的内存共享 一个进程空间分为 `用户空间` & `内核空间(Kernel)`,即把进程内 `用户 & 内核` 隔离开来 。进程间,`用户空间的数据不可共享`。进程间,`内核空间的数据可共享`。 `进程内 用户 与 内核 进行交互` ,Linux可使用`copy_from_user()`和`copy_to_user()`实现这两个跨空间拷贝,但Binder使用的方式又有所不同(后边会说道)。

bjxiaxueliang的CODING小栈 1991

Android Binder通信一次拷贝你真的理解了吗?

最近有读者在询问一个关于Binder通信"一次拷贝"的问题,说在学习Binder驱动的实现中看到有多次调用了copy_from_user和copy_to_user来进行数据的跨用户空间和内核空间的拷贝,但是为啥Android官方和绝大部分的博客还是说只进行了一次拷贝呢!这就是本篇博客的由来!

IT先森 1万+

Android binder通信实现进程间通信

Binder 是 Android 系统中用于跨进程通信的一种机制,它允许一个进程中的组件与另一个进程中的组件进行通信,从而实现进程间通信 (IPC)。Binder 机制是基于 Linux 内核提供的进程间通信机制 (IPC) 实现的。

朝气蓬勃 4694
上一篇: c++ 前置++与后置++的区别
下一篇: Android Service
nodeathphoenix
博客等级 码龄16年 97粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值