鉴于目前动态库在iOS App中使用越来越广泛,二进制的兼容问题可能会成为一个令人头疼的问题。本文主要对比一下C++、Java、Objecive-C和Swift的二进制兼容问题。

iOS端动态库使用情况

  1. iOS 8开始支持App使用动态库。
  2. 苹果对提交的App的__TEXT__段大小是有限制的,很多巨无霸App容易超出这个限制。iOS9之前每个架构的__TEXT__段比较小,iOS9放大到了500MB。详细情况请看:To submit an app for review
  3. 开源库只能通过Podfile做源码引入,源码依赖,编译非常慢。
  4. 可持续构建也需要基于苹果的环境,比如使用Mac Pro/Mac Mini构建。Mac Pro比较昂贵,Mac mini性能不行,构建一次需要花费大量时间。
  5. 大型App为了加快编译速度,可以维护自己的私有仓库,把依赖的库尽量编译成Framework,加快编译速度。
  6. Swift目前必须基于动态库开发。
  7. 基于动态库构建App,升级一个动态库需要将整个依赖树编译一遍。尤其是一些频繁变动的基础组件,比如视觉组件的改动,牵一发而动全身。

测试环境

C++、Java、OC和Swift分别实现Foo这个基类,然后再实现Bar这个子类,main则使用Bar类打印成员变量的信息。给Foo类添加成员变量member0,重新编译Foo(make foo && ./main),Bar和main不变,然后观察执行结果。

代码地址:binary_compatibility_test

LLDB一点有用的调试技巧。更多的调试功能,请参看:The LLDB Debugger

测试结果

  1. C++会出现错位,但是没有崩溃。二进制也是比较脆弱的。
  2. Java能正常工作。
  3. OC能正常工作。OC非常适合基于动态库的组件方式。
  4. Swift构造Bar对象就会崩溃。现状让我们非常头疼。

结果分析

  1. C++的设计没有考虑到二进制兼容的问题,所以兼容很一般。
  2. Java的二进制兼容非常完美,对象成员改变,方法增删,都不会轻易导致二进制兼容问题。详细情况请参看:Chapter 13. Binary Compatibility
  3. OC使用方法和属性都使用消息派发,增加和删除方法,移动方法的顺序,都不会导致问题;另外对成员变量的改变做了支持,所以二进制兼容完美。
  4. 作为一种崭新的语言,Swift的二进制兼容最差,匪夷所思啊。

另外大家讨论的时候也提到C++虚函数改变顺序会不会出问题。针对这个问题我验证了一下,确认C++虚函数表里面函数的顺序完全取决于函数在头文件中声明的顺序。

比如Foo有func1和func2两个虚函数,调换func1和func2的顺序,不重新编译main。在main里面调用func2,实际上会调用到func1。

参考文章

  1. C++ ABI Compliance Checker
  2. Objective-C类成员变量深度剖析
  3. Non Fragile ivars
  4. Objc源码
  5. Swift库二进制接口(ABI)兼容性研究

https://yq.aliyun.com/articles/225948

