满大街都在谈论Android。
它是当红炸子鸡。许多人觉得,iPhone将受到它的强力挑战。
我也曾经对它充满了期待,但是后来的事态发展,令我改变了看法。前几天,我就在网志上写了自己的担忧:
“首先,Android应用程序只能用java语言开发。
其次,Google对Android采用了一种全面霸权式的管理,完全不是其他开源软件的开发方式,一切都由Google说了算,很多地方是黑箱,外界不得而知。”
没有想到,仅仅过了两天,担忧就变成了现实。Linux Kernel的维护者Greg Kroah-Hartman宣布,将Android 代码从 Linux kernel 代码库中删除。这意味着,Linux Kernel的开发小组不认可Android的贡献,两者产生了冲突。
消息公布以后,外界普遍觉得惊讶和可惜。好不容易,才有了一个这么受欢迎的开源手机系统,应该齐心协力、共同开发才对,为什么要“窝里斗”呢?到底是什么矛盾,使得Linux Kernel小组剔除Android代码呢?
Greg Kroah-Hartman写了一篇详细的文章,解释这个决定。下面就来看看,他是怎么说的,以及Android到底是一个什么样的系统。
在这之前,你最好知道Greg Kroah-Hartman是谁。他是目前Linux Kernel的核心开发人员,负责stable软件包的发布。就是说,每一个新版本的Linux Kernel,都是经过他的手流出来的。此外,他还负责硬件驱动的部署。而他的手机就是HTC G1,每天都在使用。所以,他是绝对有资格谈论这个问题的,他的看法代表了Linux社区对Android的看法。
首先,他指出Android和其他的Linux发行版不一样:
“Google has taken the Linux kernel, and nothing else from a "traditional" Linux system.
Google只用了kernel,别的东西都没用。”
这就是说,与Ubuntu、Debian、Redhat这样的传统Linux发行版相比,只有系统的底层结构是一样的,其他东西在Android里都不一样,尤其是程序员的编程接口是完全不同的。因此,Android应用程序都必须重新写过,现存的Linux程序无法移植上去。所以,从严格意义上说,Android是一种全新的系统,它与Linux的距离,比Mac OS与Linux的距离还要远。
然后,Greg Kroah-Hartman肯定了Android这样做的积极意义:
“Android also solves the problem that the phone manufacturers had been having for many years: a free version of Java and a unified application layer that programmers can write to that will work on all phone platforms that integrate it.
它解决了长期令手机制造商头痛不已的问题:业界缺乏一个开源的Java虚拟机,以及统一的应用程序接口。现在,程序员只要写一次程序,就能在各种手机硬件平台之上使用。”
这段话解释了,为什么Android的应用程序,都必须用Java语言开发。因为不这样做的话,没法让程序做到硬件无关。
且慢,这真的是理由吗?传统的Linux系统,也并不依赖特定的硬件啊!只要把源代码根据不同的平台,分别编译一下,同一个程序不也照样可以在不同的硬件架构、不同的Linux发行版中使用吗?
那么,Android只采用kernel、只允许用java编程的真正原因,到底是什么?
台湾的科技网志MMDays一语道破真相:
“Linux kernel 的版权是 GPL。
这下问题来了:如果你是硬件厂商,希望你的硬件能在 Linux kernel 下运作,那么就必须要有驱动程序。如果驱动程序的程序代码公开,等于硬件规格也公开的差不多了。许多厂商不愿意这么做,所以就提供编好的驱动程序,但不提供原始码。
Android 的重点就是商业应用,Google采用了一些手法来绕过这问题。他们把驱动程序移到 "userspace",也就是说,把驱动程序变成在 Linux kernel 上头跑,而不是一起跑的东西,这样就可以避过GPL。然后,在 kernel 这边开个小门,让本来不能直接控制到硬件的 "userspace" 程序也可以碰得到,这样只要把"开个小门"的程序代码公布就行啦。”
看明白了吗?
这段话的意思是说,Google玩了一个花招,在kernel和应用程序之间,自己做了一个中间层,这样就既不违反GPL许可,又能不让外界看到厂商的硬件驱动和应用程序的源码。
这样做或许有利于推广Android,吸引厂商和软件开发商的加入,但是也给Linux Kernel带来了麻烦。Greg Kroah-Hartman直截了当说出了自己的不满。
“...any drivers written for Android hardware platforms, can not get merged into the main kernel tree because they have dependencies on code that only lives in Google's kernel tree, causing it to fail to build in the kernel.org tree.
所有为Android写的硬件驱动,都不能合并入kernel。因为它们只在Google的代码里有效,在kernel里根本没法用。
Because of this, Google has now prevented a large chunk of hardware drivers and platform code from ever getting merged into the main kernel tree. Effectively creating a kernel branch that a number of different vendors are now relying on.
由于这个原因,Google也从不把大量的硬件驱动程序和平台源码向kernel提交。实际上,它创造出了一个kernel的分支,大量的开发者都依赖那个分支。”
这就是Android干的事情:它修改了Kernel,但是又不提供修改的细节,自己搞了一个封闭的系统。说得难听一点,它利用了开源社区,要求开源社区为它做贡献,却又不愿提供回报。
所以,Linux Kernel就把Android踢出去了,真是再正常不过了。
人们有权利质疑,Android这样的哲学是否正确?是否符合Google“不作恶”的口号?如果Android继续这样封闭下去,那么开源社区为什么要为它免费制作软件呢?因为我又不是在为开源社区服务,而是在为Google服务。既然这样的话,那还不如去支持iPhone呢,至少能在软件商店里多卖一点钱,而且乔布斯看上去也更酷一点。
slashdot上有很多关于此事的讨论。有人指出:
“Google自己的网站,与微软的网站一样封闭。它开源出来的东西,都是根据GPL许可证不得不开源的。”
好吧,姑且不谈Google本身,因为它至少不要求外界提供支持。但是Android不一样,你不能假装成开源系统,骗取社区的支持,然后又干着封闭系统的勾当。
Google必须做出选择。正如Greg Kroah-Hartman最后的呼吁:
“I really don't know. Google shows no sign of working to get their code upstream anymore.
我真的不知道未来。Google看上去没有任何改变代码的迹象。
I do hold out hope that Google does come around and works to fix their codebase to get it merged upstream to stop the huge blockage that they have now caused in a large number of embedded Linux hardware companies.
我确实希望Google做出改变,把它的代码合并进我们的代码,弥补已经出现的代码分裂。
I've privately offered in the past to help this work get done, and am doing again here publicly. But I need the help of the Google developers to make it happen, without them, nothing can change.
我私底下已经说过,我愿意帮助完成这项工作,在这里我再次公开这样说。但是如果没有Google程序员的加入,什么也不会发生。”
Android必须变成一个真正的开源系统。如果像现在这样封闭下去,就会被开源社区抛弃,就一定不会成功,即使有Google的支持。
(完)
============================================我是分割线=============================
关于 Linux “踢出” Android
昨天我照例去老袁的 blog 上找乐子,看到他新写了一篇文章《谷歌Android被Linux内核除名》,讲到了 Linux 把 Android 的代码树删除这件事,并借这件事,引申到了自己对 Google 的挞伐之中,并再次吹捧了 Windows。
老袁写的文章,我都是当笑话看的。看了以后就不管了,不过刚才翻 Google Reader 的时候,看到了阮一峰新写了一篇文章《Android,开源还是封闭?》。老袁写的笑话我可以不管,但阮一峰认真的写了这么一篇文章,我倒是对文章中的观点有些不认同。本来想在他的 blog 上留言的,但写着写着就觉得太长了,干脆总结成文章放在这里。
我觉得现在人们谈及 Google 必提“不作恶”,用这个词来规约 Google 的行为。这本身没什么问题,但我觉得这个词现在被过于“滥用”了。有时候众口难调,Google 不能满足所有人的时候,批判者就经常用“不作恶”来评判 Google。不同的人有不同的观点,所以事事都往"作恶"上面靠,让目前的讨论变得很空泛了,当然这只是题外话。
这篇文章里说的意思是,Google 的 Android 使用的是部分 Linux 的代码,按照 GPL 协议,Google 应该把所有的改动同样用 GPL 发布,以贡献开源社区。但事实是,Google 让硬件驱动运行在 userspace,这样这些驱动程序就不是 Android 的一部分,就不需要回馈给社区。Google 给硬件厂商提供了方便,使得他们写的驱动可以不用共享给社区,所以 Android 是个封闭的系统。
我觉得这样就有诡辩的成分在了。首先 Google 的做法是合法的。Android 本身是开源的,所以它没有违反协议。而硬件厂商给 Android 开发的驱动,版权并不属于 Google,因此 Google 自然也没有权利拿它们来回馈社区做好人。如果 Google 这样做了,岂不是和海盗湾的那帮传播盗版的人一样了么。当然,阮一峰是支持海盗湾的,可能他认为 Google 不这样做才是作恶吧。
文章中有一点挺有意思,还有些技术成分。Greg Kroah-Hartman 的文章里说 Android 为手机实现了一个统一的虚拟机,解决了程序的移植问题。阮一峰认为这是 Google 为了不贡献那些驱动而耍的小把戏,他说:"且慢,这真的是理由吗?传统的Linux系统,也并不依赖特定的硬件啊!只要把源代码根据不同的平台,分别编译一下,同一个程序不也照样可以在不同的硬件架构、不同的Linux发行版中使用吗?"
我觉得阮一峰可能对"平台"这一词并没有弄清除,或者是故意曲解了这个词。过去人们所说的 "C 语言具有良好的移植性","换一个平台,在那个平台上编译一次代码就可以了",这里面说的平台,可不是目前人们说的 32 位平台、64 位平台那么简单。平台之间的差异基本上到了 CISC、RISC 的差异那种程度上了,和目前我们想象的地址总线的数量不同了相比,显得更复杂。很多软件,在不同平台上移植,也不只是重新编译那么简单。比如说 Endian 的问题,光是要修改这一部分就要花费很大的功夫去修改。Mac 系统从 Power PC 平台迁移到 Intel 平台上的时候,发布过 Rosetta 程序,就是一个 Intel 平台上运行的 Power PC 虚拟机。很多软件,如 Adobe 的那些程序(印象里是 Photoshop,我们在 Computer Organization 课上讲过,现在记不清了),到最后也不是修改过去的,而是重头写起。像 Adobe 这样的大公司都是如此,手机上的软件开发着常常都是小团队甚至是一个人,要独立完成不同平台的移植工作,显然也是不容易的。哪怕是现在我们从 32 位往 64 位上过渡,经过了这几年都还没有搞完呢,更别提那些架构级别的移植了。
而 Java 通过虚拟机,算是彻底的解决了这个问题。如果像阮一峰想象的那样,重新编译就可以完成移植,那么当年 Java 还搞什么噱头?由于 Android 本身是开源的,而且手机硬件的生产成本又低于计算机,现在也没有统一的标准,所以在将来,我认为必然会出现千奇百怪的硬件。这些肯定不能通过简单的编译就解决问题。阮一峰的意思是为不同的硬件架构都做一个二进制包,这样一个软件,开发者就要为多个平台维护不同的二进制包,阮一峰总不会指望作者发布软件代码让用户自己编译安装吧?而如果 Android 想成为一个像 iPhone 那样的严肃作品的话,必然要有针对普通用户的一键式安装软件的机制。Apple 的 App Store 是一个很成功的先行者,而 Google 目前搞的 Android Market 也是在像这个方向努力着。而按照阮一峰的想法,当一个用户在安装软件的时候,被告知如果是 HTC 生产的硬件,就下载为 HTC 编译的包;如果是摩托罗拉的硬件,就下载为摩托罗拉编译的包。这样的手机,在普通用户眼里,也只能是"小打小闹",根本成不了气候。由于手机产生的平台可能会比计算机更多,那样的话后果说不定更严重。目前 Linux 在桌面领域已经是这个样子了,如果 Google 按照同样的策略去运作 Android,将来在市场上 Android 很可能表现还不如 Linux。面对 iPhone 平台,那样的 Android 只能是沦为几个黑客的玩具而已。
同样说道了市场,我的前提假设是 Google 做 Android 不是玩票,不是搅浑水,而是严肃的想涉足移动计算这一块。那么硬件的支持就是至关紧要的了。阮一峰的文章里也说明了,硬件厂商开放了自己的驱动的后果是什么。让那些硬件厂商把驱动吐出来显然是不可能的,所以迎合硬件厂商的要求也就是必要的了。其实仔细想想,这样的做法也并不算过分。对于用户来说,我们获得的还是一个开放的 Android,只是硬件的驱动是封闭的。开发者照样可以为 Android 平台开发软件。其实就算是桌面 Linux 用户,除了像 RMS 那样固执的人外,有几个会选择开源的显卡驱动呢?
所以,无论是从法理还是从情理上,我都觉得 Google 在这件事上没什么错。合理怀疑也是不错的,但把什么事都说成阴谋论就让人觉得不好了。尽管 Google 有"不作恶"这一说,但如果 Android 真得发展成了桌面领域的 Linux,那么它做不做恶都没有人关心了。
阮一峰在最后说:“Android必须变成一个真正的开源系统。如果像现在这样封闭下去,就会被开源社区抛弃,就一定不会成功,即使有Google的支持。”这口气让我觉得和老袁挺相似了。如果 Android 作为一个系统,这话还有可能说的过去,但作为一个商业产品的一部分,如此断言还是太过武断。