我正在构建一个基于Android的系统,需要通过二进制协议发送数据。我预计将有多个协议的许多版本和与之相关的维护问题。
我想到了一个解决版本问题的方法,就是使用Java的二进制兼容性。
假设应用程序A依赖于库L。L包含一个在A中使用的类C,该类实现接口I。我使用接口I(0)的定义构建L和A。我在设备上安装L(0)和A(0),A(0)动态绑定L(0),并提供类C(0)。
现在,我扩展接口I,添加了两个新方法。当我尝试编译L时,编译失败,因为C没有实现新方法。我通过扩展C来修复L,使其实现这两个新方法。我现在针对I(1)编译L(1)并将其安装在设备上。
请注意,此时A将无法针对I(1)进行编译。尽管如此,如果这是Java,则A(0)将绑定并运行,并正确地使用L(1)中的C(1)。
对于Java的实现,JLS第13章“二进制兼容性”保证了此行为(以及更多)。如果它适用于DEX和Dalvik,那么我可以使大量协议更改对其客户端完全不可见。
因此,问题是,DEX和Dalvik是否遵守JLS二进制兼容性规范?如果不是,是否有一份指定DEX / Dalvik二进制兼容性的文档?
我想到了一个解决版本问题的方法,就是使用Java的二进制兼容性。
假设应用程序A依赖于库L。L包含一个在A中使用的类C,该类实现接口I。我使用接口I(0)的定义构建L和A。我在设备上安装L(0)和A(0),A(0)动态绑定L(0),并提供类C(0)。
现在,我扩展接口I,添加了两个新方法。当我尝试编译L时,编译失败,因为C没有实现新方法。我通过扩展C来修复L,使其实现这两个新方法。我现在针对I(1)编译L(1)并将其安装在设备上。
请注意,此时A将无法针对I(1)进行编译。尽管如此,如果这是Java,则A(0)将绑定并运行,并正确地使用L(1)中的C(1)。
对于Java的实现,JLS第13章“二进制兼容性”保证了此行为(以及更多)。如果它适用于DEX和Dalvik,那么我可以使大量协议更改对其客户端完全不可见。
因此,问题是,DEX和Dalvik是否遵守JLS二进制兼容性规范?如果不是,是否有一份指定DEX / Dalvik二进制兼容性的文档?