来自iOS或者是Android平台的应用程序开发者们应该会对WP7、iOS以及Android之间的相似点和不同点比较感兴趣。因此我们在接下来的小节中将会从它们的体系结构角度来展示三个主要的移动操作系统之间的异同点。
在撰写本书时,iPhone主要经历了4代操作系统[1]。早期iPhone的模块使用了三星公司的处理器,直到iPhone 4才使用了苹果公司自己的处理器A4。前四代所有的iPhone都使用的是3.5寸的显示屏。iPhone 4拥有512MB内存和16GB/32GB的存储容量。所有的iPhone都装备了GPS、Wi-Fi以及蓝牙连接模块。
苹果公司的iOS系统实际上是从Mac OS X操作系统中派生出来的。Mac OS X是苹果公司为其Mac机(Macintosh)所开发的桌面操作系统。它实际上是一个以UNIX为基础,联合了Mach微内核以及众多来自FreeBSD[2]和NetBSD组件的操作系统。iOS使用了与Mac OS X相同的操作系统核心组件,并且苹果公司针对各种移动设备如iPhone、iPod touch和iPad做了一些特殊的优化,以改进其性能、稳定性和电池使用寿命。iOS的架构包括4层(自下而上):核心操作系统层(core OS layer)、核心服务层(core service layer)、媒体层(media layer)和可轻触层(Cocoa Touch layer)。iOS的应用程序是使用iOS软件开发工具包和Xcode开发环境,并使用扩展C的面向对象编程语言(Objective-C)编写的原生应用程序。
Android设备的硬件选择可以更加多样,因为Google并没有定义相应的硬件标准(而微软的WP7定义了一组所需的硬件标准)。总体而言,Android的手机,就像其他手机一样,包括了语音通话、数据通信、相机、GPS(全球定位系统)、Wi-Fi、蓝牙以及一些传感器(如加速度传感器和距离传感器)。在不同的设备上,其屏幕大小也是多种多样的,虽然大部分的情况下都使用的是3.5英寸和4英寸的屏幕。
Android设备软件的核心实际上是Linux内核。驱动以及硬件抽象层模块全都是基于Linux的。在Linux内核之上是Dalvik虚拟机以及它的运行环境,此外还包括一些原生库和服务。Dalvik是一种特殊的Java虚拟机,它针对Java应用程序在移动设备上的运行做了特殊的优化。Android操作系统最主要的一个部分是其应用程序框架,它由Java服务、应用程序编程接口、公共运行库、原生库和原生服务组成。图1-3展示了其中的具体细节(来源:http://developer. android.com/guide/basics/what-is-android.html)。
图1-3 Android体系结构
在Android上开发应用程序有两种选择:(1)完全运行在Dalvik虚拟机上的Java应用程序;(2)使用JNI(Java本地调用)调用原生库的Java应用程序。你也许会好奇为何Android开发者能够直接调用原生库?其实这主要是从性能上进行考虑的。因为通常原生代码能够提供比Java字节码(或者由Dalvik虚拟机产生的16进制代码)更好的性能。而这对于CPU密集型(CPU Intensive)的代码以及媒体处理代码而言是相当重要的。此外,当开发者打算从别的平台上移植C/C++代码的时候,如果能够将现有代码包装成原生库进行调用,要远比将其移植成Java代码要方便许多。
在WP7上,开发者是不允许编写原生代码的,他们只能编写托管代码。此外,WP7上只支持Silverlight和XNA编程接口的一个子集。然而,手机制造商们实际上是有途径可以将一部分的原生代码嵌入WP7的系统中的,并且在他们的应用程序中使用COM(组件对象模型)的互操作。微软提供给手机制造商们的软件开发工具包(SDK)与提供给一般开发者们的软件开发工具包是不同的,所以手机制造商们可以利用一些有限的Windows CE API来开发原生的COM DLL,并且在他们自己的应用程序中使用这些COM DLL。而这些COM DLL实际上可以看做是整个操作系统的一部分。不幸的是,一般的手机开发者们是无法访问到这个特殊的提供给手机制造商们的软件开发工具包的。
表1-1列出了这三个主要手机操作系统之间在系统级别的比较。
表1-1 系统级别比较
项 目 |
iOS |
Android |
WP7 |
内核 |
Mac OS X的Mach内核 |
Linux内核 |
Windows CE 6 |
支持的CPU架构 |
ARM |
ARM、X86 |
ARM |
内存模型 |
分页,没有基于磁盘的备份存储 |
分页,可选的SD卡交换区 |
分页,没有交换区 |
操作系统底层内存管理 |
有 |
有 |
有 |
管理运行时 |
无 |
Dalvik Java运行时 |
.NET框架公共语言运行时(CLR) |
应用程序沙盒 |
有 |
有 |
有 |
跨应用程序通信 |
有限的,使用自定义的URL |
Intent、广播接收器、内容提供器和服务 |
启动器和选择器 |
深入理解这三个主要的手机操作系统之间在应用程序框架上的不同,对于开发跨平台的应用程序是至关重要的。
iOS的应用程序是构建在可轻触层(Cocoa Touch layer)之上的,该层包含了一组扩展C的面向对象编程框架,如UIKit(用户界面工具包)、Game Kit(游戏工具包)、Map Kit(地图工具包)和 iAd等。可轻触层为应用程序和窗口提供了一组丰富的用户界面对象和事件处理机制,此外,媒体层和核心服务层也提供了一些媒体服务及核心系统服务。虽然开发者们能够直接调用媒体层和核心层所提供的一些服务,以便为他们的特定服务提供更加细粒度的控制,但是通常情况下,开发者们只须使用由可轻触层所提供的各项功能和方法即可。
类似的,Android的Java应用程序是构建在Android框架上的,这个框架由一组Java程序包(Java packages)组成,包括Activity Manager(活动管理器)、View System(视图系统)、Windows Manager(窗口管理器)、Telephony Manager(电话管理器)、Content Provider(内容提供器)、Notification Manager(通知管理器)等。Android的用户界面是在一个布局组合里,由一组视图组件构成。这个框架下的Java程序包是访问那些基本系统功能的接口,它们本身又是依赖于更加底层的原生库来执行这些最基本的任务。开发者们也能够直接将一些原生库嵌入到他们自己的Java程序中。不过,在Java代码和这些原生代码之间的交互,需要在JNI框架内完成。Android系统还介绍了一些独特的编程概念,如Activity(活动)和Intents(意图),这使得扩展系统程序和服务更加容易。
WP7的应用程序框架是基于.NET的,并且你无法使用原生代码(在本章的“局限性和发展路线图”小节中已经讨论过)。Silverlight和XNA都提供了一组.NET框架下的接口来访问那些基本的操作系统功能。此外,应用程序还可以通过标准的Windows Phone应用程序编程接口与媒体、本地和远程数据、传感器、位置信息以及手机相关信息进行交互。每个程序都会在一个独立的.NET沙盒中独立运行。这个沙盒的使用意味着在WP7上不允许在各个程序之间进行通信,也意味着如果开发者只能通过Web Service(web服务)作为程序之间通信的桥梁。
表1-2展示了这三个平台在应用程序框架上的一些异同点。
表1-2 应用程序框架比较
项 目 |
iOS |
Android |
WP7 |
可用的应用程序框架 |
Cocoa Touch |
Android框架 |
Silverlight和XNA |
编程语言 |
Objective-C(扩展C的面向对象编程语言) |
Java |
.NET语言(C#和Visual Basic.NET) |
原生API访问 |
允许 |
允许,通过JNI使用NDK |
不允许 |
SDK(软件开发工具包) |
Mac OS X上的iOS SDK |
Windows、Linux和Mac OS X上的Android SDK |
Windows 7上的Windows Phone SDK |
集成开发环境 |
Xcode |
Eclipse(使用ADT插件) |
Visual Studio 2010或Visual Studio 2010 Express |
用户界面定义 |
NIB资源文件 |
Widgets(小工具)和布局 |
XAML |
用户事件机制 |
Delegate(委托) |
在View(视图)类事件里的事件监听器 |
在CLR(公共语言运行时)里的事件处理函数 |
一些开发者们也许希望能够使用C#和Visual Studio等工具来开发Android和iOS上的移动应用程序。这样能使跨平台的设计更加容易,并且能在这些平台上重复使用已有的代码。为此,已经有一些相关的工具能够达到这个目的,如Mono-Android (http://mono-android. net/)和Monotouch (http://monotouch.net/)。
苹果公司的在线软件商店App Store是第一个移动应用程序商店,并且在本书撰写之时拥有的软件数量最多。然而,许多移动应用程序开发者质疑苹果公司的应用程序审核流程,因为苹果公司强加了许许多多的限制条件,并且因常常莫名其妙地拒绝一些应用程序而闻名。开发者们提交的每一个iOS的应用程序都需要通过一组政策验证,包括功能性政策、内容政策和法律政策。通常,这一过程需要数天甚至几个星期的时间。
Android的应用程序商店的成长也非常迅速,这是由于在2009年至2010年期间,Android设备出货量急剧增长。例如,在2010年10月,Google宣布每天有多达30万台的Android设备激活(http://mashable.com/2010/12/09/android-device-stats-2010)。Android的应用程序商店有一些强制性的内容政策,例如,不允许攻击性语言、裸体、性相关资源以及侵权行为。与苹果公司的应用程序商店相比,Android的应用程序商店显得更加开放——它不会对开发者所提交的应用程序进行任何验证。基本上来说,开发者只须简单地注册一个账户,上传一个应用程序,并且简单地对其做一些描述,就能使这个应用程序出现在Android的应用程序商店中了。Google会有一个专门的团队来处理那些关于某些程序违反内容政策的报告,并且如果需要的话,这个团队会将相应的应用程序从Android应用程序商店中移除。
苹果公司iOS的内容管理政策相关页面:developer.apple.com/appstore/ guidelines.html
Google Android平台的内容管理政策相关页面:www.android.com/us/ developer-content-policy.html
微软公司最早是从Windows Mobile 6.5开始提供移动应用程序商店的。但是这样的努力并没有太多的成效,一个主要原因是Windows Mobile操作系统开始逐步丧失市场份额。而作为新的Windows Phone项目发布的一个组成部分,微软重新设计了Windows Phone应用程序商店,以期望能够与另外两个竞争对手一决高下。而且,微软似乎也从苹果公司的应用程序商店以及Android的应用程序商店里汲取了不少经验,因而制定了一整套相当全面的应用程序验证流程,以检测每一个提交的应用程序是否违反了政策上和技术上的一些要求,以保证每个应用程序的稳定性、有效地使用资源、不会影响设备的其他功能以及不是一个恶意软件。这套应用程序验证流程包括了静态的和动态的测试,测试内容包括应用程序各项接口使用、稳定性、性能等。整个流程大概需要数周时间。
表1-3展示了三个平台应用程序上架流程的比较。
表1-3 应用程序商店处理流程
项 目 |
苹果App Store |
Android Market |
Windows Phone Marketplace |
注册费用 |
个人每年99美元,企业每年299美元 |
一次性25美元 |
每年99美元,包括可以免费提交5个应用程序 |
应用程序提交费用 |
无 |
无 |
免费应用程序提交需要19.99美元;付费应用程序提交需要99美元 |
收益分享(公司/开发者)比例 |
70/30 |
70/30 |
70/30 |
可用的区域 |
世界范围,特定国家商店 |
免费应用程序可以在任何地方访问,付费应用程序各不相同 |
17个国家和地区,包括一些欧洲国家、澳大利亚、中国香港、印度、新加坡、美国 |
内容政策 |
有 |
有 |
有 |
在真实设备上的测试 |
有 |
无 |
有 |
性能要求 |
无 |
无 |
有 |
项 目 |
苹果App Store |
Android Market |
Windows Phone Marketplace |
应用程序返回退款 |
有 |
有,在购买后的15分钟 |
无 |
先试后买 |
无 |
无 |
有 |
本文节选自《Windows Phone编程精要:iOS、Android开发者必读》一书。
《Windows Phone编程精要:iOS、Android开发者必读》一书已由电子工业出版社正式出版,本书由[美]Zhinan Zhou(周稚楠) Robert Zhu(朱渝) Pei Zheng(郑沛) Baijian Yang(杨柏健) 著 王仲远 译