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

AvFrame和AvPacket

在FFmpeg中,未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存;针对视频编码器,其流程为从数据源获取图像格式的输入数据,保存为AVFrame对象并传入编码器,从编码器输出AVPacket结构。

Lce的专栏 3236

联想Y9000P安装Ubuntu20.04记录

联想Y9000P 2022安装Ubuntu20.04问题记录

Legendyyy的博客 7115

安卓IPC机制学习

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

m0_71272694的博客 311

Windows 10/11下R与RStudio最新版安装避坑指南(含镜像加速配置)

本文提供了Windows 10/11系统下R与RStudio最新版的详细安装指南,包含镜像加速配置和常见问题解决方案。通过分步教程帮助用户避开安装陷阱,优化开发环境设置,特别适合国内用户快速搭建高效的数据分析平台。

weixin_29065959的博客 1005

关于内核打印信息的查看

第一个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

声品质粗糙度matlab,声品质的应用分析方法

声品质的应用分析方法2016-04-05 09:18:57阅读次数:14198摘要:声品质分析在噪声的主观评价方面已经得到越来越多的应用。本文比较了声品质分析与传统计权声级的区别,并介绍了在声品质分析的实际应用中,针对稳态信号、非稳态信号的几种不同分析方法,以及各分析方法的要求和特点。关键词:声品质,响度,尖锐度,粗糙度,波动度1前言传统评价噪声的方法主要为计权声压级,用以反映声音的大小。但是人耳...

weixin_30767323的博客 2438

计算机保研/考研面试题——计算机组成原理篇

本文总结了985和华五学校习计算机保研/考研常问面试时的计算机组成原理题,欢迎点赞、收藏、评论、关注

安晴晚风的博客 7547

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

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

a2604539133的博客 866

Sigrity Power Tree如何进行直流压降仿真分析操作指导

Sigrity Power Tree模式可以用于前仿真,在没有layout文件的情况下对电源进行直流压降仿真分析,用于评估原理图设计以及器件选型是否合理。Model:设置为Equal Current,设置为等电源模型,意思该负载每个电源pin都是等电流的。Current:设置每个负载的电流,U30为3A,U3-U6各为1A。Nominal Current:设置能够承载的最大电流,设置为10A。Upper/ Lower Tol:设置为压降范围为5%Output Current:设置输出电流为10A。

weixin_54787054的博客 730

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

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

wk_先森的博客 887

Oracle EBS Interface/API(29) - AP发票API

续上编文章《Oracle EBS Interface/API(28) - 客制化开发AP付款API》背景,介绍如调用官方提供标准AP发票API调用 用户界面 Invoices(Payables Manager->Invoices->Entry->Invoices) Open Interface Invoices(Payables Manager->Invoices->Entry->Open Interface Invoices) 快速参考 参考点 内容.

陈显平的专栏-Oracle EBS 1150

6、SAP HANA 建模全解析

本文全面解析了 SAP HANA 建模的核心内容,包括属性视图、分析视图和计算视图的创建与使用。文章详细介绍了建模工具的安装、不同视图类型的适用场景及操作步骤,并通过对比和案例分析帮助读者更好地理解建模流程。此外,还涵盖了建模过程中的注意事项及性能优化建议,为 SAP HANA 用户提供实用的建模指导。

juice的博客 203

Android进程间通信-intent和IPC

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

dztdztdzt的专栏 416

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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

小新的博客 948

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android IPC

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

huaihong1986的博客 918

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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、付费专栏及课程。

余额充值