我们向第三方开发人员公开了AIDL服务。我们希望从这个服务返回可打包的对象,但是我们担心向后兼容性。我指的是针对parcelable版本N编译的客户端,而针对版本N+1编译的服务必须一起工作。
根据我的测试,对于简单的平面对象(仅限于简单类型字段),向后兼容是可能的,只要在流的末尾对新字段进行打包.例如,
in.writeInt(field1);
in.writeInt(field2); // new field
然而,当涉及到复杂的物体时,事情就会爆炸。例如,
class D implements Parcelable {
int field1;
}
class C implements Parcelable {
List<D> ds;
}
如果将第二个字段添加到类D
中,
class D implements Parcelable {
int field1;
int field2; // new field
}
类C
的解组失败(我尝试使用Parcel.writeList()
和Parcel.writeParcelableArray()
)。
这个案子处理不了,这似乎是不可思议的。当然,我们可以将旧的绑定器接口保留为-is,并创建一个新的绑定接口,该接口返回带有附加字段的新类的对象,但是对于返回更改类的服务,这将导致混乱。例如,接口1.0返回一个Person
。现在我们添加了一个字段,我们有了一个新的绑定接口2.0,它返回Person2
对象,等等。
这使得我们不得不使用一些更宽容的格式,比如JSON,来传递IPC数据。
有什么建议吗?
发布于 2016-02-25 17:48:39
如果您只是在AIDL中添加一个额外的方法(而不是修改现有的方法),则可以将该附加方法作为最后一个方法放在您的AIDL文件中,这样不会破坏现有的依赖应用程序(这些应用程序仍然是根据以前的AIDL定义构建的)。您的新服务应用程序(添加的方法)将适用于旧的应用程序和新的应用程序(建立在您的新的AIDL定义之上)。在新的应用程序中,它们只需要在与支持旧的AIDL定义的旧版本的服务进行通信的情况下捕获IllegalArgumentException。在我的例子中,我提供了一个客户端类,它封装IPC调用,这样应用程序实际上就不会执行调用,我在那里执行异常捕获,只记录情况并从该方法返回null。
https://stackoverflow.com/questions/18197783
复制相似问题