Android与iPhone平台比较
1.语言、编程模型和平台
1.1语言
iPhone开发语言选择的是Objective-C,Objective-C是基于C语言的,并对其进行了一些面向对象的扩展,如类、继承、接口、消息、动态类型等,而开发Android应用程序时使用的是Java语言(但它实际上不能真正编译字节码)。
Java对我而言就简单了,我必须要说的是我很高兴进入移动开发领域并没有因此而多学习一门语言,现有的编程技巧是来之不易的,如此重复使用专业知识是非常有价值的。
我还是花了一些时间来总结Objective-C的语言特性,我很快发现我喜欢上了某些语言特性,如消息传递、分类和命名参数,但是我发现Objective-C的语法有些笨重。通常我会感觉到为一个简单的概念不得不使用更多的表达式,而IDE提供不了多少帮助。
Objective-C实际上是一种80年代的语言,某些问题如拆分头信息和执行文件,以及DRY破坏确实是在浪费时间,这些问题都不小,我发现我自己不停地在文件之间来回切换,这不仅在导航上会有成本(哪个文件处于打开状态?),而且每个打开的文件都需要重新创建(加字符号在哪里,选中了什么内容,我在文件中什么位置,文件是如何组织的这些都要消耗系统资源)。
至于DRY,我声明一个属性时必须做5件事情??(在类定义中声明,声明getter/settter,在init方法中初始化,在实施时@合成,在dealloc中发布),如:
Server.h @interface Server : Updatable { NSString *name; <-- declare the property } @property (nonatomic,retain) NSString *name; <--- declare the property again Server.m @synthesize name; <-- implement getter/setter -(void) dealloc { [name release]; <-- release memory }
Java也有类似的问题,但情况没有这么糟糕,IDE可以帮助你编写getter/setter。
Objective-C中的指针虽然很强大,但也很浪费时间,在这里Java和它的垃圾回收机制就显得更迷人了。Objective-C的另一个麻烦是要记住许多约定和规则。
虽然我理解了为什么这里会有init和alloc,但指定[[alocFoo]initWithArg:arg]还是过去啰嗦,为什么不是[newFooarg]?或者是Foo(arg),越说越象Java了。
Objective-C的import和forward声明(@class)也很痛苦,虽然这些问题在Java中同样存在,但Eclipse的JDT非常好用,我都快忘了如何编写一个import了,只需要按Ctrl+空格自动完成一个类名或按Ctrl+Shift+O来组织import。
当然Java也不是完美的,但因为我已经与Java打了十多年交道,感觉又不一样了,有时我希望Java更类似于Groovy,但Java的工具确实有很多选择,并且都比较好用。
1.2平台
在Android上我发现可以立即使用Java运行类,但不是所有标准的JavaRT类都是可用的,但我并没有遇到这个问题,因为大部分标准的JavaIO、网络和正则表达式库都是可以使用的。AndroidRT类看起来是基于Harmony的,它是很稳定的,经住了时间的考验。
而在iPhone上,我发现我需要的功能是很困难的,类和方法组织得不好,当我在寻找一个静态方法时不是很方便,也依赖于使用的框架,命名规范和代码组织也可能不同,我认为这是旧平台遗留下来的产物。我发现规则表达式、字符串处理和XML解析也让我头痛,最终我不得不选择使用RegexKitLite,对于XML解析,我是在libxml基础上提取出来的解析器。
在iPhone上如果遇到什么问题了,我只能求助于Google,希望已经有人遇到过相同问题并已经有解决办法了,这都是因为苹果公司实施的保密策略的后果,在某些时候我只能靠猜测或通过试验找到解决办法。
Android得益于开源的好处,可以获得Android平台的全部源代码,甚至可以重新构建SDK,确保与模拟器中运行类完全匹配。因此在Android平台上不仅可以看到事情是怎么实施的,还可以通过例子进行学习,我可以在模拟器中一步一步学习平台代码,发现我的代码为什么没有产出预期的结果。
一般说来,我发现Android平台类的布局、组织和命名约定是一致的,是可预知的,这就使得它的学习难度大大降低了。
1.3编程模型
iPhone平台最伟大的工作是促进了一个MVC设计模式,使用这一设计模式建立的平台,构建UI都非常简单,但我还没有找到如何组织我自己设计的UI组件,这就意味着当看到示例代码时,所有的组织方式都是一样的。
Android催生的设计模式一样精彩,但它和iPhone的设计模式概念完全不同,Android支持多进程和组件重用,设计结果具有更好的用户体验,但它为开发人员引入了一些复杂性。
Android和iPhone都提供了用户首选项设置功能,都提供了UI来编辑这些首选项,都是保存在XML文件中,Android的XML是可以扩展的,允许自定义UI组件,但iPhone开发人员如果希望自定义首选项,就不得不从零开始实现这个UI,工作量就大多了。
1.4测试和持续集成
我认为任何开发都应该包括单元测试,只要团队不止一人,还应该包括持续集成。Android开发人员如果知道他们可以编写JUnit测试的话,他们一定会很高兴。我也曾看到一些iPhone单元测试的文档,但由于时间关系我没有仔细地研究,因此这里就不做过多的评论了。
2.资源
苹果公司为开发人员提供了大量的资源,重要的概念都配有视频教程,通过观看视频掌握概念就更容易了,虽然视频发布很慢,但苹果公司也提供了大量的示例程序和代码解释API的用法。
Android开发人员也有很多资源可用,新手指南和API参考在安装SDK时就一起安装到计算机上了,因此即便是在离线状态也有很多资源可用。我发现Android的开发资源组织得非常好,只需要很少的时间进行查找,更多的时间留给发现,特别是ApiDemos示例应用程序提供了一个很好的开头。为了研究架构和API用法,我还下载了许多开源的Android项目,在这方面Android确实占了上风,因为苹果公司一直采取的是保密策略。
3.工具
我将会涉及到的工具分类包括:IDE,UIbuilder,调试器,分析器。
3.1IDE
Android开发主要使用的是优秀的JDT工具,基本上只要安装了Eclipse的计算机上都会安装JDT,我使用这些工具已经有些年头了,至今仍然在用。JDT最有特性的可能要算它的增量编译了,当你输入时它可以立即提供错误和警告反馈,它消除了80和90年代普遍存在的“代码编译--等待反馈”的循环,当我在编辑器中输入代码时,警告和错误实时更新,为我提供了即时反馈,直到我在XCode中编写Objective-C时我才意识到这项功能是多么伟大,这时我才意识到在等待编译的过程中会打断编程的思路。
其它Eclipse的关键特性包括:
1、内容助手
2、快速修复
3、组织导入
4、开放式(CTRL+Shift+T)
5、重构
集成javadoc和内容助手是学习一个不熟悉的API的最佳方法,在Eclipse中编写代码时不仅可以使用所有的类和方法,还可以使用它们的文档。
集成javadoc的内容助手
XCode就太差劲了,我甚至不知道该如何下手,下面是我想到的XCode如果想继续活下去应该改进的列表:
1、内容助手要真正能够工作,XCode提供的内容助手经常都是错的;
2、一个像样的窗口/编辑器管理系统,XCode和它的辅助工具(调试器)喜欢打开很多窗口;
3、一个项目树视图,按字母顺序对文件进行排序;
4、集成API文档,我发现我经常在IDE和搜索API文档之间切换,这样会打断连续的思考。
3.2UIBuilder
iPhone开发人员拥有一个界面美观的UIbuilder,它很灵活并可以展示很多精密的UI,给我的印象很深,但用起来并不顺手,可能要反复看几遍文档才能搞定。
AndroidUIbuilder外观上就差多了,而且要对UI编写很多XML代码,不过也不用担心,有内容助手和校验的帮助,可以很快构建好UI。
3.3调试器
使用了Eclipse的Java调试器再去使用Xcode中的调试器简直就会崩溃,在Eclipse中可以看到并修改变量的值,但在Xcode中却不行,但这在调试代码时几乎是一个最常用的功能了,Xcode经常混淆对象的类型,除了提供指针值外就没有其它内容了,这与Eclipse形成了鲜明的对比。
我还发现Xcode的调试器UI很难使用,在堆栈上点击时会打开一个新窗口显示代码编辑器,最终导致打开了无数个窗口。
3.4分析器和堆栈分析
iPhone开发工具擅长的是概要分析和堆栈分析,这些工具非常成熟且易于使用,在没有预先学习的情况下,我很快就掌握了它们的用法,并快速发现和修复程序中的内存泄漏问题。
Android开发人员必须使用Android的单播跟踪程序,虽然工作得很好,但需要很努力地配置和操作才行,当我发现必须修改其源代码才能获得用于分析的跟踪文件时我非常惊讶。
我不确定Android是否可以提供hprof格式的堆栈转储文件,如果可以的话,就可以使用强大的MAT工具分析堆栈的使用了。
4.应用程序商店
iPhone的应用程序商店毋庸置疑是非常优秀的,但让人不愉快的是所有应用程序想要进入这个商店进行销售,都必须得经过苹果公司的审核,多数时候提交的申请都会被打回来,建议想在苹果应用程序商店销售软件的读者去看看这篇文章“避免iPhone应用程序遭到苹果公司的拒绝”(http://www.mobileorchard.com/avoiding-iphone-app-rejection-from-apple/)。还有一个问题就是想从苹果公司获得应用程序销售回扣也是比较困难的,至少销售额要超出250美元才有机会,但Google市场就不一样,只要有1美元就可以了,从苹果和Google公司获得的收益大概在应用程序销售价格的30%左右。
苹果应用程序商店可以将应用程序销售到世界各地,但在Google市场中只能销售到少数几个国家,但在Google市场中你可以无限制地上传你开发的程序,无需经过审核。
5.总结
Android平台和开发工具非常优秀,使用Java和EclipseIDE成为其胜出的主要因素,相比之下,iPhone的开发工具就差得太远了,Objective-C和平台API过于笨重,组织得也不恰当,总的说来,我在开发iPhone应用程序时就象回到了1993年,开发iPhone应用程序时成本大约要上升三倍,iPhone开发工具唯一的优势是它的分析器和堆栈分析能力。
从用户角度及目前在世界上的知名度而言,苹果应用程序商店是非常优秀的,在这方面Google市场就明显要弱一些。
可能过不了多久移动开发市场就会发生变化,至少今年会发布18款Android手机,对我而言,我更喜欢Android,当然iPhone也很优秀。