android中的跨进程通信的实现(一)——远程调用过程和aidl

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

android在设计理念上强调组件化,组件之间的依赖性很小。我们往往发一个intent请求就可以启动另一个应用的activity,或者一个你不知道在哪个进程的service,或者可以注册一个广播,只要有这个事件发生你都可以收到,又或者你可以查询一个contentProvider获得你想要的数据,这其实都需要跨进程通信的支持。只是android将其封装的如此简单,应用开发者甚至完全不用关注它是不是和我在一个进程里。

我们有没有想过安全性问题,如此简单就可以跨进程的访问,安全性问题怎么保证。本来每个进程都是一个孤岛,而通过ipc,这个孤岛却可以和世界通信了。这里简单介绍下android中的安全机制。

android的安全机制分为三层。最基础的一层,android将数据分为system和data两个区。其中system是只读的,data用来存放应用自己的数据,这保证了系统数据不会被随意改写。第二层用来使应用之间的数据相互独立。每个应用都会有一个user id和group id,只有相同的user id并且来自同一个作者,才能访问它们的数据。作者通过对apk签名来标识自己。签名和uid构成了双重的保证。第三个层次就是权限体系,这个就不用多说了。

拉回正题,那么android是如何实现ipc的呢?答案是binder。我打算用两篇来介绍android的binder机制,这一篇着重如何使用,介绍跨进程调用的过程和aidl。另一篇着重binder实现机制。

Binder并不是android最早开始使用,它发源于Be和Palm之前的OpenBinder,由Dianne Hackborn领导开发。Hackborn现在就在google,是android framework的工程师,我们可以从https://lkml.org/lkml/2009/6/25/3看一下,Hackborn如何描述binder。一句话总结:

In the Android platform, the binder is used for nearly everything that
happens across processes in the core platform. 

可是android将binder几乎封装的不可见,我们看下层次结构是怎么样的。


最底层的是android的ashmen(Anonymous shared memoryy)机制,它负责辅助实现内存的分配,以及跨进程所需要的内存共享。

AIDL(android interface definition language)对Binder的使用进行了封装,可以让开发者方便的进行方法的远程调用,后面会详细介绍。

Intent是最高一层的抽象,方便开发者进行常用的跨进程调用。

关于如何使用intent去跨进程的启动一个activity或者service等,这里就不再介绍了,是android中非常基础的内容。

这里讲如何实现远程的方法调用。在android中对方法的远程调用无处不在,随便打开framework/base中的包,都会发现很多aidl文件。AIDL是android为了方便开发者进行远程方法调用,定义的一种语言。使用aidl完成一个远程方法调用只需要三个步骤:

1.用aidl定义需要被调用方法接口。

2.实现这些方法。

3.调用这些方法。

我们拿ApiDemo中的例子来学习。在app包下面有一个ISecondary.aidl

interface  {
    /**
     * Request the PID of this service, to do evil things with it.
     */
    int getPid();
    
    /**
     * This demonstrates the basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
}
看起来和java没有什么区别。可以看到它定义个了两个接口方法。从这里我们可以知道AIDL(android接口定义语言的由来)。android会将该aidl生成一个java文件(如果你使用eclipse,会自动生成。在gen目录下。),生成的代码如下:

/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: /home/dd/workspace/ApiDemos/src/com/example/android/apis/app/ISecondary.aidl
 */
package com.example.android.apis.app;
/**
 * Example of a secondary interface associated with a service.  (Note that
 * the interface itself doesn't impact, it is just a matter of how you
 * retrieve it from the service.)
 */
public interface ISecondary extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements
Android中的跨进程通信方案总结-AIDL的使用 首先,创建个.aidl文件,用于定义跨进程的接口。在这个示例中,我们创建个叫的文件。 阅读详情

相关推荐

Android中的跨进程通信方案总结-AIDL运行原理

开发者首先通过.aidl文件定义服务接口方法,这些方法允许客户端调用。在编译时,Android 编译器会自动生成相应的StubProxy类。Stub(服务端实现):服务端使用的 Binder 对象实现AIDL 接口方法,实际调用发生在这里。Proxy(客户端调用代理):在客户端调用时,代理类会将方法调用封装成 IPC 请求,通过 Binder 通道传输到服务端。首先定义个.aidl文件,它描述了服务接口可以跨进程调用的方法。假设我们希望创建个计算服务,包含个add方法来实现加法运算。

sunxingzhesunjinbiao的专栏 1237

Android进程间通信之binder - 可能导致的异常

在平常程序运行过程中,可能碰到最多跟binder相关的异常是RemoteException,但本文只分析跟binder机制相关的异常,而RemoteException是server端逻辑导致的其它异常在client端的表现。 跟binder机制相关的异常有:android.app.RemoteServiceException: can't deliver broadcast,JavaBinder: !!! FAILED BINDER TRANSACTION !!!,TransactionTooLargeEx

over666的点滴记载 1万+

AIDL Service实现跨进程通信

AIDL Service用于在不同进程间进行数据交换,即所谓的跨进程通信(interprocess communication,简称IPC)与绑定本地Service不同的是,本地Service的onBind()方法会直接把IBinder对象本身传给客户端的ServiceConnection的onServiceConnected()方法的第二个参数。但远程Service的onBind()方法只是将IB

zh175578809的博客 2742

Android中的binder机制

<!-- p {margin-bottom:0.21cm} --> Binder使用client-server的通信方式: 个进程作为server提供诸如视频/音频解码,视频捕获,地址本查询,网络连接等服务;多个进程作为client向server发送服务请求,获得所需要的服务。 对于Binder而言,Binder可以看成是Server提供的实现个特定服务的访问接入点

li_heaven1的专栏 1230

Binder的异常之分析

Binder的异常之分析 在Adroid的世界里,每个程序是互相独立运行的。若要请求协助就需要Binder机制,而此Binder就是种Client –Server的设计。其中间运行机制不在这里详细描述,间单来讲Binder就是种程序沟通接口,运用的基本原理就是共享内存加代理模式。因此每个程序是不会知道对方的运作流程,只能知道有求必应这功能。但是若对方发生异常,虽然使用方无法得知,但也不能置之不理。这篇心得就是要来分析当Server在处理Client端需求发生异常时,Binder是如何来处理。 .

幻想世界 2186

关于shizuku系统级免root调用执行命令行等等系统方法的方案

安卓无线调试调用部分root命令

qq_41340838的博客 4132

A default binder has been requested, but there is no binder available

在搭建 spring-cloud-stream demo的时候,出现了下面这个错误: org.springframework.context.ApplicationContextException: Failed to start bean 'inputBindingLifecycle'; nested exception is java.lang.IllegalArgumentExcepti...

qq_30346413的博客 2772

Android中的跨进程通信实现)——远程调用过程aidl

