VISION

Android 与 iOS开发详细对比

初创公司永恒的问题“Android还是iOS为先”变得越发棘手了,尤其是在报道称Android的市场份额超过80%的情况下。但不用担心经理们和非技术出身的创始人们:开发者们!开发者们!是怎么看待这一隔阂的?只要能让他们的生活变得更轻松,就能获得巨大的优势。

说到“他们”,其实是在说“我们”。当我不写TC专栏(和小说)时,我还是HappyFunCorp(拥有迄今为止最好名字的咨询公司)的软件工程师。由于我最近做了更多的管理工作,为了让自己不手生,我编写并开源了两个近乎一模一样的Android和iOS应用,这是我的私人宠物项目。让我用它们来带你体验两者的差异吧。

背景:我之前编写了很多Android和iOS应用,包含私人和工作项目。文章中提到的这两款应用都是原生应用,为我的宠物新闻聚合器Scanvine编写,Scanvine可以识别出在社交媒体中分享得不同寻常之广的故事。两个应用的完整源代码都放在Github上:(Android |iOS),实际应用也都可以下载(Google Play | App Store)。

在我们开始前,我不得不提一下Xamarin的跨平台开发工具。要是我精通C#就好了,如果我不是已经了解Java和Objective-C的话,Xamarin将是我原生应用开发的首选。

同时要申明:这更多的是“游戏之作”而非“专业品质”。你会发现这两款应用中严重缺少测试代码。我还有一个iOS heisenbug需要解决;我应该使用git子模块而非从第三方库中复制粘贴文件等等。

好了,没有再要说的了,让战斗开始吧!

开发环境

你还是可以用文本文件和命令行来编写代码,而且许多人也是这么做的,但使用IDE(集成开发环境)要有生产力得多。

总的来说,苹果的Xcode让人开发起来很愉悦。Xcode漂亮、快速、强大、帮助很大却又不扰人,而且在编译和通过证书/档案机制控制iOS应用和设备上做得越来越好了。Xcode的调试工具运行平滑,模拟器快速且反应灵敏。

Android?噢,Android。目前Android最先进的IDE是用Android插件定制的Eclipse,而它却很糟糕。慢、笨重、反直觉、布局糟糕、不必要的复杂,简直就是一团糟。它的调试工具也非常笨拙,我发现自己大部分时间都是通过日志进行调试,而XCode的调试工具却是我寻找iOS程序错误的首选工具。Android的模拟器也要花几分钟才能启动,其中差不多有一半没法连接到Android Debug Bridge,还是少提为好。

不过Google知道这是一个问题,他们也正在着手制作一款新的IDE:Android Studio。啊,终于!

Android Studio目前提供先期预览版。多项功能要么不完整,要么还没有加入,用户也许还会遇到错误。如果你对使用半成品感觉不适,或许可以转而下载(或继续使用)ADT Bundle(带ADT插件的Eclipse)。

很高兴能看到Google着手解决它,但真的很神奇(坏的方面),在我购入第一台Android手机4年半后,Android IDE还是糟糕得一塌糊涂。

优势:iOS甩了Android几条街。

配置

正如我提到的,在Xcode和Objective-C漂亮、无缝的外表之下,隐藏着上世纪70年代编程的偏爱工匠手艺的恐怖。开玩笑的……但是宏和头文件;项目、target、scheme以及build配置;繁多的build设置列表;遭遇令人困惑的linker错误时的绝望;以及“噢,这个第三方代码居然不支持ARC?只需加上-fno-objc-arc标记!简单,不?”的发现。

Android的配置文件只有一个,每当开发者保存一次文件,Eclipse就会build一次应用。我希望在因配置授权不当而导致应用不工作时,错误消息能提供更多信息,但这只是小地方。总体来说,Android的应用配置简单且简洁。

优势:Android。

UX设计

你应该预料的到,苹果会拿走这一奖杯。Xcode的Interface Builder(界面搭建器)能非常迅速地将简单、漂亮的用户界面以一种非常赏心悦目地方式组织在一起。问题是,我用Interface Builder的次数越多,我就越不喜欢它。这又加了一层配置复杂度;对于简单应用而言,Interface Builder很好,但随着时间推移和应用发展,这些简单的东西会变得复杂、混乱;而且我也非常不喜欢苹果在大约一年前增加的多屏Storyboard。

理论上,Android要有一个可比肩的视觉工具,但还是少提为好。实际上,你需要编写提供布局指导的XML文件,以便让应用在多种设备的多种屏幕上渲染得很好(希望如此)。(苹果的自动布局也是朝相同的方向前进,肯定是着眼于未来会出现更多尺寸的iOS屏幕)同时,Android提供了一个图标包供开发者们使用,而iOS开发者们则必须使用Icons8等第三方服务或自己制作。

总的来说,这方面的竞争要比你想象的差距小,尽管我承认,这给人的感觉相当古怪。最终说来,两样东西让iOS占据优势。首先,Xcode要简单的多:只有三种屏幕尺寸(包括iPad)和两种屏幕密度,而不像Android一样复杂。其次,默认的iOS视觉元素——如弹出目录和消息——看起来要比Android的吸引人得多。

优势:iOS。

