写点什么

Dropbox 经验谈:iOS 和 Android 的 C++ 跨平台开发

  • 2014-06-05
  • 本文字数:1969 字

    阅读完需:约 6 分钟

Dropbox 的开发人员最近分享了他们在移动 App 开发方面的经验。App 如何才能做到同时支持 iOS 和 Android 两个平台而又不需要在每个平台上对相同的功能重复编码。下面就让我们详细了解一下他们为什么这么做,从中得到什么好处以及在这个过程中探索出哪些关键经验。

几个月前,Dropbox 的开发人员 Stephen Poletto 和 Sean Beausoleil 在给 Facebook 的开发人员做讲座时提到,iOS 和 Android 平台代码库的不一致会带来一系列问题:

  • 开发和维护成本成倍增加。
  • 开发团队需要多次修复同样的缺陷。
  • 针对某个平台报告的缺陷可能会被另一个平台忽视掉。
  • 不同平台的 App 行为可能会有预料之外的细微差异。
  • 性能优化成本高昂并且与平台相关。

Dropbox 赖以克服上述这些问题的策略基础就是为所有 UI 无关的代码建立一个共享的跨平台 C++ 库,例如数据和网络部分的逻辑。UI 部分还是使用原生代码编写,以便尽可能地利用平台对动画特效和设备传感器等的支持,并且确保充分的响应速度。

与更倾向用 HTML 5 或 JavaScript 等较抽象语言的自顶向下的方法相对应,Poletto 和 Beausoleil 将这种方式描述为自底向上的方法。据两位开发人员介绍,这些方法通常难以达到预期的性能要求。

另外一方面,iOS 平台能够很好的支持 C++ 代码,而且这些代码也可以很方便的与 Objective C++ 代码结合。并且,尽管不像 iOS App 那样方便,Android App 也可以通过 Android 原生开发组件(NDK)使用 C++ 代码。

UIKonf 2014 大会上,Mailbox app 的开发者 Steven Kabbes 为听众解释了 Dropbox 开发者如何通过 gyp 来处理 NDK 开发的复杂性,Google 的元构建(meta-build)系统可以用一个 JSON 描述文件生成Xcode 项目,Android 和 Unix 下的 makefile 文件以及 Visual Studio 项目。Steven 还在 GitHub 上发布了一个项目来展示Dropbox 中使用到的一些跨平台技术。

**C++**层的设计

Dropbox 的跨平台 C++ 层架构比较简洁,包括:

  • 一个 SQLite 数据库,扮演着“真相来源”的角色。
  • 一个独立运行的同步服务线程,以保持 Dropbox 服务器和本地 SQLite 数据库的同步。
  • 一个操作队列,维护所有尚未执行的用户操作。
  • 一个操作线程,负责从操作队列中提取用户操作,并在 Dropbox 服务器上执行这些操作。

Dropbox 跨平台 C++ 层的基本理念是在它和原生代码之间划分出明确的边界。这意味着 C++ 层与 UI 层之间没有任何数据共享,而且对象的来回复制也要穿过层与层之间的边界。这种策略的优点在于当涉及到并发时,两个层次可以被认为是完全独立的,因此它们不需要任何跨层的锁定,并且可以在无需考虑另外一方的情况下处理并发。

Dropbox C++ 层的主要组件是一个由 SQLite 驱动的查询和持久化框架,让 Dropbox 开发者可以避免使用 iOS 平台上的 Core Data 框架。Kabbes 解释说,Core Data 是一个快速而强大的框架,这个决定并不是由于 Core Data 框架本身的问题,完全是为了满足同时支持 Android、iOS、Mac 平台的需求,将来还需要支持 Windows 平台。这个组件并非为了完全替代 Core Data 框架,而只是提供持久化和查询的功能,加上用以保证 UI 反应速度的一个组件,即与 NSManagedObjectContextObjectsDidChangeNotification 功能类似的一个 C++ 通知机制。Kabbes 认为这是一个非常关键的组件。通过这一机制,只需要传输增量的变化。关于持久化组件的更多细节信息可以阅读 Kabbes 在 GitHub 上的笔记和 Ole Begemann 发表的博文。

