Linux 发展时间线

Linux 系统是类 UNIX 操作系统大家族中的一员。所谓类 Unix 系统,是指继承 UNIX 的设计风格演变出来的系统,比如自由/开源的 GNU/Linux、FreeBSD、OpenBSD等,以及商用的 macOS、Sun的 Solaris 等等。它们都相当程度地继承了原始 UNIX 的特性,有很多相似之处,并且都在一定程度上遵守 POSIX 规范(UNIX 可移植操作系统接口规范)。Linux 几乎是最著名的一个类 UNIX 系统。其最吸引人的一个优点是它不是商业操作系统,它的源码在GNU(GNU’s Not Unix)公共许可证(GPL)下是开放的,任何人都可以获得源代码并研究它。

这是一篇知乎的文章简要介绍了Linux发展的历程: 点我查看
其中,Richard Mathew Stallman 在 1984 年发起的了GNU 计划(目标是创建一套完全自由的操作系统GNU),目前我们所使用的很多自由软件,几乎均直接或间接受益于 GNU 这个计划,bash,gcc 均在此诞生。

开源许可证

上边介绍到了 1984 年的 GNU 计划,到了 1985 年,Stallman 为了避免 GNU 所开发的自由软件被其他人所利用而成为专利软件, 所以他与律师草拟了有名的通用公共许可证 ( General Public License, GPL )一个软件挂上 GPL 版权宣告之后,使用者可以自由的执行、复制、再发行、学习、修改与强化自由软件。但不能将一个 GPL 授权的自由软件,在你修改后而将他取消 GPL 授权,也不能单纯的贩卖自由软件。
Linux kernel 的版权是 GPL
此处借用一张图来展示不同的开源许可证:
在这里插入图片描述
在这里插入图片描述
首先我们要明确Linux版权是GPL,也就是说在开发者修改Linux源代码后也不能作为自己的专利发布。而Android的本质也是Linux系统,但是从第二张图的中间部分可以看出 Android 的许可证为Apache License2.0也就是有自己的专利。可以发现两者之间发生了冲突
一个硬件厂商希望自己的硬件能够在Linux内核下运行,就要写相应的驱动程序,但是如果在Linux内核层面编写驱动程序就无法盈利了,因为要遵守GPL许可证开源;为了盈利,厂商把驱动程序移到 userspace,也就是说,把驱动程序变成在 Linux kernel 上层跑,而不是一起跑的东西,这样就可以避过 GPL许可证的约束。
然后,在 kernel 这边开个小门,让本来不能直接控制到硬件的 “userspace” 程序也可以碰得到,这样只要把"开个小门"的程序代码公布就行啦。
非常巧妙就盈利了。

Android开源系统的内容来自知乎

原文来自知乎:原文
Android代码包括三部分:
1.Android开源系统(Android Open Source Project,简称AOSP)提供了Android系统的框架,包括修改后的Android专用Linux内核,Dalvik虚拟机和Android应用层框架等。AOSP的大部分源码采用Apache 2.0 授权模式发布,另外Android专用Linux内核部分采用GPL授权。Apache 2.0授权规定,可以任意使用源码,不需要开源。GPL授权规定,对源码的任何修改都必须开源。Linux内核的授权是GPL,而AOSP修改了Linux内核,所以AOSP必须开源。
2.Google移动服务(Google Mobile Service,简称GMS)GMS是由Google提供的一系列提高用户移动体验的应用和服务,包括置服务和内购功能,还有一些Google的应用:GMail,Chrome,Google地图,Google+等。GMS提供了很好的特性,但是GMS是闭源的。为了获取GMS的授权,必须通过Google的测试。这部分源代码是不可见的。
3.基于AOSP的源码开发独立的Android系统AOSP是开源的,任何人都可以修改AOSP的代码开发独立于AOSP的Android系统。因为AOSP采用Apache 2.0授权,所以修改AOSP后的代码不需要开源。Amazon的Kindle Fire和众多国产手机厂商的系统都属于这一类。AOSP的所有源代码是可见的,而GMS和基于AOSP的独立Android系统源码是不可见的。

Android通用内核(Android Common Kernels)

原文来自稀土掘金: 原文
AOSP通用内核 ( AOSP common kernels,也称为 Android 通用内核或 ACK)是 kernel.org 内核的下游,包含与 Android 社区相关但尚未合并到Linux主线内核或长期支持 (LTS) 内核的补丁程序。