语言

Android应用使用Java编写;iOS应用使用Objective-C。也有例外,如Xamarin;还有其他小众原生应用案例;以及PhoneGap等原生/网络混合体,但总体而言,原生Android应用使用Java编写,原生iOS应用使用Objective-C编写。

我是从Java开始的,起初并没有想太多要用Objective-C,大部分原因是Objective-C非常啰嗦:比如语句

String s2 = s1.replace(“abc”,”xyz”);

在Objective-C中变成了

NSString *s2 = [s1 stringByReplacingOccurrencesOfString:@"abc" withString:@"xyz"];

但我变得越发喜欢起Objective-C来。Objective-C比Java更好、更整洁。Objective-C有代码块(block),Java没有。Objective-C有类别(category),Java没有。Objective-C不用你写很多try/catch,Java还要你处理空白。

Java也有其优势。比如更好的堆栈踪迹(stack trace),这让追踪零星的错误变得更容易。两年前,Android还有垃圾收集的巨大优势,但现在iOS有了ARC,这一优势就消失无踪了(尽管老的第三方工具通常不支持ARC,开发者必须进行一些XCode配置,才能安文件关闭ARC)。这一区别消失,赢家就很明显了。

优势:iOS。

API

Android和iOS都向开发者们提供了庞大的软件库。宏观点说,这些库都很相似:有针对手机功能、网络访问功能、包括强大的WebView在内的View对象的API。绝大部分工作都是由控制器完成:iOS的ViewController差不多就相当于一个Android Activity。

iOS有而Android没有的是一套额外的框架和功能,比如Android就没有iOS强大的Core Data框架的对应物,也没有iOS更整洁、更好的设计系统。举个例子,将这两个做了应用大部分工作的相对简单的iOS类与这三个对应的Android类进行比较。最后我在Android类上花的时间要比在iOS类上花的时间多。

另一项指标(虽然有瑕疵):代码行数。这两款应功能近乎一样,但iOS应用的自定义代码有1596行,包括头文件;而Android应用的Java代码和XML代码加起来有2109行,多了32%多。

优势:iOS。

网络

如今大部分应用都使用互联网API,而不是单独的程序;这点已经足够重要,值得拿出来单说。iOS和Android都为此提供了全套工具和API。它们都提供了非常相似的WebView(网络视图),即便上就是功能齐全的浏览器,开发者可以在应用中任何地方插入。

网络连接基本上都是在后台运行,以便不堵塞主线程,而多线程又很难。Android提供AsyncTask类来做这类事,虽然很啰嗦,但效果很好,而且判断是否联网也很方便。iOS也提供相应的功能,但它们的表现相当低级,不能让人满意。

不过,有一堆开源库让生活变得轻松多了。我用的是AFNetworking,使用起来感觉非常好。你只需在网络请求完成后将代码块传递给它就能运行,这在Android中根本不可能,因为Java并没有block。

优势:原生Android有优势,但考虑到第三方库时iOS有优势。

分享

从应用中分享东西到Facebook、Twitter、Evernote等服务上有多容易?我曾经以为这是Android的首次完胜。长期以来,Android就有一个名为Intents的强大的应用间通讯系统。大体上来说,Android在让应用间请求并分享数据上要好很多。

而在(有点遗憾)更广泛意义上的分享上,苹果的领先很多。不要光听我说,你可以自行判断。分享Scanvine故事的Android代码在此,iOS代码在此。iOS代码长一些的唯一原因是,我多加了一些Google Analytics追踪代码。

优势:两者都没有。

碎片化

这一问题根本不用花太多时间讨论,答案当然是iOS胜出。值得注意的是,Google正进行一项有趣的去碎片化战略,也许这一点很快就可以重新探讨了。

优势:iOS。

发布

发布一款Android应用非常容易。只需要用一个方便的Eclipse向导来签名应用,你就会得到一个可以在任何设备上运行的APK文件。用电子邮件发送它,放到网站上,上传到Google Play中,就能在一小时内(有可能)向全世界提供。不能再简单一些了。在空余时间检查安装数据和崩溃报告,包括识别出问题的代码行的堆栈踪迹,并能立即上传修复错误的版本。

发布一款苹果应用则是噩梦。我的一位聪明的朋友总是会建议别人留出至少一天的iOS开发时间来解决证书和发行档案问题。不管我做了多少次,不管最新版XCode试图让这一过程变得多容易,这一直都是个很大的困扰。如果没有TestFlight,测试甚至会更糟糕。苹果的“iTunes Connect”网站比起Google Play开发者终端就像福特之于特斯拉。祝你好运,基本上你收不到苹果应用的崩溃报告,收到了里面也不会有什么有用的信息。你最终也会为强大的苹果UX有多糟糕而感到惊叹。

优势:Android领先很多。

赢家是……

iOS要领先很多。Android有其优势,但总的来说,编写好的iOS应用要比编写好的Android应用容易得多。加上iOS用户要有钱和有影响力得多,大部分想要闯出名头的初创公司还是应该以iOS为先。新的Android Studio IDE也许会极大地缩短差距,但并不是全部。(说明一下,我的主要手机是Nexus 4,用起来很开心。)(译:加佳)