Android IPC 进程间通信实现理解

IPC-进程间通信 一、进程间通信(IPC:Inter Process Communication) 1、操作系统中的各个进程,通常存在于独立的内存空间,并且有着严格的机制来防止进程间的非法访问。但是,这并不代表进程与进程间不允许互相通信,相反,进程间通信是操作系统中一个重要的概念,应用非常广泛。 广义上,进程间通信是指运行在不同进程之间(不论是否在同一台机器)的若干线程间的数据交换。如下图所示: 原则上,任何跨进程的数据交换都可以称为进程间通信。IPC 中参与通信的进程,既可以运行在同一台机器上,也允许他们存在于各自的设备 阅读详情

众所周知,Android中的IPC(进程间通信)采用了Binder机制,那么要理解进程间通信是如何实现的,理解Binder机制就相当关键了。

首先,为什么Android的IPC要采用Binder机制呢,查阅资料,Binder机制的优点在于其少了一次拷贝过程,传统的IPC需要将发送端

发送的数据从用户空间copy到内核空间,在给到接受者时,再从内核空间copy给接受者,一次IPC请求需要两次拷贝,而Binder机制

不同的时仅做一个copy操作,发送IPC请求,会将Client端携带的数据copy到内核空间,放在共享内存中,通过内核与用户空间的内

存映射到同一片物理空间,从而Server通过相关地址直接获取到该共享内存中的相关数据,而不需要将其从内核空间copy到用

户空间,这样的机制提高了IPC的性能。


其次,Binder机制的组成:

1) 用户空间: 

    Client: 发起IPC请求,通过从ServiceManager处获取的Service进程Binder代理对象的引用,从而调用Service的相关方法(Service的服务接口可以通过AIDL文件定义或者自定义接口类)

   Service:需要在ServiceManager中注册,实现AIDL中的Stub类,其中包含提供的服务接口,Publish Service的Binder对象

   ServiceManager:负责管理系统中的Service,维护Service的Binder对象的引用,提供给Client以名称方式查询Service的服务接口以及Service

                                    的Binder对象引用

2) 内核空间: 

   Binder驱动:负责进程间的数据的传递,通过mmap内存映射实现共享内存, 连接 Client端与Server端


其实个人觉得Binder机制的原理大致了解一些就ok了,因为毕竟Binder机制大多数时候不需要去修改,而关键的是在理解Binder机制的基础上

如何在Binder机制基础上实现IPC,以及能够看懂Android系统中的IPC实现,解决进程间通信出现的问题。


如果从Code中去详细了解Binder的具体实现,可以参考如下blog进行详细的学习:

1.Android Bander设计与实现 - 设计篇

2.浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路


在Android Framework中有很多需要用到IPC的地方,比如startActivity, 在APP中调用startActivity这其实就发起了一次IPC请求,因为APP一般跑在

自己的进程中,而ActivityManagerSerive(AMS)运行在system_server进程中,这里启动Activity的请求其实就是一次IPC请求,APP进程将该请求发

送到AMS所在进程中,通过请求AMS的startActivity服务将想要启动的activity启动起来。


在实现IPC通信的时候,每个进程都会定义自己的Binder类,并创建Binder对象,一般Binder实体对象存在于Server进程中,而Client进程想要通过

Binder机制进行服务请求,需要通过ServiceManager获取一个Server进程中Binder代理对象的引用。

实现Binder对象很关键,也比较繁琐,所以为了方便开发者进行IPC的开发,Android提供的AIDL(Android Interface Definition Language)接口定义语言,

ADT中的aidl工具会根据用AIDL书写的XXX.aidl文件自动生成对应的接口类,接口类继承android.os.IInterface,其包含Stub和Proxy两个内部类,它

们的作用分别是:

接口类: 例如IServiceAIDL.aidl,其生成的接口类为IServiceAIDL.java,继承自android.os.IInterface, 包含在XXX.aidl文件中定义的所有接口

Stub类: 供Server进程用,抽象类,继承自android.os.Binder,implements IServiceAIDL接口,Server进程中Binder对象的类型,即Server进程的Code

             会去具体实现此Binder类并将其中的接口进行具体的实现,定义继承自此类的子类或者直接匿名类实现对应的接口,此类中包含onTransact方法,这

           个方法会被Binder驱动回调,根据传入的接口代码(int代号),找到需要调用Server进程的哪个接口。