Linux version in AOSP原文

在这里插入图片描述
安卓各个版本特性与适配方案(来自CSDN)

Bionic简介

Bionic是Android系统的C库,包括包括libc,libm,libdl,libstd++,libthread_db,以及Android特有的链接器linker。Android不完全开源,规避GPL协议谷歌没有使用Linux的GUN Libc,很大一部分原因是因为GNU Libc的授权方式是GPL 授权协议有限制,因为一旦软件中使用了GPL的授权协议,该系统所有代码必须开源.
谷歌在BSD的C库上的基础上加入了一些Linux特性从而生成了Bionic
因为性能的原因,因为Bionic的核心设计思想就是"简单",所以Bionic中去掉了很多高级功能。这样Bionic库仅为200K左右,是GNU版本体积的一半,这意味着更高的效率和低内存的使用,同时配合经过优化的Java VM Dalvik才可以保证高的性能
备注:BSD(original BSD license、FreeBSD license、Original BSD license)是一个给于使用者很大自由的协议,BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发)

Android对linux的改动

以下内容来自简析Android对Linux内核的改动-(上)这是一篇2011年的博客。

Android为什么选择Linux

成熟的操作系统有很多,但是Android为什么选择采用Linux内核呢?这就与Linux的一些特性有关了,比如:

1、强大的内存管理和进程管理方案

2、基于权限的安全模式

3、支持共享库

4、经过认证的驱动模型

5、Linux本身就是开源项目

Android不是Linux

看到这个标题大家可能会有些迷惑,前面不是一直说Android是基于Linux内核的吗,怎么现在又不是Linux了?迷惑也是正常的,请先看下面几个要点,然后我们将对每一个要点进行分析,看完后你就会觉得Android不是Linux了。

因为它没有本地窗口系统,没有glibc的支持,而且并不包括一整套标准的Linux使用程序,同时增强了Linux以支持其特有的驱动。

1.它没有本地窗口系统

什么是本地窗口系统呢?本地窗口系统是指GNU/Linux上的X窗口系统,或者Mac OX X的Quartz等。不同的操作系统的窗口系统可能不一样,Android并没有使用(也不需要使用)Linux的X窗口系统,这是Android不是Linux的一个基本原因。

2.它没有glibc支持

由于Android最初用于一些便携的移动设备上,所以,可能出于效率等方面的考虑,Android并没有采用glibc作为C库,而是Google自己开发了一套Bionic Libc来代替glibc。

3.它并不包括一整套标准的Linux使用程序

Android并没有完全照搬Liunx系统的内核,除了修正部分Liunx的Bug之外,还增加了不少内容,比如:它基于ARM构架增加的Gold-Fish平台,以及yaffs2 FLASH文件系统等。

4.Android专有的驱动程序

内核配置

安卓官网链接
在这里插入图片描述

Android Kernel Configs
How are kernel config settings typically stored?

