Google|AOSP 违背了 GPLv2?

Google|AOSP 违背了 GPLv2?

文章图片

Google|AOSP 违背了 GPLv2?

出品 | 开源中国
作者 | 肖滢
策划 | h4cd
2007 年 , Google 开放了 Android 的核心代码 , 开源的这部分称之为 Android 开源项目 (Android Open Source Project , 简称 AOSP) 。 跟 Google 内部开发的 Android 有些不一样 , 它缺少了设备驱动程序以及谷歌移动服务( Google Mobile Services , 简称 GMS)等闭源组件 。 不过 , 它仍然可以编译出可用的系统 。
AOSP 的开源引起了争议 , 争议的焦点是它所采用的许可证 。
众所周知 ,AOSP 是基于 Linux 内核开发的一款操作系统 。 Linux 内核的许可证是强 Copyleft 的 GPLv2 , 它规定任何衍生版本都要在 GPLv2 下分发 , 但 AOSP 却采用了 Apache-2.0 。
这是否意味着 ,AOSP 违背了 GPLv2?
关键的 HAL 层事实上 , 说 AOSP 采用 Apache-2.0 并不准确 。
与其说 AOSP 是一个操作系统 , 不如说是一个包含了 Linux 内核 , 以及类库、应用框架等组件的软件集合体 。Linux 内核单独分为一组 , 称之为 Kernel Space , 采用 GPLv2 ;而运行在 Linux 之上的其他组件称之为 User Space , 采用 Apache-2.0、BSD、MIT 这样的宽松型许可证 。
为什么会这样呢?
本来 , 驱动程序应该放在 Linux 内核里面 。 因为 Linux 是宏内核操作系统(Macrokernel) , 驱动存活在内核 , 与内核共生在相同的地址空间 , 运作效率高 。
但硬件厂商不乐意了 , 驱动程序包含了重要的硬件参数 , 放在内核里面就必须根据 GPLv2 开源 , 核心商业机密就泄露了 。
为了打消硬件厂商的顾虑 ,Google 就搞了一个中间层 ——硬件抽象层(Hardware Abstract Layer , 简称 HAL ) , 把驱动的主要业务逻辑从内核中剥离出来 , 放在 HAL 层 , 通过接口调用内核系统 。
HAL 层属于 User Space , 根据 Apache-2.0 , 硬件厂商可以自由选择将驱动程序开源或者闭源 , 不愿开源的可以只提供二进制代码 。 内核中也有少部分驱动代码 , 不过只有控制命令和数据的功能 , 开源了也无所谓 。

【Google|AOSP 违背了 GPLv2?】Android 软件堆栈 。
除了规避 GPL 之外 ,HAL 层还有一大优势 。 它为移动领域五花八门、标准不统一的硬件驱动定义标准接口 , 避免 Android 过分依赖 Linux 内核 , 后续的扩展和整机集成变得更加高效 , 满足了手机制造商的重要诉求 。
难道真的跟 Google 所想的一样 , 调用内核系统的 HAL 层 , 不需要遵循 GPLv2 吗?
按照“Linux 之父” Linus 的说法 , 确实如此 。 1993 年 , Linus 及其他开发者在 Linux 内核源码树的 COPYING 文档中 , 添加了对许可限制和范围的说明 。 他们认为 , 用户程序通过正常系统调用内核服务 , 是对内核的正常使用 , 不属于派生作品 , 不受 GPL 约束 。 该说明一直沿用至今 。

通过隔离地址空间方式 , 避免被 GPL“传染” , 被认为是一种有效的方式 。
GPLv2 的维护者——自由软件基金会(Free Software Foundation , 简称 FSF )认为 , 软件聚合体包含有多个独立的程序 , 并在同一个 CD-ROM 或其他媒体上发行 。 如果两个模块在同一个可执行文件中 , 那它们肯定会绑定在同一个程序中 , 成为一个整体 。 如果两个模块在共享地址空间中 , 链接在一起运行 , 那意味着它们肯定会组合成一个程序 。 毫无疑问 , FSF 所说的这两种情况 , 只要其中一个模块是 GPL , 另一个都会被“传染” 。