Proxy类: 供Client进程用,implements IServiceAIDL接口类,实现该接口类中的所有方法,其为Stub类的内部类,Server进程Binder类的代理对象,Client

              调用Proxy中的接口(即在XXX.aidl文件中定义的服务接口),Proxy中对该接口的实现最终通过调用IBinder的transact方法进入到Binder驱动程序的实

             现流程中,Binder驱动处理完成即回调Stub类的onTransact方法去调用Server的服务实现


这里多说一句,为什么要提定义接口呢,进程间进行通信无非是想要用目标进程的服务,那么为了使得程序松耦合,服务定义完接口就不再修改,

Client如果想使用某个服务,直接调用对应的接口就可以了,不用关心Server是如何实现的,相当与在Client和Server之间抽象出一层接口,Server定

义好接口之后,具体实现可以根据具体情况进行修改,不会影响到Client接口的使用。


AIDL方便了IInterface接口类的自动生成,让开发者专注在服务接口的定义上,不用关注IInterface的繁琐的细节实现,当然根据自己的需求完全可以自己写

继承自IInterface的接口类,不需要借助AIDL工具。AIDL只是一个IPC的工具,跟IPC实现原理没有关系,仅帮忙将aidl定义的接口生成符合Binder机制的如上

讲解的三个重要类。下面分析分析IPC中这个必备的IInterface子类的实现方式:

1)通过aidl文件方式自动生成IInterface的子类,以一个简单的AIDL Demo来说明

      a. 仅关注接口定义服务端需要提供的接口,按照AIDL规则书写XXX.aidl文件

          aidl文件书写规则参考Android Interface Definition Language (AIDL)

          IServiceAIDL.aidl         

// IServiceAIDL.aidl
package com.xm.androiddemo;

//aidl仅支持一些接本的java类型,除了那些基本类型均必须import进来
import com.xm.androiddemo.IActivityAIDL;

// Declare any non-default types here with import statements

//Server 提供给 client 的接口文件定义
//Service(Server) 暴露给 Activity(Client) 的接口定义在 aidl文件中

interface IServiceAIDL {

    void callService();

    //在 Activity 中注册 ActivityADIL 到Service中,使得 Service 可以回调 Activity 中的方法
    void registActivityCallBack(IActivityAIDL callback);
}

     b. Eclipse或者Android Studio会自动根据如上aidl文件生成IServiceAIDL.java文件

         Eclipse生成的gen目录下,Studio生成在$CodePath/app/build/generated/source/aidl/

          debug/com/xm/androiddemo/IServiceAIDL.java

         同样你可以自己运行aidl工具来生成.aidl文件对应的java文件: aidl IServiceAIDL.aidl $outputPath

         具体的Code我就不贴了,自行在IServiceAIDL.java中找到IServiceAIDL, Stub, Proxy三个类,

         仔细看看理解一下

    c. Server进程中需要提供服务的Code中实现Stub类中的接口

    d.Client进程中通过创建IServiceAIDL对象来调用aidl文件中定义的服务接口


   Demo的细节参考如下两个例子:

         一个简单的demo学习Android远程Service(AIDL的使用)

         AIDL Demo