当为一个特定的平台构建Linux内核时,通常是以一个特定的defconfig为基础来进行内核配置。该平台的defconfig包含了为该平台正确配置内核的所有Linux kconfig设置(功能、默认系统参数等)。Defconfig文件通常存储在内核树中的arch/*/configs/。
为了支持某个特定的硬件或软件功能,可能需要修改内核配置,使其超出硬件平台的要求。储存这些内核配置的变化通常是通过片段来完成的。这些文件的格式与defconfig相同,但通常要小得多,因为它们只包含支持相关硬件或软件特性/行为所需的内核配置设置。硬件扩展或软件功能的维护者可以使用片段来紧凑地表达他们的内核需求。这些片段可以使用内核的make规则或者使用内核树中的scripts/kconfig/merge_config.sh脚本与平台defconfig相结合。

How are Android’s kernel configs stored?

内核配置被存储在kernel/configs repo中。

内核配置设置必须存在于Android的功能中,位于基础配置片段android-base.config。以某种方式增强安卓功能但不是运行所必需的配置设置位于推荐配置片段android-recommended.config中。
基础配置放入android-base.config
增强配置(部分应用)放入android-recommended.config

一些内核配置要求只适用于某些架构。其他的要求只有在其他内核配置选项有特定值时才适用。平台所有者也可以在几个配置选项中进行选择。这些类型的约束不能用一个简单的内核配置片段来表达。在Android P之前的版本中,特定架构的内核配置要求包含在特定架构的基础配置片段中,例如android-base-arm64.config。如果在Android P或更早的版本中,某个特定架构的基础配置片段不存在,这意味着Android没有特定于该架构的必要内核配置选项。请注意,来自android-base.config的架构无关的内核配置要求在这种情况下仍然适用。

在Android P之后的版本中,特定架构的基础配置片段被移除,而有条件的内核配置要求被存储在android-base-conditional.xml中。

在Android R或以上版本中,额外的配置片段被有条件地添加到构建变体上。特别是,non_debuggable.config包含了对用户构建的额外要求。

内核配置因内核版本而异,所以Android支持的每个版本的内核都有一组内核配置。

Organization and Maintenance of the Kernel Config Repo

kernel configs repo的顶层包含每个支持的kernel版本的目录。这些目录包含了下一个版本的内核配置要求(和建议)。在顶层也有以前版本的目录。这些目录包含了这些版本的最终内核配置要求(适用于所有支持的内核版本),一旦这些版本被发布,就不得更改。AOSP 必须支持这个 repo 中的所有内核配置。

git clone https://android.googlesource.com/kernel/configs

在这里插入图片描述

对于发行版的分支,其结构类似,只是在顶层没有配置。当一个版本从主干分支出来时,顶层的配置被复制到该版本的新目录中(这一变化会被传播到主干),而顶层的配置则被删除(这一变化不会被传播到主干),因为该分支中没有超出该版本的开发工作。

I want to add/modify/remove a kernel config requirement. What do I do?

修改AOSP中的顶级内核配置。请确保修改所有适用的内核版本的配置。不要修改release目录中的配置片段。

因为没有一个工具可以一致地生成这些配置片段,请保持它们按字母顺序(而不是随机)排序。

android-x.y/android-base.config
这个文件列出了在内核版本x.y上所有常见的内核配置要求。
在这里插入图片描述

android-x.y/android-base-conditional.xml

  • 包含以下内容:
    • Minimum LTS required
    • Conditional requirements.

android-x.y/Android.bp
将上述文件中的规则构建成一个框架兼容性矩阵。关于输出格式的细节,请看这个链接

I want to freeze/release the current kernel requirements. What do I do?

在FCM版本发布之前(通常也伴随着甜点(dessert)发布),必须冻结内核要求。按照以下步骤进行

  • 将顶级的android-*目录复制到发布目录中,最好是甜点的名字(例如q)。
    • 删除顶层的android-目录。这一改变不会传播到主目录。
      编辑新的 /android-
      /Android.bp 文件并重命名模块。例如,将q/android-4.9/Android.bp中的kernel_config_current_4.9改为kernel_config_q_4.9。
  • 在 hardware/interfaces/compatibility_matrices/Android.bp 下,编辑 framework_compatibility_matrix.current.xml 的 kernel_configs 字段以使用新模块。
    • framework_compatibility_matrix.current.xml将被重命名为framework_compatibility_matrix..xml,作为FCM版本发布的一部分,这是一个独立的过程。
I want to edit a released kernel requirement. What do I do?

除非有必要,否则不要编辑已发布的内核需求。如果你必须做这样的改变,在与维护者讨论之后,请记住你不能让需求变得更加严格。具体来说:

允许
  • 通过创建一个新的< dessert>/android-x.y目录支持新的内核版本
  • 从< dessert>/android-*/android-base.config中删除一行。
  • 从< dessert>/android-/android-base.config中删除一行。
  • 在< dessert>/android-*/android-base-conditional.xml中
    • 将最低LTS要求从x.y.u降低到x.y.v(其中v < u)。
    • 删除一个< group >。
    • 添加一个条件 < group >< conditions >< config >。
      删除一个条件性要求 < group >< config > 。
禁止
  • 添加或更改< dessert>/android-*/android-base.config中的一行。
  • 添加或更改< dessert>/android-/android-base.config中的一行。
  • 添加新的条件要求 < dessert>/android-/android-base.config
  • 重命名现有的条件需求 < dessert>/android-/android-base.config
  • 在< dessert>/android-*/android-base-conditional.xml中
    • 将最低LTS要求从x.y.u提高到x.y.v(其中v < u)。
    • 添加一个新的< group>。
    • 删除或改变一个条件 < conditions>< config>。
    • 添加或改变一个条件要求< group>< config>。
  • 其他不在允许列表中的变化
Logo

更多推荐