(转载)http://foocoder.com android在设计理念上强调组件化,组件之间的依赖性很小。我们往往发个intent请求就可以启动另个应用的activity,或者个你不知道在哪个进程的service,或者可以注册个广播,只要有这个事件发生你都可以收到,又或者你可以查询个contentProvider获得你想要的数据,这其实都需要跨进程通信的支持。只是androi

zhuhai__yizhi的专栏 740

Android跨进程通信——AIDL原理解析

本篇文章的内容如下: 1 AIDL简介 2 为什么要设置AIDL 3 AIDL的注意事项 4 AIDL的使用 5 源码跟踪 6 AIDL的设计给我们的思考 7 总结 AIDL简介 AIDL个缩写,全程是Android Interface Definition Language,也是android接口定义语言。准确的来说,它是用于定义客户端/服务器通信接口的种描述语言。它其实种IDL语言,可以拿来生成用于IPC的代码。从某种意义上说它其实是个模板。为什么这么说?因为在我们

Jason_Lee155的博客 9571

Android Service的跨进程通信实战&Service/AIDL远程调用过程解析(Android Q)

Service的跨进程通信实战 设想这么个场景,我们有2个APP(或者2个进程,均可),其中个APP需要提供个Person相关的服务(该服务有个名为eat的接口),我们叫它PersonServer;另个APP需要访问PersonServer提供的服务,我们叫它Client。也就是现在有2个APP,个作为Server端,提供服务,另个作为Client端,使用服务。 我们来看如何在An......

卜大爷的博客 2万+

Android跨进程通信Binder机制与AIDL实例

文章目录进程通信1.1 进程空间划分1.2 跨进程通信IPC1.3 Linux跨进程通信1.4 Android进程通信Binder 跨进程通信2.1 Binder简介2.2 Binder驱动2.3 Binder原理AIDL编程Demo3.1 服务端3.2 客户端 在操作系统中,进程与进程间的内存数据都是不共享的。这样做的目的,是为了避免进程间相互操作数据的现象发生,从而引起各自的安全问题。为了实现进程隔离,采用了虚拟地址空间,两个进程各自的虚拟地址不同,从逻辑上来实现彼此间的隔离。两个进程之间要进行通信

道阻且长,行则将至 6698

Android跨进程通信--AIDL原理解析

AIDL个缩写,全程是Android Interface Definition Language,也是android接口定义语言。准确的来说,它是用于定义客户端/服务器通信接口的种描述语言。它其实种IDL语言,可以拿来生成用于IPC的代码。从某种意义上说它其实是个模板。为什么这么说?因为在我们使用中,实际起作用的并不是我们写的AIDL代码,而是系统根据它生成的个IInterface的实例的代码。

行知致简的专栏 6911

Android AIDL实现跨进程Activity与Service的通信

、什么是AIDLAIDL:Android Interface Definition Language 用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication,IPC)的代码。 官方AIDL定义: On Android, one process cannot normally access the memory of anoth...

familyyan的博客 3231

深入解析Android AIDL实现跨进程通信的利器

AIDL支持多种数据类型,包括基本数据类型、自定义数据类型其他AIDL接口类型。在AIDL中,自定义数据类型需要使用parcelable关键字进行声明。

虎哥LoveDroid 1877
上一篇: android 窗口管理框架解析
下一篇: web app指南之构建html5离线应用
noTice501
博客等级 码龄16年 284粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值