2)开发者自己写IInterface子类,定义必要的接口,以ActivityManagerService为例来说明

      IPC Binder机制涉及的三个类对应名字:

      接口类:IActivityManager.java            包含所有ActivityManagerService的提供的服务接口以及接口代码(数字代号)

      Stub类:ActivityManagerNative.java  继承自Binder并implements IActivityManager接口类

      Proxy类:ActivityManagerProxy.java  ActivityManagerNative的内部类,implements IActivityManager接口类

     

     Client与Server对以上各类的实现:

     Client进程: Instrumentation类通过ActivityManagerNative.getDefault()获取到IActivityManager接口对象,由于AMS

                     属于远端进程因此queryLocalInterface应该返回null,从而new一个ActivityManagerProxy对象,传入AMS

                     进程的Binder对象引用,调用ActivityManagerProxy的startActivity方法,在startActivity的实现主要将IPC

                     需要传输的数据封装成Parcel对象,然后调用Binder的transact方法,进入Binder驱动流程。

    Server进程: ActivityManagerService继承自ActivityManagerNative,也即ActivityManagerService本身为本进程的Binder

                    类型,实现IActivityManager定义的服务接口。接着上面Client的startActivity执行流程,进入Binder驱动流程

                    之后,底层驱动处理完毕之后回调上层ActivityManagerNative的onTransact方法,根据传入的接口代号调用

                    ActivityManagerService的实现的startActivity

    印证如上的分析,简单添加了几句log,打印顺序同上面分析一致

    01-01 08:08:16.112 D/ipclog ( 1817): ActivityManagerProxy transact START_ACTIVITY_TRANSACTION   
    01-01 08:08:16.122 D/ipclog (  596): ActivityManagerNative onTransact START_ACTIVITY_TRANSACTION
    01-01 08:08:16.122 D/ipclog (  596): ActivityManagerService startActivity

   如上log信息可以看两个进程号1817和596,596为AMS所在Server进程,1817为应用进程

   应用进程transact一个IPC请求之后,Binder驱动通过onTransact回调到Server进程调用服务接口的实现。


 IPC的内容暂且分析到这里,总的来说对这个流程有了个初步的认识,深层次的东西回头再学习补充。。。


参考

1.http://blog.youkuaiyun.com/linmiansheng/article/details/42438813




   



Android 进阶——Binder IPC详解之学习Binder IPC前应该掌握的相关常识(一) Android OS=Android Runtime+Linux Kernel。在Android系统中每一个应用程序都运行在独立的进程中(确保了某个进程异常而不会影响另一个进程的运行),自然就少不了进程间通信IPC(Internet Process Connection)。 阅读详情

相关推荐

Android中的进程间通信(IPC)方式及示例代码

进程间通信(IPC)是在Android开发中常用的一种技术,它允许不同的进程之间进行数据交换和通信。在Android系统中,应用程序的不同组件(如Activity、Service和BroadcastReceiver)运行在不同的进程中,因此需要使用IPC来实现它们之间的通信。需要注意的是,IPC通信可能涉及到进程间的安全性和性能问题,开发者应根据具体的需求和场景选择合适的IPC方式。以上是Android中常用的IPC通信方式及相应的示例代码。// 处理接收到的消息。// 处理接收到的消息。

QwwyEmacs_Lisp的博客 344

ipc logging

ipc log

Fybon的专栏 3902

buflog:使用ipc共享内存的简单缓冲日志记录库

博客 这是一个使用ipc共享内存的简单缓冲日志记录库。

Qcom 平台 USB IPC log 重定向到 kernel 方法

【代码】Qcom 平台 USB IPC log 重定向到 kernel 方法。

笔记 480

UniDexGrasp++算法实战:无需预生成姿态的灵巧抓取测试指南

本文详细解析了UniDexGrasp++算法在灵巧抓取测试中的实战应用,该算法无需预生成姿态即可实现高效抓取,特别适合处理形状不规则的物体。文章涵盖了环境配置、数据集优化、训练流程及实际测试中的调参技巧,帮助开发者快速掌握这一ICCV 2023提出的先进算法。

weixin_29045585的博客 279

Ubuntu离线情况下安装gcc编译器

