将 AIDL 更新到下一个版本时出错

Posted

技术标签:

【中文标题】将 AIDL 更新到下一个版本时出错【英文标题】:Error while updating AIDL to next revision 【发布时间】:2013-12-03 04:49:31 【问题描述】:

我正在创建一个新的aidl 服务,该服务将由第 3 方使用,并且在更新服务器端的 AIDL 文件时面临一个问题。 认为。 服务器 AIDL 文件 rivison 1:有一个 API 1.添加(int a,int b)

客户端 AIDL 文件版本 1:只有一个 api 1.添加(int a,int b)

现在我已经更新了服务器 AIDL 服务器 AIDL 文件版本 2:有两个 API 1. 减(int a, int b); 2. 添加(int a, int b);

当我使用第一个修订客户端而不是调用 add 来运行我的第二个 rivision 服务器时,它正在调用减去方法.. 这个问题有什么解决方案吗?服务器端和客户端的 AIDL 函数顺序应该相同是 android 的限制吗??

【问题讨论】:

【参考方案1】:

是的,服务器端和 Clint 端的 AIDL 接口必须同步。 AIDL 文件只是一个接口,它在客户端和服务器端的实现是在编译客户端和服务器代码期间生成的。这个接口定义了如何编组从客户端到服务器的调用,因此,如果你的接口在客户端和服务器上没有同步,你会在编组调用中遇到问题(这是你在你的案例中看到的问题)。

最好创建一个包含 AIDL 接口的库作为单独的项目,并将其附加到您的客户端和服务器项目。因此,您将拥有两个项目的相同 AIDL 接口。

【讨论】:

【参考方案2】:

在我的测试中,我发现您在 AIDL 末尾添加方法,然后旧方法继续工作而不更新 AIDL。 (除非没有其他选择,否则我不建议您这样做)

如果你在两者之间插入新方法,那么它最终会调用错误的方法。

【讨论】:

【参考方案3】:

是的,您必须保持函数具有相同的声明顺序。

AIDL 会为 binder 通信生成适当的 java 文件。 这取决于不同的消息 id 来区分调用什么函数。

基本消息 id 为零,第一个声明函数的消息 id 将是 (0 + 1), 第二个声明函数的消息 ID 为 (0 + 2)。

因此,如果您尝试保持不同版本的 AIDL 文件之间的兼容性。 请保持函数顺序相同,在尾部添加函数即可。

【讨论】:

以上是关于将 AIDL 更新到下一个版本时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 typescript 模板将 create-react-app 更新到 4.0 时出错

编译 AIDL 时出错

添加应用内计费库时出错

text 将PHP版本更新到5.6+时出错

android 浅谈Aidl 通讯机制

在审查当前版本时将应用内购买项目添加到下一个版本[关闭]