写点什么

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

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

关注

评论

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

考生管理新范式,AIP智能体赋能教学工作效能升级

大东(AIP智能体运营专员)

智能教育

精彩继续“2026第七届深圳国际人工智能展览会”官宣定档

AIOTE智博会

人工智能展览会 人工智能展会 人工智能博览会 人工智能展

火山引擎 MCP 安全架构与实践

极客天地

火山引擎 EIC 解析:构建以 KVCache 为中心的推理新基建

极客天地

通义灵码保姆级教程:从数据读取、清洗、结合大模型分析、可视化、生成报告全链路

阿里云云效

阿里云 云原生 通义灵码

为什么i++不是原子操作?一个让无数并发程序崩溃的“常识”

poemyang

并发编程 多线程 原子性 Java并发编程

JavaScript面试题,为什么[] + 0 = '0', 而{} + 0 = 0?

不在线第一只蜗牛

JavaScript

YashanDB RTRIM函数

YashanDB

数据库

浅入了解向量数据库

老纪的技术唠嗑局

向量数据库

Django缓存机制详解:从配置到实战应用

电子尖叫食人鱼

django

2009年3月微软安全更新:内核漏洞、证书伪造与DNS欺骗风险解析

qife122

Windows安全 补丁管理

YashanDB SCN_TO_TIMESTAMP函数

YashanDB

数据库

通义灵码保姆级教程:从数据读取、清洗、结合大模型分析、可视化、生成报告全链路

阿里巴巴云原生

阿里云 云原生 通义灵码

舆情监测和舆情管理的区别与协同价值

沃观Wovision

舆情监测 海外舆情监控 沃观Wovision 舆情监测系统

【跨国数仓迁移最佳实践3】资源消耗减少50%!解析跨国数仓迁移至MaxCompute背后的性能优化技术

阿里云大数据AI技术

人工智能 云计算 大数据 数据分析 数据迁移

舆情监测和舆情管理的区别与协同价值

沃观Wovision

海外舆情监控 舆情监测系统

YashanDB RPAD函数

YashanDB

数据库

烟草行政处罚案卷制作平台入选“AI Solutions for SME”全球案例

中烟创新

高效阅卷,AIP智能体平台让教学反馈更及时

大东(AIP智能体运营专员)

智能考试 aip智能体

MIAOYUN参编信通院《大模型API服务性能测试标准》

MIAOYUN

人工智能 AI MaaS API服务 大模型API服务

无监督通用异常检测方法SEAD解析

qife122

机器学习 无监督学习

拯救重复劳动:无代码实现 Markdown文本抽取与切分

数由科技

markdown LLM 人工智能、 rag 文本分块

亚马逊AI模型评估产品评论中的实用建议有效性

qife122

自然语言处理 事实核查

AI Agent 运行时相比传统应用有什么不同:百家企业 AI 实践观察(二)

阿里巴巴云原生

阿里云 云原生 AI Agent

技术解析:如何做到从硬件到存储再到运维的极致降本?

老纪的技术唠嗑局

oceanbase 降本增效 #运维 数据库 大数据

手把手玩转本地大模型:Ollama+DeepSeek+Dify 零门槛全流程指南

测吧(北京)科技有限公司

人工智能 自动化 软件测试 智能体 测试开发

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