内容速记:
AOSP 的上层开源许可证是 Apache 2.0 宽松开源许可证,大多数安卓软件都使用 Apache 2.0 许可授权开发者使用。另外,除了上层使用的 Apache 宽松开源许可协议外,下层还有 BSD 宽松开源许可协议,以及 Linux 内核的 GPL2.0 强传染性开源许可协议。根据 Apache、BSD 等宽松开源许可证,开发者可以在符合相关开源许可证的要求下,对 AOSP 开源项目中的源代码通过复制、修改、发行的方式进行使用。
但是其 Linux 内核的 GPL 强传染性开源许可协议,是安卓在构建自身开源生态时的拦路虎。GPL 协议大家都非常清楚,就是要求所有的后续开发以及衍生开发的源代码,全部必须要遵照 GPL 协议进行代码开源。如果遵照 GPL 强传染开源许可协议,则所有的驱动也不得不开源出来。谷歌显然无法让所有参与生态的人(比如芯片与器件供应商)都必须去开源。从谷歌的开源生态建设考虑来看,谷歌显然不会让这样的情况出现。为了开源生态构建,谷歌做了一系列巧妙的开源协议的选择和适配,并巧妙的在使用 Linux 内核的情况下又完美的绕开了 GPL 强传染开源许可协议,两头得利。
■ AOSP 的层级构成图--基于原始图片(来源于 https://source.android.com )绘制
Linux Kernel 虽然基于 GPL 2.0 开源许可证发布,但也在设计之初就设置了 GPL 许可证例外,例如在内核目录文件 LICENSES/exceptions/linux-syscall-note 中包含 Linux 内核的 COPYING 文件中记录的 Linux 系统调用例外,该文件用于用户空间 API(UAPI)头文件中。使用 Linux 内核的头文件定义,进行系统调用的程序适用该 GPL 许可证例外。
Linux Kernel 中 GPL 与非 GPL 的分界线为 GNU glibc, 其普通的系统调用为 GNU glibc 向外暴露的系统调用接口。而安卓则将 Linux 常用的 GNU glibc 替换为 Bionic libc 类库(改用宽松许可证 BSD),并通过该 Bionic libc 类库暴露了更多原来在内核空间才能使用的接口,让用户空间的驱动能够充分利用内核和硬件资源。
AOSP 在用户空间和内核空间之间设置本质为用户空间主驱动的硬件抽象层(HAL),规避 GPL 的硬件厂家把需要保护的商业机密以及知识产权相关的逻辑放在 HAL 层,以二进制包的方式发布,不需要公开源代码。