设计跨平台 C++ 层时,面临的一个难题是权衡什么情况下需要从头开始重新实现 OS 本身已经提供了的功能,什么情况下仅需编写包装器(wrapper)封装这个功能。正如 Poletto 所说,你不可能用 C++ 重新实现整个平台。因此,对于网络访问或 SSL 证书验证等基础功能,会通过封装的方式从 C++ 层回调到原生平台。Ole Begemann 列举了几个例子说明哪些功能不适于重新实现,例如,使用 NSURLSession 进行的后台下载,App 的后台行为,以及 iCloud 访问等。其他一些情况下,则可以重写那些由平台相关的 API 所提供的功能,例如 NSUserDefaults 已经被 LevelDB 替换成 Dropbox 的代码。

据 Poletto 介绍,在 iOS 和 Android 平台之间共享同一个代码库能够带来一系列的好处。首先,几乎可以肯定,iOS 和 Android 团队之间会有更加紧密的协作。其次,开发团队能够更早地捕捉到缺陷,并且可以在两个平台上同时修复这些缺陷。再次,性能调优可以同时优化两个平台。最后,Dropbox 可以利用 Android 的 beta 测试程序来测试“iOS 代码”,这样就可以立即修复问题而不需要等待 App Store 的审查过程。

查看 **** 英文原文 C++ Cross-Platform iOS and Android Development: The Dropbox Lesson


感谢崔康对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-06-05 21:0012146
用户头像

发布了 75 篇内容, 共 63.8 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

企业上云原来如此简单,华为云带你体验云上风采

清欢科技

设计模式之美--MVC(1)充血模型的DDD开发模式例子

GalaxyCreater

设计模式

企业云上办公的最佳选择——华为云桌面Workspace

爱科技的水月

极客时间运维进阶训练营第六周作业

9527

体验华为云桌面的新办公形式,让你轻松办公

秃头也爱科技

架构实战营模块一作业

张贺

架构实战营

一文了解 Go 标准库 strconv:string 与其他基本数据类型的转换

陈明勇

Go golang string 11月月更 strconv

一站式解决方案,华为云CDN这波双十一很强!

秃头也爱科技

CleanMyMac4.12.1最新版安装包下载及功能详情

茶色酒

CleanMyMac CleanMyMac X CleanMyMac X2023

双十一特惠,华为云桌面助力便捷高效办公!

爱科技的水月

华为云云服务器:赢麻了是种什么体验?

路过的憨憨

华为

企业数字化办公利器——华为云桌面Workspace

清欢科技

Java HashMap 的扩容因子为什么是 0.75

HoneyMoose

一个有点咬文嚼字的 sorting 和 ordering

HoneyMoose

Vision Transformer这两年

OneFlow

人工智能 深度学习 NLP 大模型

AngularJS进阶(九)控制器controller之间如何通信

No Silver Bullet

通信 AngularJS 12月月更

华为云CDN,为你开启更快速的上网体验!

秃头也爱科技

HashMap 的初始值和最大值和扩容因子

HoneyMoose

Java Hash 碰撞

HoneyMoose

JavaScript进阶(八)实现图片预览并导入服务器功能

No Silver Bullet

图片预览 AngularJS 12月月更

Dubbo 3.1.3、3.2.0-beta.2 正式发布

Apache Dubbo

Java 开源 微服务 云原生 dubbo

弹性伸缩、安全高效!华为云服务器助力企业数字化转型!

路过的憨憨

华为

企业如何高质量上云?华为云服务器告诉你!

路过的憨憨

华为

会议都在云上开,华为云会议具有超高性价比

清欢科技

企业运维强驱动

秃头也爱科技

华为云CDN 真的有点“东西”!极速网上冲浪全靠它

爱科技的水月

设计模式之美--MVC(1)的贫血模型、充血模型

GalaxyCreater

设计模式

三种基本排序

我是一个茶壶

排序算法 C语音 11月月更

Java HashMap 在获得 Key 的 Hash 值的时候用的是什么算法

HoneyMoose

Hash 的定义

HoneyMoose

​ AngularJS进阶(七)AngularJS实现根据不同条件显示不同控件

No Silver Bullet

AngularJS 12月月更 条件筛选

Dropbox经验谈:iOS和Android的C++跨平台开发_Java_Sergio De Simone_InfoQ精选文章