C++、Java、Objective-C、Swift 二进制兼容测试
鉴于目前动态库在iOS App中使用越来越广泛,二进制的兼容问题可能会成为一个令人头疼的问题。本文主要对比一下C++、Java、Objecive-C和Swift的二进制兼容问题。
iOS端动态库使用情况
- iOS 8开始支持App使用动态库。
- 苹果对提交的App的
__TEXT__段大小是有限制的,很多巨无霸App容易超出这个限制。iOS9之前每个架构的__TEXT__段比较小,iOS9放大到了500MB。详细情况请看:To submit an app for review。 - 开源库只能通过Podfile做源码引入,源码依赖,编译非常慢。
- 可持续构建也需要基于苹果的环境,比如使用Mac Pro/Mac Mini构建。Mac Pro比较昂贵,Mac mini性能不行,构建一次需要花费大量时间。
- 大型App为了加快编译速度,可以维护自己的私有仓库,把依赖的库尽量编译成Framework,加快编译速度。
- Swift目前必须基于动态库开发。
- 基于动态库构建App,升级一个动态库需要将整个依赖树编译一遍。尤其是一些频繁变动的基础组件,比如视觉组件的改动,牵一发而动全身。
测试环境
C++、Java、OC和Swift分别实现Foo这个基类,然后再实现Bar这个子类,main则使用Bar类打印成员变量的信息。给Foo类添加成员变量member0,重新编译Foo(make foo && ./main),Bar和main不变,然后观察执行结果。
代码地址:binary_compatibility_test。
LLDB一点有用的调试技巧。更多的调试功能,请参看:The LLDB Debugger。
测试结果
- C++会出现错位,但是没有崩溃。二进制也是比较脆弱的。
- Java能正常工作。
- OC能正常工作。OC非常适合基于动态库的组件方式。
- Swift构造Bar对象就会崩溃。现状让我们非常头疼。
结果分析
- C++的设计没有考虑到二进制兼容的问题,所以兼容很一般。
- Java的二进制兼容非常完美,对象成员改变,方法增删,都不会轻易导致二进制兼容问题。详细情况请参看:Chapter 13. Binary Compatibility。
- OC使用方法和属性都使用消息派发,增加和删除方法,移动方法的顺序,都不会导致问题;另外对成员变量的改变做了支持,所以二进制兼容完美。
作为一种崭新的语言,Swift的二进制兼容最差,匪夷所思啊。
另外大家讨论的时候也提到C++虚函数改变顺序会不会出问题。针对这个问题我验证了一下,确认C++虚函数表里面函数的顺序完全取决于函数在头文件中声明的顺序。
比如Foo有func1和func2两个虚函数,调换func1和func2的顺序,不重新编译main。在main里面调用func2,实际上会调用到func1。
参考文章
https://yq.aliyun.com/articles/225948
C++、Java、Objective-C、Swift 二进制兼容测试的更多相关文章
- Swift中KIF测试的特点-b
我最近在忙着回归到过去测试代码的老路子,使用KIF和XCTest框架,这样会使得iOS中的测试变得简单.当我开始捣鼓KIF的时候,我用Swift写的应用出了点小问题,不过最终还是很机智的搞定了.在我写 ...
- Java自动化测试框架-10 - TestNG之测试结果篇
1.-测试结果 1.1-成功,失败和断言 测试被认为是成功的,如果它不引发任何异常完成,还是它扔的预期异常(请参阅文档expectedExceptions属性上找到的@Test注释). 您的测试方法通 ...
- Java SE 9 多版本兼容 JAR 包示例
Java SE 9 多版本兼容 JAR 包示例 作者:Grey 原文地址:Java SE 9 多版本兼容 JAR 包示例 说明 Java 9 版本中增强了Jar 包多版本字节码文件格式支持,也就是说在 ...
- 微软官方网站线上兼容测试平台-Browser screenshots
前端开发时最不想做的就是在不同浏览器.平台和分辨率测试网页显示效果,通常这会浮现许多问题,尤其浏览器版本就可能让显示成效完全不同,也只好尽力维持让每一种设备都能正常浏览网页.修改到完全没有问题必须投入 ...
- Swift项目兼容Objective-C问题汇总
Swift项目兼容Objective-C问题汇总 转载自 http://www.cocoachina.com/swift/20150608/12025.html 本文是投稿文章,作者:一叶(博客)欢迎 ...
- d指针在Qt上的应用及实现(d指针能实现二进制兼容)
Qt为了使其动态库最大程度上实现二进制兼容,引入了d指针的概念.那么为什么d指针能实现二进制兼容呢?为了回答这个问题,首先弄清楚什么是二进制兼容?所谓二进制兼容动态库,指的是一个在老版本库下运行的程序 ...
- C++的二进制兼容问题(以QT为例)
二进制不兼容带来的问题(需要重新编译库文件,以前编译的失效): http://my.oschina.net/lieefu/blog/505363?fromerr=f5jn7rct 二进制不兼容的原理: ...
- Swift - 二进制,八进制,十六机制的表示方法
当前位置: 首页 > 编程社区 > Swift > Swift - 二进制,八进制,十六机制的表示方法 Swift - 二进制,八进制,十六机制的表示方法 2015-01-23 14 ...
- 提升iOS审核通过率之“IPv6兼容测试”
作者:jingle 腾讯系统测试工程师 商业转载请联系腾讯WeTest授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/285.html 一.背景 在 ...
随机推荐
- linux信息查看手记
系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...
- HDU 5694——BD String——————【递归求解】
BD String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- ng-value中格式化日期
ng-value="conferenceinfo.create_time | date:'yyyy-MM-dd'"
- Rsyslog+ELK日志分析系统搭建总结1.0(测试环境)
因为工作需求,最近在搭建日志分析系统,这里主要搭建的是系统日志分析系统,即rsyslog+elk. 因为目前仍为测试环境,这里说一下搭建的基础架构,后期上生产线再来更新最后的架构图,大佬们如果有什么见 ...
- mac 好用软件地址存储
Navicat Premium 12.0.24 for mac已破解中文 https://www.52pojie.cn/thread-727433-1-1.html sublime 破解方法https ...
- 4、springboot之全局异常捕获
1.新建一个springboot项目 添加一个全局异常的类 import org.springframework.web.bind.annotation.ControllerAdvice; impor ...
- es6 class类实例、静态、私有方法属性笔记
实例属性.方法 class Foo { valueA = 100 //第一种实例属性定义,位置:new的实例上 constructor() { this.valueB = 200 //第二种实例属性定 ...
- mockjs
首先还是那句话,进来的GodBoy and GoodGirl 不妨看完再离开. 一个走在路上的前端攻城狮-along 一.mock的由来 mock有“愚弄.欺骗”之意,在前端领域,mock可以理解为 ...
- oracle数据库基本命令
数据库字符集: SQL> select * from nls_database_parameters where parameter='NLS_CHARACTERSET'; PARAMETER ...
- Java在Web开发语言上败给了PHP(转)
PHP的主要语言开发者之一.Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言.他指出,目前Java厂商试图在JVM上提供动态语言实现的路子根本不对,Java ...