Chinaunix首页 | 论坛 | 博客
  • 博客访问: 430150
  • 博文数量: 168
  • 博客积分: 320
  • 博客等级: 二等列兵
  • 技术积分: 955
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-21 08:40
个人简介

知足却不乏追求

文章分类

全部博文(168)

文章存档

2017年(1)

2016年(6)

2015年(36)

2014年(5)

2013年(6)

2012年(114)

分类:

2012-12-05 08:21:06



最近开源界一件比较大的事情就是Linux Kernel的维护者Greg Kroah-Hartman宣布,将Android 代码从 Linux kernel 代码库中删除,此事对于普通用户可能并没有什么影响,但对于开发者来说,尤其是开源社区的开发者来说,算是一颗重磅炸弹吧。笔者听说这个消息的时候也是很 惊奇,Android不是一直都以开源身份自居吗?也正因为如此才被广大开源社区的用户所支持吗?今天笔者看到一篇描述通透的评论,于是转过来,希望更多 朋友可以了解事情的始末和真相:

满大街都在谈论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许可,又能不让外界看到厂 商的硬件驱动和应用程序的源码。

  里面的关键在于,Kernel和Android的许可证不一样,前者是GPL许可证,后者是Apache Software License(简称ASL)许可证。GPL许可证规定,对源码的任何修改都必须开源,所以Android开源了,因为它修改了Kernel。而ASL许 可证规定,可以随意使用源码,不必开源,所以建筑在Android之上的硬件驱动和应用程序,都可以保持封闭。为了得到更多厂商的支持,Google有意 选择了这样做,并且特意修改Kernel,使得原本应该包括在kernel中的某些功能,都被转移到了userspace之中,因此得以避开开源。

  这样做或许有利于推广Android,吸引厂商和软件开发商的加入,但是Google也放弃了构建一个真正开源的手机系统的机会,从而也就不能获得 由全世界程序员提供智慧、分享代码、推动创新的好处。关于许可证问题的深入讨论,请阅读Ryan Paul的文章《Why Google chose the Apache Software License over GPLv2 for Android》。

  Google的这种做法,直接后果就是给Linux Kernel带来了麻烦。Greg Kroah-Hartman清楚地说出了自己的不满。

  “…any drivers written for Android hardware platforms, can not get merged into the main kernel tree because they h文明用语e 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 h文明用语e 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的支持。


+++++++++++++++++++++++++++++++



   首先我得说我很喜欢Andriod平台,我一直都在使用G1,直到上周每一天都在用。它对我还有像我一样的使用者都很好用,我对此感到很高兴。
    从技术角度来说我也感到很高兴,Google选用Linux内核并在此基础上创建一个跟传统系统完全不同的手机操作平台是一件很让人吃惊的一件事,同时你还可以在Andriod设备上直接运行“真正的”Linux系统,并且它同Andriod系统都能在无需做出什么改变的情况下良好运行。
    Andriod同时解决了手机制造商多年以来就不得不面对的一个问题,即一个免费版本的和一个统一的程序运行平台,在这个平台上程序员可以写出在其他任何支持的系统都能运行的程序,因为这所有现存的“Linux手机联盟”都将面临这瓦解的境地,大概再过不久它们就会悄无声息的关上大门,假如它们还有门可以关。
    那么到底是什么导致Andriod内核代码被排出Linux内核之外?简单的说,就是因为没人关心代码,所以它才会被排出Linux内核。就像我早先声明 的那样,在架构树上的所有代码都应该和主分支内核相容,否则它就会被排除,但是这里有一个更大的问题是,Andriod不仅仅只是在/drivers /staging/andriod目录里多出一些“怪异的”驱动程序,假如你想要运行Andriod,你就必须先了解Google在安全模块中新写出来的锁类型,当然还有钩子类型。为了使你写出来的驱动程序能在Andriod中使用,你得把它恰当的同这个锁相容和,你有时甚至还要考虑这整个“怪异的”安全模块,天呀,这可是同Linux系统完全不同的驱动架构。
    因为这些驱动只能使用在Google的内核树上,这就意味着为所有为Andriod硬件平台编写出来的驱动都不可能进入主内核树,正因为这,Google 现在开始阻止这些硬件和驱动代码进入Linux主驱动树,并且积极地建立一个很多计算机销售商都依赖的内核分支。
    现在Linux发行版内核源代码树的分支都被维护地很好,但假如任事态发展的话,事情也许会变得很糟糕,因为Google没有使其代码进入主内核,这些编 写驱动和平台代码的公司都被排除在外而不能为内核社区做出贡献。内核社区几年以来一直都在试图说服这些公司把它们的代码加入内核,这样它们就可以使用安全 更新,并自动处理应用程序接口的问题,这些公司听从了他们的建议,你可以看到越来越多的大公司出现在在每个内核版本里,可现在这个进程因为Google停 滞下来了,因为Andriod的周边公司不能回报上游Linux内核,这就导致了这些公司需要在维护花费更多的资源同时增加了开发周期。


    为使Andriod融入内核需要做些什么?
    在早前Andriod加入架构树的时候,很多内核开发者检查了Andriod代码,并且指出了为了能被接受应该清理和改变的地方,这些改变很多影响到了 Andriod内核和用户空间边界,同时如果Andriod内核发生变动,Andriod用户空间逻辑也需要做出相应改变,所以就不要指望Google员 工去做这件事了。
    我真的不知道该怎么办,Google再也没有表现出希望把它的代码加入上游的打算,一些公司试图把它们的代码加入上游,可是那样需要去做更大的工程工作,是一种本来根本就不必要的痛苦。
    我真地希望Google能够修改Andriod代码库,使其重回Linux的怀抱,并停止它所造成的同很多Linux硬件公司的隔阂,我曾私下里帮助完成这个工作,而现在预备公开地再做一次,但是为了达到这点我需要来自Google开发者的帮助,没有他们,一切都不会改善。
    好消息是似乎所有对内核/用户空间应用程序接口的改变都不会影响在堆栈以上的Andriod代码(比如应用程序),所以这项工作的实施不会影响到整个系统。
    我会在2010年Linux高峰论坛年会上发表一个演讲,希望在那之前事情有所改观,要知道这个年会可是有对其参与者所做的坏事进行叫喊的传统的。


阅读(902) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~