写点什么

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:0012007
用户头像

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

关注

评论

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

微博评论的高性能高可用架构设计

zjluoyue

架构实战营 - 模块5 - 作业

lucian

架构实战营

记录:一个从0-1打磨演讲的技术专家

将军-技术演讲力教练

Rust 元宇宙 12 —— 序列化和存储

Miracle

rust 元宇宙

1.《重学JAVA》开篇

杨鹏Geek

Java Java 25 周年 28天写作 12月日更

数据也需要滴血认亲?

Justin

大数据 数据治理 28天写作

基于云的技术架构设计实践-第1篇

hackstoic

云计算 容器 云原生 CI/CD 签约计划第二季

还在担心流量防护问题?Sentinel来帮你!

XiaoLin_Java

SpringCloud Alibaba 流量防控 签约计划第二季

linux之cp强制复制文件

入门小站

Linux

架构实战-模块五

唐敏

「架构实战营」

如何掌握智识?

卢卡多多

28天写作 12月日更

架构实战营第五课作业微博评论高性能高可用架构

Geek_99eefd

架构实战营 「架构实战营」

互联网公司如何塑造一支有创业精神的技术团队?

阿里巴巴中间件

创业 阿里云 中间件

模块五作业

心怀架构

微博系统中”微博评论“的高性能高可用计算架构设计

stars

架构训练营

Dubbo-Admin 正式支持 3.0 服务治理

阿里巴巴中间件

阿里云 云原生 dubbo 中间件 服务治理

TypeScript 之常见类型(下)

冴羽

JavaScript typescript 翻译 大前端

模块五作业

小鹿

架构训练营 - 模块五作业

VegetableBird

架构实战营 架构师实战营 「架构实战营」

模块5作业

Asha

ASP.NET Core中三个egg疼的路由函数

喵叔

28天写作 12月日更

微博系统中”微博评论“的高性能高可用计算架构

Geek_cb2b43

如何构建“深入浅出,喜闻乐见”的界面

Ian哥

28天写作 沟通界面 深入浅出 喜闻乐见

在线火星文转换器工具

入门小站

工具

模块五作业

panxiaochun

架构实战营

模块五作业

侠客行

架构实战营 「架构实战营」

聊聊SAAS

Im胡子

SaaS

前端架构师神技,三招统一代码风格

杨成功

大前端 架构师 代码规范 代码格式化 签约计划第二季

自定义规则删除过期文件(linux)

liuzhen007

28天写作 12月日更

趣谈“分布式链路追踪“组件发展史

悟空聊架构

分布式 链路追踪 28天写作 悟空聊架构 12月日更

x

Nydia

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