上周末去光谷书城,不经意间看到了程序员杂志2008年合订本,无意中看到这篇经典的文章:Andy Rubin 独家专访,感受颇深,将这篇文章稍微整理了下,在这里与大家一起分享。声明:原文章来源于程序员杂志2008年第一期,本人看到这篇文章后收获很多,将原文稍微修改(原文比较长,去掉无关紧要的内容,保留经典部分)。
整理后的文章如下:
2007 年11 月Google 宣布Android 平台,被众多评论者认为是今年移动领域最具影响力的事件之一。恰在12 月,Android 平台创始人Andy Rubin 访问中国,《程序员》杂志有幸成为采访他的第一家中国媒体,本文就是Andy 与杂志总编孟岩的对话。
…………
孟岩:这么说您也很喜欢iPhone?那么为什么还劳神费力开发Android 这样一个新的手机操作系统?
Andy :没错,iPhone 非常棒,但是它是一家公司的产品, 它从里到外的设计都是特定的,只有一个按钮,那么大的屏幕,特有的软件系统。尽管它很棒,但是它就是苹果的,别的制造商用不了。Android 不同,Android对所有人开放,而不只是一家厂商。你可以在摩托、三星、LG等几十个厂商的手机上运行Android。对于开发者来说,这一点意义重大,它意味着你写的手机应用可以无需修改地运行在几十个不同厂商出产的手机上。
孟岩:Android 手机会很贵吗?
Andy :不会。手机硬件越来越便宜。相对来说,软件成本才是居高不下。在整个手机的成本中,软件所占比例越来越大。这根20多年前发生在PC领域中的情况一模一样。Android是开源软件,能够有效降低软件的成本,从而降低手机的整体价格。
孟岩:如何保证那些手机都能够顺利地运行Android 的呢?各种手机的配置千差万别,难道是像微软那样指定一个硬件规范,要求厂商去遵守吗?
Andy :当然不是。这里面可是有门道的, 我们在设计时就努力地让Android 变得很容易移植到不同手机设备上。Android 也许是目前最具可移植性的手机操作系统。给你讲个实际例子吧。今年感恩节前后,我们的一个工程师打算利用假期尝试把Android 移植到一款诺基亚手机上。这是一款与我们的参考设备完全不同的手机,屏幕尺寸、按钮、无线设备统统不同。你猜猜他用了多长时间完成这一工作?
孟岩:少说也得一个星期吧?
Andy :只用了三个多小时,通共改动了4行C语言源代码。
孟岩:太令人震惊了!
Andy:可不是吗,连我也感到震惊。我想这就是开放平台的威力。
孟岩:您提到开放,一个开放的手机软件平台对于手机制造商来说有什么意义呢?
Andy :目前手机操作系统大约占手机成本的20%,而在此之上,手机制造商还必须自己集成若干重要应用软件,如浏览器、短信、图片显示软件等等,这给他们带来了不小的负担。Android 提供了一个从操作系统到应用程序的完整软件栈,同时又允许人们定制差异化,以形成自己竞争优势,对于手机制造商来说,其意义不言而喻。开放带来的另一个好处是允许厂商自主解决问题,当你发现Android系统中有bug或者不符合你要求的地方,不必等上18个月,而是可以直接解决。
…………….
孟岩:如果Android 取得成功的话,Google 和你本人肯定无意成为手机软件领域的统治者吗?
Andy :当然不会。开放本身就意味着没有人统治一切。况且如今已经有三十多家公司加入Android联盟,实际上Android 不是Google 一家的,任何人都可以拥有Android。相信我,没有人能成为Android世界的垄断者。
孟岩:如果是这样的话? Google又能得到什么好处?
Andy :你还记得我刚才说过的,今天的手机软件产业与20 多年前的PC软件产业如出一辙。因此我们要注意,如果只有一家公司来提供手机基础软件的话,那么毫无疑问就会再次产生一个巨无霸的垄断者。今天世界上大约12 亿PC用户,可是手机用户有30 亿之多!这意味着,手机一定会成为人们获取信息的主要设备。如果有一家公司垄断了手机软件市场,它就可以决定人们可以看或不可以看什么样的信息, 这是很严重的问题, 也是Google 不愿意看到的。我们开发Android 并且将其开放, 就是要防止这种情况发生, 让每个人都可以平等自由地访问信息。只要用户能够自由获取信息,Google 就可以找到自己的业务模式。
孟岩: 好吧,那么告诉我, 你为什么要把这个系统命名为Android ?
Andy :Android 其实是我于2005年1 月创办的手机操作系统软件公司的名字,半年后这家公司被Google收购了,不过我们的产品名字继续称为Android。至于其来历嘛,我创办的上一家公司叫做Danger(危险),你说如果上一家公司叫“危险”的话,下一家公司该叫什么名字?总不能叫“完蛋”吧?我是说,高科技公司取名字尽可以有趣一些,既然Linus Torvalds把自己写的操作系统称为Linux,那么我的名字是Andrew,把这家公司叫做Android有何不可呢?再加上我本身是个机器人迷,所以Android 这个名字还是不错的。事实上, 在Android 之前,我们能已经做出来一款手机,叫做T-Mobile Sidekick。这款产品很成功,好莱坞的很多明星都用它。但是我觉得毕竟它能够触及到的人群还是有限,所以决定做一个手机操作系统,能够运行在各种手机设备上。
孟岩:Android 由Linux+Java 构成。手机操作系统用Linux 我能理解, 用Java 也是情理之中。可是Android 不是把现有的成熟的Java 拿来直接用,而是从头开始重新实现了一个Java,从虚拟机到相当多的Java 类库。这不是重新发明轮子吗?有这个必要吗?
Andy :对我来说,“Java”这个词意味着四种东西:一种编程语言,一种虚拟机,一个类库,和一个应用程序框架。我们的确重新开发了虚拟机,这是因为要克服现有手机JVM的一些固有缺陷,比如启动时间过长,功能受限。你知道,Java ME为了保证“一次开发,到处运行”,就不得不迁就那些配置非常低端的手机设备,结果导致其功能十分有限。而你看看iPhone之所以这么酷,就是因为它完全不考虑要去兼容什么过时的设备,iPhone的配置完全不亚于一台五年前的PC。我们在设计之初就决定,甩掉不必要的历史包袱,对Android的硬件配置作出一定的要求,从而使得我们可以在比较高的水平上重新设计和优化JVM。此外,我们的确完全重新开发了一个应用程序框架,称之为Android应用框架。这是因为我们对于如何组织手机应用程序有全新的、特别的想法,现有的Java ME完全不能满足我们的需要,所以重新开发一个,这并没有什么大不了的。
孟岩:什么全新的、特别孟岩:什么全新的、特别的想法,能透露一下吗?
Andy :我们希望支持手机应用程序的mash-up。“Mash-up”这个词是从Web 2.0 里偷过来的,你应该知道什么是Web 2.0 mash-up 吧?
孟岩:这我当然知道。比如我从一个网页上抓下一块XHTML 数据,再从另一个Web Services 那里获得一些XML 数据,我就可以把这两块数据mash-up 起来,形成新的XML 数据,并且这一数据可以在此被别人mash-up。不过Web 2.0 中的mash-up 是基于XML数据的,难道Android 中的mash-up 也需要借助XML 来完成吗?
Andy :好问题。在传统的手机开发中,应用程序要么调用操作系统服务,要么通过程序库获得较高级的服务。如果操作系统和程序库都没有提供某项功能,应用程序开发者只好自己实现。在Web上,一个Web应用不仅可以使用本机上由操作系统提供的服务,还可以以你刚才所说的方式使用其他Web 应用所提供的服务。这样一来,Web 应用程序不仅可以依赖操作系统服务,而且可以彼此相互提供服务。这就是我们想在Android中达成的目标,也是为什么我们要重新开发一个应用框架的根本原因。
孟岩:这个想法是怎么来的?
Andy :你知道Google是一家互联网公司,并且拥有很多世界上最聪明的软件工程师,像mash-up 这样的想法就长在Google的DNA里,所以把这种思想带入手机平台很自然。
孟岩:能详细的讲讲Android 如何实现mash-up 吗?
Andy :Android 的mash-up 中有两个关键概念,一个称为Activity,一个称为Intent。Activity 可以完成某些工作,而Intent 可以表达“要做某事”,一个Activity可以满足若干Intents。我举一个例子好了,比如我在写一个email,打算附加一个图片附件,需要选择图片。我会广播一个Intent,说:“我要选择图片,你们谁能选择图片?”。那么设备中的Android 应用和外部的服务,如Flickr 和Picasa 都可以举手响应说:“我行!”然后用户就可以选择其中最合适的那个来选择图片。
孟岩:听起来很像GUI 框架中的Signal/Slot ?
Andy :我觉得更好的类比是微软的COM体系。Android 可以把设备内和互联网上的服务都以上述的方式mash-up 起来。这一能力实在非凡。它使得开发者能够在一个非常高的层次上快速开发高质量的应用。
孟岩:这对于开发者确实有很大的吸引力。
Andy :当然。对于开发者而言,Android 是一个非常有特色的先进的平台, 能够放大开发者的能力和效率。同时,Android 的开发语言和环境都是开发者所熟悉的。Java 语言是世界上最流行的语言,而在开发环境方面,我们选择了大家熟悉的Eclipse和IntelliJ。所有的软件、工具和模拟器都是免费的,整个系统稍后还会完全开源,开发者无需做任何痛苦的转型,就可以为Android 开发应用。
…………
读后感
看了以上Android之父对每个问题的解析,我们这些Android应用程序开发人员大脑中的很多疑惑,是不是都消失了?每个Android开发人员都能从这篇文章中受到很大的启发,如果想看原文请到程序员杂志的官网站去下载。在后面的篇幅中我们会抽空,继续与大家分享Android方面的一些经典的文章。
随机日志
Activity 、Intent深入解析
By: 海市蜃楼 | In: Android开发
学习Android SDK有段时间了,对Activity 、Intent的学习与使用都比较了解。第一次完整的学习Activity 、Intent后,我就感觉这似乎与Windows COM技术有些似曾相识的感觉,写了一篇将Activity 与 COM做了比较,但是一直感觉意犹未尽,前几天在程序员杂志中看到一篇经典的文章,茅塞顿开。
声明:源文章来源于程序员2008年的第一期杂志,本人将这篇文章整理后与大家分享。
首先我们来了解一个概念:Mash-up。
什么是Mash-up?
举个简单的例子:从一个网页上抓下一块XHTML 数据,再从另一个Web Services 那里获得一些XML数据,就可以把这两块数据mash-up起来,形成新的XML数据,并且这一数据可以在此被别人mash-up。
Android、Intent的深入解析
在Android软件环境中,应用程序是由一组Activities 组成的,而每一个Activity 不但是本应用的组成部分,而且也对外开放,可以向同一系统内任何一个外部应用提供服务。例如,编制手机短信无疑需要一个小型编辑器,这个编辑器在Android中由一个Activity 实现,并且可以以构件的形式暴露出来。如果开发者在开发另外一个应用程序的过程中需要一个小型编辑器,则无须重新开发,可直接调用短信应用中的这个编辑器Activity 得以实现。这种多层次的组合能力,与Web 2.0 基于XML的mash-up如出一辙。
Android 调用activity 所提供的接口(服务),并不是直接调用,而是借助一个叫做Intent 的机制实现的。所谓intent 就是对于服务的调用请求。与其他技术体系不同的是,Android可以无须明确地指定要那个组(activity)来满足自己的调用请求,而是可以要求系统根据它的要求,自动选择一个能够满足要求的activity 来提供所需的服务。
大致的过程如下:每一个activity 都可以对外提供一系列的服务,这些服务以Intent-filter 的形式对外公开,并提交给系统进行注册。所谓intent-filter,就是一个activity 的能力列表。例如,一个用于编辑短信正文的文本编辑器activity 应通过AndroidManifest.xml文件中的<intentfilter>元素向系统注册,表明activity具有EDIT 和VIEW文本数据的能力,如果有另一个客户要求EDIT和VIEW一段文本数据,则系统可以调用本activity 予以满足。Activity 本身既是提供服务的组件,也可以是组件的客户。
例如一个备忘录应用中,应用启动时可以显示一个现有备忘录的列表,这是由一个activity 实现的。而当用户选择编辑或新建一个备忘时,这个activity 需要一个文本编辑器activity 来完成这项工作。它怎么做呢?当然不需要自己从头开发一个,而只需要以intent 的方式告诉系统说:“我需要一个具有编辑文本能力的activity 来帮我编辑一个备忘信息”,系统会自动寻找在<intentfilter>中声称具有该项能力的activity,然后激活这个activity,用来满足这个intent。
Windows平台的开发人员会发现,上述的工作方式与COM 很相近,2者的比较如下图所示:
Mush-up的作用
如果Android 平台提供的基础构件足够丰富,则开发新的应用程序将变得高度简化:开发者可以利用现Activities 快速组合出应用程序的主体,只有程序的特色功能需要亲自实现,这无疑极大地提升了生产力和软件质量。不但如此,新实现的Activities 也可以作为其他应用的构件而被再次组合。
总结说明
Mash-up 是Web 2.0 平台上的关键技术概念之一。Android 平台在技术上的最大亮点,就是将mash-up 技术引入了手机操作系统。实际上以现有成熟构件为基础,通过组合方式快速构造和开发新应用,这样的想法并非Android 首创,在Windows系统中的COM技术就是这种思想的体现。
Android之父曾经特别强调过:Android吸收了从COM构件体系到Web 2.0等技术体系的思想精髓,实现了多处技术创新,其中尤以应用程序级别的mash-up为最令他自豪的特性。
Android SDK深入解析— Application Components
By: 海市蜃楼 | In: Android开发
Android SDK中是这样解释Application Components:
原文摘要:
A central feature of Android is that one application can make use of elements of other applications (provided those applications permit it). For example, if your application needs to display a scrolling list of images and another application has developed a suitable scroller and made it available to others, you can call upon that scroller to do the work, rather than develop your own. Your application doesn’t incorporate the code of the other application or link to it. Rather, it simply starts up that piece of the other application when the need arises.
For this to work, the system must be able to start an application process when any part of it is needed, and instantiate the Java objects for that part. Therefore, unlike applications on most other systems, Android applications don’t have a single entry point for everything in the application (no main() function, for example). Rather, they have essential components that the system can instantiate and run as needed.
简译
Android有一个核心的特征:一个应用程序可以使用其他(提供了使用许可的)应用程序的元件。例如:如果你的应用程序需要一个用于图片显示的可滚动列表,而另外一个程序刚好包含了一个可用的列表(元件)且提供了使用许可,那么你就可以调用这个列表来为你的程序工作,不用自己开发。你的应用程序也不需要包含其他应用程序的代码,也不用连接到这个应用程序上去。相反,当你的程序需要使用其他应用程序的时候,只要启动它的一个片段就可以了(当然,前提是提供了使用许可)。
无论你需要调用这个应用程序的哪个部分,系统都必须启动这个应用程序进程,并实例化该部分的Java对象。因此,不同于其它多数系统上的应用程序,Android应用程序没有单入口点(例如:没有main()函数)。相反,他们的本质其实就是组件(components),系统能够实例化并按需要运行的东西。
深入解析
看了这段话,有了这样的了解:在C、C++、Java中都有一个固定的main()函数,作为整个应用程序的入口;而在Android中,是没有这个固定的main()函数的。在某些情况下,一个程序可以调用另外一个程序中的某段代码,整个应用程序没有一个固定的入口。
看到这里时候我有些糊涂了,程序没有固定入口,那它到底依赖于什么样的运行机制呢?
实际上,这只是一个引言,它只是为了强调:
一个Android应用程序是由四种不同的组件(Activities,Services,Broadcast receivers,Content providers)组成的,有点类似于Windows 中的COM组件,这些组件就是SDK中提到的piece of the other application。看到这里心中的不解少了很多,这实际上就是说:开发人员可以将自己应用程序中的组件开放出去,提供给其应用程序使用,是不是与Windows COM组件有些类似?既然与COM组件有些类似,那么是如何实现类似于创建COM组件(通过的组件的ID来创建组件)、使用组件接口提供的功能等的呢?
深入分析,我们就会发现Android提供了Intents,类似于前面说的“组件的ID”。Intents就是用来描述我们的意图是什么,将它提交给Android系统,由Android系统按照这个意图,去寻找合适的组件,并启动这个组件来处理我们的任务!类似于COM组件,Android就相当于是一个比较大的工厂,Intents就相当于是订单,Components就相当与是生产线。当把订单提交给工厂后,工厂就按照订单的需求并结合产品线的功能来选择合适的生产线。各个组件之间统一通过Intents来间接相互调用的,这与COM通过统一接口创建组件的思想也是一样的。在Android应用程序的内部,通过在AndroidManifest.xml文件中Components的<intent-filter>元素来说明Components可以处理什么样的Intents,这与COM组件的注册似乎也不谋而合。由此可见,Android的框架与Windows COM的框架十分相似。
最后需要说明的是:这就是Android整个程序的框架。所有应用程序都是Components组成的,包括Android中Google自己开发的程序,也就是说:你可以开发出应用程序,最终让Android上Google开发的应用程序来调用你的应用程序。这不是玩笑,在Android中很容易实现,比如,要是你觉的Android上的虚拟键盘不好用,你可以开发个你自己喜欢的虚拟键盘,以后当Android需要使用虚拟键盘的时候,就可以调用你的虚拟键盘。 在Android 中所有应用程序都是公平的,这也是Google“以用户为中心,其他一切水到渠成”的体现,永远把用户放在第一位。
总结说明
Android Components从整体设计来说与Windows COM 组件的设计思想是完全类似的,通过这种方法实现了:一个应用程序在需要的时候可以启动另外一个应用程序的一部分。这是否是Google想让所有的开发人员来共同完善Android系统,而不仅仅是开发Android应用程序呢?