Android程序员指南(1)
1. Android概述
可以说,传统的桌面应用程序(Desktop Application)的开发者们一时被宠坏了。这并不是说桌面应用的开发比其他平台要容易,然而,作为传统桌面应用程序开发者,我们确实能够开发任何我们所能想到的应用程序。在这里,我将自己归为其中的一员,因为我的程序设计生涯也是从桌面编程开始起步的。
使桌面编程更容易的原因之一是,我们能与桌面操作系统交互,并通过它十分自由地与任何底层硬件打交道。这种与设备无关的编程的自由,对于不敢涉足手机开发的程序员来说,是个遥不可及的。
注:这里我提到了两种不同的开发者:一种是传统的桌面应用程序开发者,几乎可以使用任何编程语言工作,他们的最终产品,和应用程序可以在任何“桌面”操作系统上建立并运行。另一种是Android开发者、及为Android平台开发的Java开发者。讨论的目的并非是说其中的一种开发者比另一种好或是坏,而是在于比较桌面操作系统与移动操作系统Android在开发方式及工具上有何不同。
1.1 嵌入式设备编程简史
很长一段时间以来,手机开发者组成了嵌入式设备开发者群体中的一个小支系。作为桌面开发、及后来Web开发的姐妹,嵌入式设备的开发没有那么迷人,而就硬件和操作系统特性(Features )而言,则是糟糕透顶,因为嵌入式设备制造商在特性支持方面是出了名的吝啬,他们要严格保守其硬件的秘密,所以他们只提供了很少的库(Library)供开发者在需要与硬件交互时使用。
嵌入式设备与桌面设备的不同点在于前者一般是单片机(Computer on a chip)。比如电视遥控器,它算不上什么复杂技术的产物,当一个键按下时,芯片根据程序设定的某种方式解释这个信号,这样设备通过输入设备(键盘)了解到需要做什么,并做出某种回应(如打开电视机)。这是嵌入式编程的简单形式。然而,无论相信与否,诸如此类的简单设备却能够与早期手机设备及开发的基本方式拉上关系。
大多数嵌入式设备曾运行或者仍然在运行着专用的操作系统。选择建立一个专用系统而不是使用现成的通用系统的原因是客观需要:简单的设备不需要很健壮及优化的操作系统。
但随着设备的进化,许多复杂的嵌入式设备,如早期的PDA、家庭安全系统、GPS,大约在5年前已转向使用某些标准的操作系统。小体积的设备操作系统如Linux,或Microsoft Windows的嵌入式版本,在许多设备中流行开来。在这次设备进化的过程中,手机作为嵌入式设备一个分支,与其他设备分道扬镳,走上自己的发展之路,当我们比较他们的架构时,可以看出其中的差别是显而易见。
几乎是一独立出来,手机就成为少数的只使用专用软件的设备,而这些软件为制造商拥有并控制,它几乎被认为是一个“封闭”的系统。使用专用系统的原因仍然出于需要,他们总是使用完全由内部研发出的硬件,或者至少是为手机而特别开发的硬件。这样做的结果是,能与这些硬件可靠交互的,公开的成品软件方案没有出现。同时,制造商还要保守他们硬件的商业秘密,虽然其中的一些可以通过访问设备级软件而看出端倪,但大多数情况仍然是使用完全专用的封闭软件。这种做法的消极结果是,由于打算为手机开发软件的人需要精通专用系统的开发环境,那么解决方式只能是从制造商手中购买昂贵的开发工具。这限制了许多业务开发者(Homebrew)的加入。
注:蓬勃发展的业余开发者们已经向手机伸出双臂,Homebrew这个词表明了这些开发者一般不为手机研发公司工作,而是开发小规模的一次性的产品。
此外,对于手机开发者而言更为迫切的问题是,硬件制造商的方案已经陷入了“内存VS需要”的两难境地。直到最近,手机能做的事情,除了打电话、通讯录、短消息以外并没有多少,没有真正的如同“瑞士军刀”那样的多面手。即使在2002年,用户手中的可拍照手机仍然很少。
到了1997年,小的应用程序如计算器和俄罗斯方块游戏出现在手机上。但令人惊叹的功能仍然是电话功能本身。手机还未成为多用途、多功能的个人工具。在当时,没有人能看到诸如移动上网,MP3播放、以及其他一些我们现在已经习以为常的众多功能。1997年的手机制造商们可能是未觉察到客户对于多合一功能(All in one)产品的需求。然而,即使这种需求出现,存储器又成了一个难以跨越的难题。
这个问题简单点说,在各种设备包括手机上,需要存储器来存储和运行应用程序。手机,作为一种设备,直到最近,也没有配备足以容纳“额外”程序的存储器。最近两年,存储器的价格已经变得非常的便宜。设备制造商现在已经能以较低的价格使用更多的存储器,许多手机也有了标准存储器,它们甚至比与90年代中期PC的情况相比要更为标准。所以,既然我们有需要,有可以增加存储器,那么就可以开发各种很酷的应用程序了吗?不一定!设备厂商仍然严守他们设备中运行的操作系统的秘密。虽然有一些被开放出来,用于开发基于Java的应用程序,但是更多的情况是不被允许。及时那些允许运行Java应用的系统也不允许访问核心系统,但这却是桌面开发者经常干的事。