3. AIDL与Proxy-Stub设计模式

本文深入探讨了Android中的IPC通信机制,重点介绍了Proxy-Stub设计模式及其在实现 Binder 中的角色。通过复习IBinder接口,阐述了其一般用途,并通过代码实战展示了如何在Activity中使用BroadcastReceiver以及Binder线程中的操作。进一步讨论了如何包装IBinder接口,以及Proxy和Stub类的编写。最后,详细解释了AIDL(Android Interface Definition Language)工具在生成Proxy和Stub类中的作用,它简化了跨进程通信的复杂性,将IBinder接口转换为用户自定义接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IPC的Proxy-Stub设计模式

在这里插入图片描述

1. 复习IBinder接口

在这里插入图片描述

单层框架图:

在这里插入图片描述

两层框架:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对于App而言,只能看到上层的op接口,但是看不到fun()接口了。

改变了t的实现接口:

在这里插入图片描述

在这里插入图片描述

App还是需要直接访问interface接口,并没有完全的隔离开来。

在这里插入图片描述

改进的版本:

在这里插入图片描述

建立了中间的曹操类。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. IBinder接口的一般用途

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对于上述的代码中,开发者需要编写额外的代码,加重了开发者的负担。

在这里插入图片描述

在这里插入图片描述

本单元没有用“proxy-stub” -> 下单元采用“proxy-stub” -> AIDL

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

从Binder thread pool中选择一个线程执行service中的代码。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.1 myActivity代码实战

在 myActivity 中创建一个 BroadcastReceiver
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.2 myBinder代码实战

下面的代码实在binder thread中执行的。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

step1: Activity -> Service: oncreate()
step2: Service -> new myBinder and create a new thread
step3: myActivity -> myBinder : ontransact()

3. 包装IBinder而接口(如何写Proxy及Stub类)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4. 谁来写Proxy类和Stub类呢?

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5. AIDL工具(谁来写Proxy及Stub类)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

类别模板

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

详解AIDL

在这里插入图片描述

实际采用的适配器的模式,将IBinder接口转换成用户自己定义的接口。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Proxy主要承担了编码的作用,同时还需要实现客户自定义的接口。

Stub主要承担了解码的作用,同时还需要实现客户自定义的接口。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

### ITelphony.aidl 在 Android 中的作用使用方法 #### 1. ITelphony.aidl 的基本概念 `ITelephony.aidl` 是 Android 提供的一种接口定义语言AIDL),主要用于实现跨进程通信(IPC)。它允许应用程序通过 Binder 机制访问电话功能,而无需直接操作底层硬件资源。这种设计使得开发者可以安全地调用核心电信服务而不违反权限隔离原则[^1]。 具体来说,`ITelephony.aidl` 定义了一系列电话管理相关的函数,例如挂断电话、设置飞行模式等。这些函数被编译成 Java 接口后,可供客户端程序调用以控制设备的行为。 --- #### 2. ITelphony.aidl 的主要功能 以下是 `ITelephony.aidl` 支持的一些典型功能及其意义: - **结束通话** 提供了 `endCall()` 方法来终止当前正在进行的语音通话。这对于开发自动化测试工具或者紧急情况下强制中断通话非常有用。 - **查询通话状态** 可以通过 `isInEmergencyCall()` 等方法获取当前是否处于紧急呼叫状态以及其他相关信息。 - **修改 Modem 参数** 根据需求自定义扩展接口,比如 `setValueToModem(int input)` 和 `getValueFromModem()`,能够调整某些特定于厂商的基带配置选项[^2]。 需要注意的是,出于安全性考虑,只有具备相应权限的应用才能成功执行上述敏感操作。 --- #### 3. 使用教程及系统调用流程 ##### (1)准备工作 要利用 `ITelephony.aidl` 实现 IPC 调用,首先得将其加入项目工程目录下合适的位置,并确保路径结构匹配官方标准布局。一般放置于如下所示的地方: ``` src/com/android/internal/telephony/ ``` 接着编写具体的 .aidl 文件内容,类似于下面的例子: ```aidl package com.android.internal.telephony; interface ITelephony { boolean endCall(); void answerRingingCall(); void silenceRinger(); boolean isInEmergencyCall(); } ``` --- ##### (2)生成 Stub 类型 当构建过程完成之后,SDK 工具会自动为我们创建基于此 IDL 描述的服务端骨架代码(`ITelephony.Stub`)以及代理对象模板(`ITelephony$Stub$Proxy`)。前者继承自 `Binder` 并重写了抽象方法的实际逻辑;后者则充当远端实体的本地表示形式便于使用者透明化感知远程方法调用的过程。 --- ##### (3)绑定目标 Service 为了让客户方获得合法授权从而操纵 Telephony 组件,必须先找到对应的目标 service name (`phone`) ,然后借助 Context.bindService() 或 ActivityManagerNative.getDefault().getService() 获取 IBinder 引用继而转型为目标类型的 proxy instance 。示例代码片段如下: ```java IBinder binder = ServiceManager.getService("phone"); if (binder != null){ try{ Class<?> c = Class.forName("com.android.internal.telephony.ITelephony"); Method method = c.getDeclaredMethod("asInterface", IBinder.class); Object telephonyService = method.invoke(null, binder); // Now you can invoke methods on the object. ((ITelephony)telephonyService).endCall(); } catch(Exception e){ Log.e(TAG,"Error accessing ITelephony interface.",e); } } ``` 这里运用反射技术绕过了私有 API 访问限制问题,但在正式发布版本中应当谨慎评估潜在风险并寻求替代方案以免触犯 Google Play 商店政策规定。 --- ##### (4)注意事项 尽管 AIDL 技术带来了便利之处,但也伴随着一定局限性和挑战: - 权限管控严格:大多数暴露出来的能力都需要申请特殊许可(如 SYSTEM_PRIVILEGED_PERMISSIONS),普通第三方 APP 很难满足条件。 - 性能开销较大:相比直接内存共享方式而言,每次跨越边界传递数据都要付出额外的时间代价。 - 版本兼容复杂度增加:随着 OS 不断演进升级,原有契约可能发生变化造成不一致现象发生。 因此,在实际工程项目规划初期就应该充分权衡利弊再做决定。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021、小林子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值