大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

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

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

关注

评论

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

直播 QoE 监控体系设计与落地(二):流媒体卡顿优化实践

奔跑中的蜗牛666

android 音视频 卡顿

联想ThinkStation PGX桌面AI超算工作站正式发售,AI开发迈入“掌机"时代

科技范儿

从0到1掌握1688API:图片搜索获取技巧与避坑指南

tbapi

1688API 1688店铺数据采集 1688店铺所有商品API 1688整店商品采集

在AI技术唾手可得的时代,挖掘直播工具新需求成为关键突破点

qife122

AI应用 直播工具

一篇教你读懂主流LLM平台:企业如何选择LLM平台

伊克罗德信息科技

不做“赛博棉花工”!TRAE 帮我实现数据处理自由

北京中暄互动广告传媒有限公司

知音 CMS:全场景音频与小说分销一体化解决方案

微擎应用市场

【AI算法RFID门禁选型指南】如何判断识别精准度与防串读能力?

斯科信息

斯科信息 AI算法RFID门禁 AI门禁 AI智能门禁

利用Playwright MCP与LLM构建复杂的工作流与AI智能体

测试人

区块链U卡APP的开发

北京木奇移动技术有限公司

区块链开发 软件外包公司 U卡APP

扬帆出海:FinClip 驱动中国应用的全球化降本增效实践

xuyinyin

为什么要做海外营销?

Wolink

海外社媒营销 海外营销推广 沃链Wolink 达人营销

极氪汽车×火山引擎:AI数据专家“上岗”,注入“分钟级”数据洞察力

北京中暄互动广告传媒有限公司

在AI技术快速实现创意的时代,挖掘新需求成为核心竞争力——某知名笔记应用主题需求洞察

qife122

用户体验 需求分析

开源生态视角下 MyEMS 的能源管理系统国产化实践:架构设计与自主可控路径

开源能源管理系统

开源 开源能源管理系统

MyEMS 支撑公共建筑低碳运营:多维度能耗建模逻辑与运行优化策略

开源能源管理系统

开源 能源管理系统

一文读懂更换域名注册商的步骤和常见问题

防火墙后吃泡面

点量云流核心技术解析:构建高性能数字孪生的三大架构设计

点量实时云渲染

云计算 3D渲染 数字孪生 云渲染 像素流

基于 Seedream 4.0 模型的多图融合应用开发实战(下)

北京中暄互动广告传媒有限公司

Dify 企业版 vs. 社区版:为规模化应用构建而生的企业级优势解析

伊克罗德信息科技

数加加Edu:开箱即用的全链路AI数据标注实训平台

数据堂

人工智能 数据标注 实训平台 教育实训 数加加Edu

启信慧眼AI驱动供应链风险决策,助力中国半导体企业安全出海

合合技术团队

人工智能 大数据 算法

企业能源数字化转型的关键路径:MyEMS 的多系统集成方法论与接口标准化实践

开源能源管理系统

开源 能源管理系统

使用 Visual Studio 快速创建 NuGet 程序包并发布到 NuGet 官网

追逐时光者

.net 微软 Visual Studio 2022

CVE-2023-34367:Windows盲TCP/IP劫持漏洞技术分析

qife122

漏洞挖掘 漏洞利用

AI 英语写作导师 App的开发

北京木奇移动技术有限公司

AI技术开发 软件外包公司 AI技术应用

为什么你的海外红人营销没效果?

Wolink

海外营销推广 海外推广 沃链Wolink 达人营销

AI 姓氏头像生成小程序管理系统:专属头像定制与流量变现解决方案

微擎应用市场

ChatBI如何重塑企业数据分析?2025年智能BI行业趋势解读

飞鲤

数据分析 BI BI 分析工具 ChatBI

俄罗斯合作伙伴 Mobx,用 NocoBase 交付多场景方案

NocoBase

数据库 开源 项目管理 CRM 无代码

如何通过Python SDK在Collection中进行相似性检索

DashVector

人工智能 数据库 AI 大模型

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