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

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中文站投稿或者参与内容翻译工作,请邮件至[email protected]。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

你可能感兴趣的:(Dropbox经验谈:iOS和Android的C++跨平台开发)