多个 AIDL 版本

Posted

技术标签:

【中文标题】多个 AIDL 版本【英文标题】:Multiple AIDL versions 【发布时间】:2020-04-20 23:44:47 【问题描述】:

AIDL 的 android 文档仅说明

注意:您在首次发布后对 AIDL 接口所做的任何更改都必须保持向后兼容,以避免破坏使用您服务的其他应用程序。也就是说,因为您的 .aidl 文件必须复制到其他应用程序才能访问您的服务接口,所以您必须保持对原始接口的支持。

所以我尝试了一些实验。我有一个现有的 AIDL 接口,并实现了两个支持它的 IPC 服务,并且可以从我的主要服务访问。

因此,在我的主要服务的 AIDL 接口中,我添加了一个方法,该方法位于预先存在的方法列表中,构建了应用程序并进行了部署。但是两个IPC服务没有变化;他们不知道新方法。它不能正常工作,但确实有效。但是,原始方法在调用时返回错误值。看起来好像在列表顶部插入新方法是问题(好像整个包被编组在一个字节数组中,从而弄乱了接收端的取消编组)。

所以我将新方法添加为文件中的最后一个条目,这一次它运行良好。当然,旧的 IPC 将无法处理新方法,如果我调用它,可能会抛出 Remote Exception。

所以我的问题是,为什么顺序更改会产生如此大的影响?这是侥幸吗?在同一个包下添加新方法应该是不可能的吗?我不想通过在文件末尾添加一堆方法来让它工作,因为这恰好是一个意外的侥幸。

【问题讨论】:

【参考方案1】:

您在.aidl 文件中声明的方法的顺序在客户端和服务中应相同

【讨论】:

考虑将此作为评论而不是答案发布。获得一定数量的声望点后,您将能够将 cmets 发布到其他问题/答案。 我认为你是对的,但除了经验我没有什么可以支持的。【参考方案2】:

客户端和服务器端的aidl文件按位置链接,并在路由调用时检查参数。

client AIDL  <->   Server AIDL
methodA            methodB
methodB            methodA

如果您已如上所述交换了位置,并且参数仍然适用,则客户端调用 methodA 将路由到服务器端的 methodB。

我确实找到了有关此行为的任何官方文档。它基于我在 Android R 上的经验。

【讨论】:

以上是关于多个 AIDL 版本的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 Android AIDL 发送到多个客户端

AIDL跨进程通信

Android:IPC之AIDL的学习和总结

Android AIDL 小结

Android之——AIDL深入

Android中AIDL的使用