C++、Java、Objective-C、Swift 二进制兼容测试的更多相关文章

  1. Swift中KIF测试的特点-b

    我最近在忙着回归到过去测试代码的老路子,使用KIF和XCTest框架,这样会使得iOS中的测试变得简单.当我开始捣鼓KIF的时候,我用Swift写的应用出了点小问题,不过最终还是很机智的搞定了.在我写 ...

  2. Java自动化测试框架-10 - TestNG之测试结果篇

    1.-测试结果 1.1-成功,失败和断言 测试被认为是成功的,如果它不引发任何异常完成,还是它扔的预期异常(请参阅文档expectedExceptions属性上找到的@Test注释). 您的测试方法通 ...

  3. Java SE 9 多版本兼容 JAR 包示例

    Java SE 9 多版本兼容 JAR 包示例 作者:Grey 原文地址:Java SE 9 多版本兼容 JAR 包示例 说明 Java 9 版本中增强了Jar 包多版本字节码文件格式支持,也就是说在 ...

  4. 微软官方网站线上兼容测试平台-Browser screenshots

    前端开发时最不想做的就是在不同浏览器.平台和分辨率测试网页显示效果,通常这会浮现许多问题,尤其浏览器版本就可能让显示成效完全不同,也只好尽力维持让每一种设备都能正常浏览网页.修改到完全没有问题必须投入 ...

  5. Swift项目兼容Objective-C问题汇总

    Swift项目兼容Objective-C问题汇总 转载自 http://www.cocoachina.com/swift/20150608/12025.html 本文是投稿文章,作者:一叶(博客)欢迎 ...

  6. d指针在Qt上的应用及实现(d指针能实现二进制兼容)

    Qt为了使其动态库最大程度上实现二进制兼容,引入了d指针的概念.那么为什么d指针能实现二进制兼容呢?为了回答这个问题,首先弄清楚什么是二进制兼容?所谓二进制兼容动态库,指的是一个在老版本库下运行的程序 ...

  7. C++的二进制兼容问题(以QT为例)

    二进制不兼容带来的问题(需要重新编译库文件,以前编译的失效): http://my.oschina.net/lieefu/blog/505363?fromerr=f5jn7rct 二进制不兼容的原理: ...

  8. Swift - 二进制,八进制,十六机制的表示方法

    当前位置: 首页 > 编程社区 > Swift > Swift - 二进制,八进制,十六机制的表示方法 Swift - 二进制,八进制,十六机制的表示方法 2015-01-23 14 ...

  9. 提升iOS审核通过率之“IPv6兼容测试”

    作者:jingle 腾讯系统测试工程师 商业转载请联系腾讯WeTest授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/285.html 一.背景 在 ...

随机推荐

  1. SQL拼接 html 发送

    --在Job BES_Daily_FTP_filedownload 中使用 ALTER proc [dbo].[RSP_FN_UNAPPLIED_Mail_Reminder] as Declare @ ...

  2. Go.基础篇-1

    package main import "fmt" import "math" import "errors" func main(){ f ...

  3. CSS单行、多行文本溢出显示省略号(……)解决方案

    单行文本溢出显示省略号(-) text-overflow:ellipsis-----部分浏览器还需要加宽度width属性 .ellipsis{ overflow: hidden; text-overf ...

  4. H5,API的pushState(),replaceState()和popstate()用法

    pushState和replaceState是H5的API中新添加的两个方法.通过window.history方法来对浏览器历史记录的读写. pushState和replaceState 在 HTML ...

  5. 谈谈HTML5中的history.pushSate方法,弥补ajax导致浏览器前进后退无效的问题

    移动端为了减少页面请求,有时候需要通过单页面做成多页面的效果,最近有这么个需求,表单填完后执行第一步,然后执行第二步,第二步执行完后再执行第三步,每一步都要保留之前的数据.这种情况用单页面实现再合适不 ...

  6. puppeteer自动化测试

    1.基础知识 puppeteer.launch() 创建浏览器实例 puppeteer.newPage() 创建一个新页面 puppeteer.goto() 进入指定网站 page.screensho ...

  7. Javascript 多物体运动1

    多物体运动 <!DOCTYPE html><html> <head>  <meta charset="UTF-8">  <ti ...

  8. 在WinServer上安装小红伞杀毒软件的经验总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在WinServer2008或WinServer2012不能直接安装小红伞杀毒软件的免费版,需要安装服务器版.我手头并 ...

  9. 简单理解C#中的抽象工厂模式是什么概念!

    抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象.本文采取的仍然是接着以前的那个快餐店的例子.现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食 ...

  10. How to install the NVIDIA drivers on Ubuntu 18.04 Bionic Beaver Linux

    Objective The objective is to install the NVIDIA drivers on Ubuntu 18.04 Bionic Beaver Linux. This a ...