首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >android AIDL接口、parcelables和向后兼容性

android AIDL接口、parcelables和向后兼容性
EN

Stack Overflow用户
提问于 2013-08-12 22:35:30
回答 3查看 3.7K关注 0票数 4

我们向第三方开发人员公开了AIDL服务。我们希望从这个服务返回可打包的对象,但是我们担心向后兼容性。我指的是针对parcelable版本N编译的客户端,而针对版本N+1编译的服务必须一起工作。

根据我的测试,对于简单的平面对象(仅限于简单类型字段),向后兼容是可能的,只要在流的末尾对新字段进行打包.例如,

代码语言:javascript
运行
复制
in.writeInt(field1);
in.writeInt(field2); // new field

然而,当涉及到复杂的物体时,事情就会爆炸。例如,

代码语言:javascript
运行
复制
class D implements Parcelable {
  int field1;
}

class C implements Parcelable {
  List<D> ds;
}

如果将第二个字段添加到类D中,

代码语言:javascript
运行
复制
class D implements Parcelable {
  int field1;
  int field2; // new field
}

C的解组失败(我尝试使用Parcel.writeList()Parcel.writeParcelableArray())。

这个案子处理不了,这似乎是不可思议的。当然,我们可以将旧的绑定器接口保留为-is,并创建一个新的绑定接口,该接口返回带有附加字段的新类的对象,但是对于返回更改类的服务,这将导致混乱。例如,接口1.0返回一个Person。现在我们添加了一个字段,我们有了一个新的绑定接口2.0,它返回Person2对象,等等。

这使得我们不得不使用一些更宽容的格式,比如JSON,来传递IPC数据。

有什么建议吗?

EN

Stack Overflow用户

发布于 2016-02-25 17:48:39

如果您只是在AIDL中添加一个额外的方法(而不是修改现有的方法),则可以将该附加方法作为最后一个方法放在您的AIDL文件中,这样不会破坏现有的依赖应用程序(这些应用程序仍然是根据以前的AIDL定义构建的)。您的新服务应用程序(添加的方法)将适用于旧的应用程序和新的应用程序(建立在您的新的AIDL定义之上)。在新的应用程序中,它们只需要在与支持旧的AIDL定义的旧版本的服务进行通信的情况下捕获IllegalArgumentException。在我的例子中,我提供了一个客户端类,它封装IPC调用,这样应用程序实际上就不会执行调用,我在那里执行异常捕获,只记录情况并从该方法返回null。

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18197783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档