AIDL的Android文档只声明
警告:第一个版本后对AIDL接口所做的任何更改都必须保持向后兼容,以避免破坏使用您的服务的其他应用程序。也就是说,因为您的.aidl文件必须复制到其他应用程序中,以便它们能够访问您的服务接口,所以您必须维护对原始接口的支持。
所以我尝试了一些实验。我有一个现有的AIDL接口,并实现了两个支持它的IPC服务,并且可以从我的主要服务中访问。
因此,在我的主要服务的AIDL接口中,我添加了一个方法,这个方法在预先存在的方法列表中是第一个,我构建了这个应用程序并进行了部署。但是这两个IPC服务没有变化;他们不知道新方法。它没有正常工作,但确实起作用了。但是,原始方法在调用时返回错误的值。看起来,在列表顶部插入新方法是问题所在(似乎整个包都是在一个字节数组中封送,从而破坏了接收端的非封送处理)。
因此,我将新方法添加为文件中的最后一个条目,这一次它运行得很好。当然,旧的IPC将无法处理新方法,如果我称它为远程异常,则可能会引发远程异常。
所以,我的问题是,为什么顺序上的变化会产生如此大的变化?这是侥幸吗?是否不可能在同一包中添加新方法?我不想让它通过在文件末尾添加一堆方法来工作,而这只是意外的侥幸。
发布于 2020-07-31 15:33:03
在.aidl文件中声明的方法的顺序在客户端和服务中应该是相同的。
发布于 2021-04-17 00:28:28
客户端和服务器端的aidl文件按位置链接,并在路由调用时检查参数。
client AIDL <-> Server AIDL
methodA methodB
methodB methodA如果像上面一样交换了位置,并且参数仍然适用,那么客户机调用methodA就会路由到服务器端的methodB。
我确实找到了任何关于这种行为的官方文件。这是基于我在Android R上的经验。
https://stackoverflow.com/questions/61333872
复制相似问题