Ubuntu离线情况下安装gcc编译器1.系统版本2.安装说明3.异常处理 1.系统版本 (1)Ubuntu系统版本:20.04.1LTS; (2)gcc编译器版本:gcc-9.3.0(下载链接为https://download.youkuaiyun.com/download/qq_18350351/13762214); 当前可找到的gcc最新版本为gcc-10,但是笔者在安装gcc-10版本时发现一些依赖项无法安装,因此选取了gcc-9版本。如果是在联网情况下安装,直接使用apt相关的安装指令即可。 2.安装说明 安

GreenHand的博客 3932

安卓IPC机制学习

其中Server,Client,SMgr运行于用户空间,驱动运行于内核空间。Binder的实体是位于Server中的对象,遍布于client中的入口可以看成指向这个binder对象的‘指针’,获取指针便可以操作binder,因此其引用却遍布于系统的各个进程之中,所以Binder对象可以看成是一个可以跨进程引用的对象,星罗棋布的引用仿佛粘接各个应用程序的胶水。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程。

m0_71272694的博客 311

Zigbee通信(CC2530终端 + ESP32-C6协调器)

实现了CC2530 zigbee终端与ESP32-C6 zigbee协调器的通信交互。

Ecsply的博客 2563

关于内核打印信息的查看

第一个ipc_logging cat sys/kernel/debug/ipc_logging/xxxx/xxx 第二个 此外,打印中还经常看到pr_debug函数,可以动态的打印调试信息(http://blog.youkuaiyun.com/weiqifa0/article/details/44038907) 如要打开该函数,只需在内核中配置CONFIG_DYNAMIC_DEBUG,并且

LEAD_SOLO的专栏 2319

【基于51】红外寻迹智能小车 - 代码篇

这是一个基于C51单片机的红外巡线智能小车,是一个适合嵌入式单片机、C语言初学者练习的小Demo,文章提供完整的项目思路、免费的源代码。

ZER00000001的博客 3万+

把 Client 当成 ABAP 系统的多租户底座:从 sy-mandt 到 CDS_CLIENT 的隔离机制与工程实践

本文深入解析SAP ABAP系统中Client概念的本质与应用。Client不仅是数据表的MANDT字段,更是会话级别的隔离边界,贯穿用户登录、授权和数据访问控制全过程。文章从ABAP SQL的隐式Client处理机制出发,详细介绍了USING CLIENT、USING ALL CLIENTS等安全跨客户端访问方式,并对比了传统CLIENT SPECIFIED的风险。同时阐述了ABAP CDS中@ClientHandling注解的类型与算法选择,包括#AUTOMATED自动拼接和#SESSION_VARIA

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 182

14-进程间通信-消息队列(功能:传输数据)

一 什么是消息队列 二在Linux中使用消息队列 三使用消息队列进行进程间通信示例一、 什么是消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。Linux用宏MSGMAX和MSGMNB来

a2604539133的博客 866

ADRC自抗扰PD+ESO控制(博途SCL源代码)

文章浏览阅读119次。线性自抗扰控制(LADRC)系统算法框图-优快云博客文章浏览阅读335次。NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。ADRC自抗扰PD+ESO控制(CODESYS测试+完整ST代码)-优快云博客。

RXXW_Dor的博客 1315

Android IPC(inner process communication)进程间通信(关于面试知识点整理)

我们android在面试的时候,面试官会问到我们IPC,这个被问到的概率非常大,当然我每一次都会被问到,所以我总结了一下IPC,通过看一些大牛的书籍,整理了一些知识点,希望能帮到大家; 一。android IPC简介  IPC是Inter-process  Communication的缩写。含义就是进程间的通讯或者夸进程通讯,是指两个进程间进行数据交换的过程,那么什么是进程,什么是线程,进程和

wk_先森的博客 887

【AHE数据集】中国2019年多源热排放数据集-500m空间分辨率

【AHE数据集】中国2019年多源热排放数据集

WW、forever的博客 411

华为OD机试 - 开源项目热度榜单(Java 2025 C卷 100分)

H = Wwatch X#watch + Wstar X#star +Wfork X#fork +Wissue X#issue +Wmr X#mr H表示热度值,Wwatch、Wstar、Wfork、Wissue、Wmr分别表示5个统计维度的权重,#watch、#star、#fork、#issue、#mr分别表示5个统计维度的统计值。

学Java,找哪吒 1755

Android进程间通信-intent和IPC

Intent 和 IPC 默认情况下,Service构造于应用进程中,并且和其他所有的组件一样,都在进程的主线程中运行,所以默认你下在service和activity中可以直接使用Handler.(这个开发了好久才知道) Android为了屏蔽进程的概念,利用不同的组件[Activity、Service ]来表示进程之间的通信!有了Intent这种基于消息的进程内或进程间通信模型,...

dztdztdzt的专栏 416

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

(十六)进程间通信(IPC)

AIDL 通过定义接口文件,生成相应的 Java 类,客户端和服务端通过这些类进行通信。Binder 是 Android 提供的核心 IPC 机制,基于 OpenBinder 实现,提供高效的进程间通信能力。AIDL 是 Android 提供的一种接口定义语言,用于定义进程间通信的接口。Messenger 是基于 AIDL 的封装,简化了消息传递过程。ContentProvider 是 Android 提供的一种数据共享机制。

小新的博客 948

老版QQ原生表情gif动态

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

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

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

Android IPC

首先创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Sub中的抽象方法,在Service的onBind方法中返回这个类的对象,然后客户端就可以绑定服务端Service,建立连接以后就可以访问远程服务端的方法了。Binder是Android中的一个类,它实现了IBinder接口。我们通过socket来实现进程间的通信。其次在客户端绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。

huaihong1986的博客 918

Android中IPC的几种方式详细分析与优缺点分析

Android进程间通信(IPC:Inter-Process Communication)的几种主要方式如下 1.使用Bundle   ----> 用于android四大组件间的进程间通信 android的四大组件都可使用Bundle传递数据  所以如果要实现四大组件间的进程间通信 完全可以使用Bundle来实现 简单方便   2.使用文件共享  ---->用于单线程读写 这种

zeng622peng的专栏 4113

Android中的IPC(进程间通信)机制

一、IPC的说明IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程。IPC不是Android独有的,任何一个操作系统都需要有相应的IPC机制,比如Windows上可以通过剪贴板,管道和邮槽来进行进程间通信;Linux上可以通过命名管道、共享内容、信号量等进行进程间通信。对于Android来说,它是一种基于Linux...

渐忘的歌 903

Android的IPC机制(上)——Bundle、文件共享、Messenger的简单实现

IPC机制   IPC(Inter-ProcessCommunication),含义为进程间通信或跨进程通信,是指两个不同进程之间进行数据交换的过程。   任何操作系统都有其相应的IPC机制,例如:Windows上可以通过剪贴板、管道和邮槽等来进行进程间通信。Linux上可以通过命名管道、共享内存、信号量等来进行进程间通信。Android是一种基于Linux内核的移动操作系统,对于Android来说,它也有其特有的进程间通信方式。 一、Bundle   Android的四大组件中的三大组件(Activity

lly-Rachel的博客 340

android ipc 简书,Android的IPC机制

IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程。进程和线程是两个不同的概念,它们之间是包含与被包含的关系。进程:一个执行单元,指一个程序或应用;线程:CPU调度的最小单元;一个进程可以包含多个线程。Android应用内多进程唯一的方法:给四大组件在AndroidMenifest中指定android:proces...

weixin_30652105的博客 185

Android IPC机制进程间通信方式

IPC的几个基础知识:序列化和Binder,本章将详细介绍各种跨进程同行方式。具体的方式有很多,比如可以通过在Intent中附加extras来传递信息,或者通过共享文件的方式来共享数据,还可以采用Binder的方式来跨进程通信,另外ContentProvider天生就是支持跨进程访问的,隐藏我们也可以采用它来进行IPC...

啊sir的专栏 394

Android IPC --Binder之Linux基础篇(一)

本篇文章我就来扒一扒Android 进程间的通信-Binder 机制。 我们都知道Android 是基于Linux系统来实现的,因此,我们有必要来了解一下,为什么Android 不使用Linux本身有的进程通信机制,而是要自己撸一个Binder 这玩意来实现进程间通信。 接下来,我们简要的介绍下Linux 进程间通信的几种方式。介绍Linux IPC机制,旨在了解其思想,得出其优缺点,便于找到Android中使用Binder 的依据,故不做深入的分析,如果想要深入分析,可以查看本文末尾提到的参考文献列表,读

m0_64365896的博客 720

Android进程间通信机制

进程/线程简介及区别 什么是进程? 狭义:进程是正在运行的程序的实例。 广义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。 什么是线程 程序中单一的顺序控制流程 进程内相对独立的、可调度的执行单元 系统独立调度和分派CPU的基本单位 进程线程区别   一个进程至少有一个线程 进程可以包含多个线程 进程在执行过程中拥有独立的内存空间,而线程运行在进程内   演示...

我是永恒的博客 793
上一篇: Avoiding memory leaks ---- Context Leak 篇
下一篇: Android Code Style Guidelines for Contributors
AnnaLoad
博客等级 码龄17年 7粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值