Google Inbox如何跨平台重用代码?
原文链接《 How Google Inbox shares 70% of its code across Android, iOS, and the Web 》
开发一个移动应用在当下并不是一件容易的事情。如果想要获得最多的用户,你的应用通常需要覆盖 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 ,请勿用于任何商业用途)
《 Google Inbox如何跨平台重用代码? 》的相关评论
代码重用好例子。
dropbox 不是也是这么搞么,貌似后来进了大坑?
最后的 Gmail blog 的链接坏掉了,链到本 blog 了
@livelazily
没加http:// 被相对路径了……
http://www.cnbeta.com/articles/336441.htm
其实弱爆了,Office做到了Win 32PC和Android之间95%的重用率
@livelazily
谢谢指正,链接已修复。
@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 选择安卓先行的策略则是顺理成章,自己开发的这些工具目前看起来效果还不错。
我能说unity3d吗~
所以,实际上,优秀的面向对象设计很重要。
赞成!unity3d作为一款游戏开发引擎,大多数游戏厂商都用它开发手游,开发完成后可以很方便的导出到多个平台,包括windows,linux,ios,android等等
如果是普通公司需要iOS, Android共享代码的话,大可以用C++而省却转换的问题。
但若要同时兼容Web,我对Web开发不了解,不知道Web后台能用C++写吗?
高效利用。赞!
@CocoaBob
后台可以,但是问题在于前台啊
陈同学,你以前有没有混linuxforum上?以前MSN里有一个叫 左耳朵耗子 是不是你啊?
为什么Google不用Qt这种能跨平台的?是不是因为UI不如原生的好呢?
@drk
Qt会有版权问题,而且Google是互联网公司,Qt是桌面的跨平台吧
有一种声音认为JavaScript会统一前端这一切,甚至后端的一部分.
不知道您怎么看这个问题呢?
@一个码农
用web来统一性能不如原生。虽然硬件越来越好,但是它始终跑不过原生
Android-first 这种做法也就Google干得出来…… 如果Material Design能整个跨语言编译工具库的话这才是真的好东西,这样子让人用Java编程来实现跨平台,真是不靠谱
Material Design能整个跨语言编译工具库的话这才是真的好东西 同意 单车
@一个码农
你是说的Node.js吧?
有一个问题啊,无论是gwt还是j2objc编译后的代码,应该都不是直接可用的代码(我猜测可能会有些许小的问题,需要人工参与修正一下)。假如这样人工后面参与改动了。后期更新,java那边更新了,objc这边是小幅手动更新下,还是再次j2objc编译,再重复手动修复?
html5,然后使用Crosswalk打包就行了
用c+lua来写核心代码和核心逻辑 可以很方便的重用代码