Google Inbox如何跨平台重用代码?

Google Inbox如何跨平台重用代码?

原文链接《How Google Inbox shares 70% of its code across Android, iOS, and the Web

inbox2-640x264

开发一个移动应用在当下并不是一件容易的事情。如果想要获得最多的用户,你的应用通常需要覆盖 iOS, Android, 和 Web 三大平台。这就意味着同一个应用需要开发三个版本,使用 Objective-C 或者 Swift 开发 iOS 版本,使用 Java 开发 Android 版本,使用 JavaScript/CSS/HTML5 开发 Web 版本。工作量增大的同时也意味着有更多的 bug 需要修复。

这个问题也是 Google 在开发 Google Inbox 时致力要解决的。在最近发布的这款应用中,Google 使用了一些工具实现了70%的代码跨平台复用。

Google Inbox 覆盖 iOS, Android, Web 三个平台,它们使用的是同一个后台代码逻辑,只是前端的用户体验和平台相关特性的实现有所不同。Google 自主开发了一套辅助工具将 Android 版本的 Java 代码逻辑编译为 Objective-C (针对 iOS 平台) 和 JavaScript (针对 Web 浏览器)。 Java 到 JavaScript 的编译由 Google Web Toolkit SDK 完成,Java 到 Objective-C 的编译则由 J2ObjC (j2objc.org)来完成。

J2ObjC 是一个开源项目,由 Google 在2013年发布。Google Sheets (Google Docs 中的电子表格部分) 也使用了 J2ObjC,而 Google Inbox 则是目前使用 J2Objc 最多的 Google 项目。

Google Inbox 复用的代码逻辑包括:对话 (conversations),提醒 (reminders),联系人 (contacts)。还有网络相关功能和离线同步。这些代码逻辑的复用节省了大量的时间和成本。

在产品设计时,Google 将这些可复用功能划分为抽象的逻辑概念,比如:提醒的逻辑放在 “reminder.java” 中,可以被 Android UI 调用。对 iOS 版本而言,J2ObjC 将 “reminder.java” 编译成 Objective-C 代码,再由 iOS UI 调用。

Google 没有跨平台编译 UI 部分的代码,因为不同平台的UI特性各有不同,盲目统一会导致非常糟糕的用户体验。代码复用只是针对可以共享的后台逻辑,前端的UI实现是完全原生 (native) 的。这与 Xamarin (一个基于 Microsoft C# 的跨平台移动开发工具) 提出的概念类似。

跨平台代码复用通常会带来一些性能上的问题。Garrick Toubassi,Engineering Director 和 Google Inbox 项目组成员,对此表示: “性能上的影响如果有的话,也可以说是微不足道的。我们做过大量的性能测试。因为没有加入额外的中间层来处理跨平台兼容性,所有代码最后都是平台原生代码。J2ObjC 编译生成的目标代码和 Java 源代码拥有大致相同的对象数量和对象图谱复杂度 (object graph complexity) ”。

Google 使用的整套方法解决了跨平台移动开发中的一个很重要的问题,同时也推进了安卓先行 (Android-first) 的移动开发策略。

更多 Google Inbox 文章请猛戳 Gmail 官方博客

(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (40 人打了分,平均分: 3.78 )
Loading...

Google Inbox如何跨平台重用代码?》的相关评论

  1. @livelazily

    Dropbox 使用 C++ 实现 Android 和 iOS 之间的代码复用的相关文章:

    http://www.infoq.com/news/2014/05/dropbox-cpp-crossplatform-mobile
    http://oleb.net/blog/2014/05/how-dropbox-uses-cplusplus-cross-platform-development/

    这个方案看起来复杂得多,C++ 既不是 Android,也不是 iOS,更不是 Web 语言。为什么选择这个方案?还希望将来看到更多得文章和讨论。

    而 Google 选择安卓先行的策略则是顺理成章,自己开发的这些工具目前看起来效果还不错。

  2. living :
    我能说unity3d吗~

    赞成!unity3d作为一款游戏开发引擎,大多数游戏厂商都用它开发手游,开发完成后可以很方便的导出到多个平台,包括windows,linux,ios,android等等

  3. 如果是普通公司需要iOS, Android共享代码的话,大可以用C++而省却转换的问题。
    但若要同时兼容Web,我对Web开发不了解,不知道Web后台能用C++写吗?

  4. 陈同学,你以前有没有混linuxforum上?以前MSN里有一个叫 左耳朵耗子 是不是你啊?

  5. 有一种声音认为JavaScript会统一前端这一切,甚至后端的一部分.
    不知道您怎么看这个问题呢?

  6. Android-first 这种做法也就Google干得出来…… 如果Material Design能整个跨语言编译工具库的话这才是真的好东西,这样子让人用Java编程来实现跨平台,真是不靠谱

  7. 有一个问题啊,无论是gwt还是j2objc编译后的代码,应该都不是直接可用的代码(我猜测可能会有些许小的问题,需要人工参与修正一下)。假如这样人工后面参与改动了。后期更新,java那边更新了,objc这边是小幅手动更新下,还是再次j2objc编译,再重复手动修复?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注