《Android内核剖析》笔记 第5章 进程间通信核心框架Binder(1)

  1. 客户端:即服务消费者,要想调用其他进程中的功能,必须在本地有一个对远程对象的引用,且客户端和服务端必须遵从相同的接口和数据交换协议;而这两点就是实现IPC通信需要解决的最核心的两个问题;

为了简化服务提供者和消费者之间的开发和沟通成本,android系统提供了AIDL(Android Interface Definition Language)的工具支持,该工具可以把一个用于接口声明的aidl文件转换成一个Java文件,转换的过程就是要让该服务在代码层面自动符合Binder框架的设计规范,并自动解决好上面提到的2个核心问题中的第二点,生成好的Java文件其实包括了3个类:

服务接口类IXXX extends android.os.IInterface;

本地存根类IXXX.Stub  extends android.os.Binder implements IXXX;

远程代理类 IXXX.Stub.Proxy implements IXXX;

经历过EJB时代的同学们一定对上面的代码形式相当熟悉吧,哈哈!

以上文件生成好之后,服务提供者就可以专注于写具体的逻辑代码了,直接extends IXXX.Stub 实现具体的方法即可;

那是否可以不用aidl工具来生成代码呢?当然可以,如果你愿意的话完全可以自己来写相关的代码,只要符合Binder代码规范即可;

服务提供者使用的本地存根类IXXX.Stub中的核心方法

  1. public final boolean transact(int code, Parcel data, Parcel reply, int flags);实际上是父类Binder中的方法,因为是final的,所以子类是不能重载的,这也是Binder框架设计的一部分,因为他不允许开发者随意改变调用机制,该方法用于接受服务调用请求,但他自己并不直接处理这些请求,而是转交给onTransact方法(可由子类重载)来处理,这是android系统中非常重要的一种设计思想,被广泛用于各种场景,以后你看见onXXXX相关的方法一般都是相关的功能回调或子类重载点;

  2. protected boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags);

根据参数code判断该执行IXXX接口中的哪个具体业务方法,并且从data中按序取出数据作为具体业务方法的输入参数;

注意:从Parcel取出数据的顺序必须和存入数据(具体间后面IXXX.Stub.Proxy中业务方法的描述)的顺序一致,否则数据就乱套了,而这就是AIDL工具自动生成代码要解决的核心问题;

  1. public static IXXX asInterface(android.os.IBinder obj);将远程对象的引用转换成具体的业务接口,这里自动屏蔽了本地和远程调用的细节,因为服务提供方不仅可以被其他进程调用,还可以被自身进程内其他功能块调用;

服务消费者使用的远程代理类 IXXX.Stub.Proxy中的核心方法

  1. Proxy(android.os.IBinder remote);

构造函数,参数就是远程服务的引用,所有的业务方法的调用都是通过该引用间接执行的;

  1. xyz(…) 各种具体的业务方法;

这里对服务接口的实现并不是真的业务逻辑实现,他是远程服务在使用方本地的代理,用来中转调用的,主要是完成输入参数到包裹Parcel的转换,因为IPC远程调用对消息的传递必须基于包裹Parcel,这是Binder框架设计规范的一部分;

当输入参数转换完成后调用 mRemote.transact(…)将请求发送给服务提供方;

服务消费者如何获取远程对象的引用?

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
ics/618165277)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值