Google Inbox 是如何实现 70% 的代码跨平台重用的

阅读数:2755 2014 年 12 月 3 日

话题:Google语言 & 开发架构

当前,开发一款高人气的移动应用并不是一件容易的事情,开发者不得不实现多个平台(如 iOS、 Android、WP 以及 Web)的版本以及针对某个平台某个版本开发单独的版本,这就意味着同一个应用需要开发不同的版本,直接导致了开发工作量的增大,同时也意味着带来更多的 Bug。然而,在 Google Inbox 项目中,Google Inbox 项目成员通过分离 UI 代码和业务逻辑代码,并利用 Ajax 应用开发框架GWT(全称 Google Web Toolkit)和 Java/Objective-C 代码转换工具J2ObjC实现了跨 iOS、Android、Web 三个平台,并复用了 70% 的后台代码逻辑,从而节省了大量的时间和成本。

在产品设计时,Google Inbox 项目组成员考虑到提醒、本地存储、缓存、联系人等功能没有必要在三个平台上都单独实现,所以将它们高度抽象为程序组件。代码开发过程中,开发人员首先开发出程序组件的 Java 实现,以供 Android UI 调用;然后使用 GWT 将组件的 Java 代码编译成 JavaScript 代码,以供 Web 调用;通过 J2ObjC 将组件的 Java 代码编译成 Objective-C 代码,以供 iOS UI 调用,从而实现了代码的高复用。另外,Google Inbox 项目组成员考虑到了不同平台的 UI 特性各有不同,盲目统一 UI 会导致非常糟糕的用户体验,所以他们并没有实现跨平台 UI 部分的代码复用。

众所周知,跨平台代码复用通常会带来一些性能上的问题。Google Inbox 项目总监 Garrick Toubassi 做了如下解释:

项目成员做了大量的性能测试,测试结果表明性能上的影响是微不足道的。这是因为他们没有加入额外的中间层来处理跨平台兼容性,所有代码最后都是平台原生代码,并且 J2ObjC 编译也没有增加对象数量和对象图复杂度。

Reddit的用户偏重对跨平台移动开发方代码复用方案的关注,并对方案中使用的 GWT 和 J2ObjC 技术进行了讨论。用户tieTYT间接地表达了对该方案的肯定,他说评论到:

编写一个完全本地化的应用是一种不负责任的行为,开发者不得不利用不同的语言实现某个应用,一旦发现该应用的某个 Bug,这就意味着进行两次 Bug 的修复。同时,他还支持跨移动平台的应用的开发是做不到 UI 代码复用的。

Hack News的用户偏重对 Google Inbox 的关注,用户jaimeyap 认为客户端和服务端代码的复用都是很重要的,不能只局限于客户端代码的复用,还认为 Android 先行 (Android-first) 的移动开发策略是一个非常合理的开发路线。而用户shadowmint 认为使用 GWT 开发是一个令人头疼的问题

Google 的这套方案解决了跨平台移动开发中的一个很重要的问题,同时也推进了其 Android 先行 (Android-first) 的移动开发策略。另外,微软的 Microsoft Office 项目也竭力覆盖了 iOS、Android 和 WinRT 等平台,并计划实现 96% 代码复用;云存储软件Dropbox 使用 C++ 也实现了 Android 和 iOS 之间代码高的复用,详细介绍可参考 InfoQ 的相关报道和 Oleb 的相关报道


感谢郭蕾对本文的审校。

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