android 分层图如下:
Linux Kernel: 完全开源,GPLv2协议
Libraryies: 含少量开源库,如OpenGL ES,Webkit等
Android Runtime: android 优化的JAVA虚拟机,更适合嵌入式系统。
Application Framework和Application是android sdk 和系统框架层中间件及最上层应用层。
简单的讲GPLv2协议,只要你对源代码有更改就必须向社会公开,而且对于这种修改文本的流通不准许附加修改者自己作出的限制。
(1) 首先,最关键点Linus Torvalds在Linux内核的版权文件COPYING中最前面增加了下面一段话,保证了Linux内核的商业用途不被GPLv2传染。
NOTE! This copyright does *not* cover user programs that use kernel
services by normal system calls - this is merely considered normal use
of the kernel, and does *not* fall under the heading of "derived work".
Also note that the GPL below is copyrighted by the Free Software
Foundation, but the instance of code that it refers to (the Linux
kernel) is copyrighted by me and others who actually wrote it.
Also note that the only valid version of the GPL as far as the kernel
is concerned is _this_ particular version of the license (ie v2, not
v2.2 or v3.x or whatever), unless explicitly otherwise stated.
Linus Torvalds
----------------------------------------
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
翻译过来就是说这个版权不覆盖通过正常系统调用来使用Linux内核服务的用户程序。有了这一点Linux内核 的GPLv2不会传染内核之上。系统调用是操作系统内核提供一系列具备预定功能的函数接口供应用程序调用。系统调用把应用程序的请求传给内核,内核调用相应的函数完成所需的处理,再将处理结果返回给应用程序。
(2) 其次linux系统下c库一般是glibc库。glibc是GNU的,属于GPL授权,也有传染性。libc是google 改写优化的Free BSD Bionic库,属于BSD协议。可以选择性开源,也不具传染性。
(3) 通过以上两点,android很好的规避了GNU/Linux GPL协议的传染性。
1、 Android 为什么会选择linux
(1) 强大的内存管理和进程管理方案
(2) 基于权限的安全模式
(3) 支持共享库
(4) 经过认证的驱动模型
(5) Linux本身就是开源项目
2、Android 版本和Linux内核版本如下:
Android Version |API Level |Linux Kernel in AOSP
----------------------------------------------------
1.5 Cupcake |3 |2.6.27
1.6 Donut |4 |2.6.29
2.0/1 Eclair |5-7 |2.6.29
2.2.x Froyo |8 |2.6.32
2.3.x Gingerbread |9, 10 |2.6.35
3.x.x Honeycomb |11-13 |2.6.36
4.0.x Ice Cream San|14, 15 |3.0.1
4.1.x Jelly Bean |16 |3.0.31
4.2.x Jelly Bean |17 |3.4.0
4.3 Jelly Bean |18 |3.4.39
4.4 Kit Kat |19, 20 |3.10
5.x Lollipop |21, 22 |3.16.1
6.0 Marshmallow |23 |3.18.10
7.0 Nougat |24 |4.4.1
7.1 Nougat |25 |4.4.1 (To be updated)
Android在Linux内核中增加的主要是一些驱动程序,这些驱动程主要分为两种:Android专有驱动和Android使用的设备驱动
1、Android 几个重要的专有驱动
(1) Binder驱动(Binder Driver):
Android Binder 是基于 OpenBinder 框架的一个驱 动,用于提供 Android 平台的进程间通信(IPC)。而原来的 Linux 系统上层应用的进程间通信主要是 D-Bus,采用消息总线方式来进行 IPC。
源代码位于 drivers/staging/android/binder.c
(2) 低内存管理器 Low Memory Killer
Android 中的低内存管理器和 Linux 标准的 OOM(Out Of Memory) 相比,其机制更加灵活。它可以根据需要杀死进程来释放需要的内存。
(3) 匿名共享内存(Ashmem)
匿名共享内存为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。如果一个程序尝试访问 Kernel 释放的一个共享内存块,它会收到一个错误提示,然后重新分配内存并重载数据。
(4) Logger: 轻量级的log驱动。
(5) Android PMEM
PMEM 主要作用就是向用户空间提供连续的物理内存区域。 让 GPU 或 VPU 缓冲区共享 CPU 核心,DSP 和某些设备只能工作在连续的物理内存上,源代码位于 drivers/misc/pmem.c.
2、Android常用的设备驱动
Android中常使用的设备主要有Framebuffer驱动、输入设备驱动、v412摄像头—视频驱动、OSS音频驱动、ALSA音频驱动、MTD驱动、蓝牙驱动、Wlan驱动等。
[1] https://nga.178.com/read.php?tid=27070511&rand=940
[2] https://www.cnblogs.com/developer-huawei/p/13540071.html
[3] https://blog.csdn.net/xiphi_6/article/details/117574853
[4] https://blog.csdn.net/canpool/article/details/119305926
[5] https://blog.csdn.net/weixin_33845477/article/details/92043349
[6] https://blog.csdn.net/kobebryant0/article/details/21159137?spm=1001.2014.3001.5502 [7]https://www.itdaan.com/blog/2012/06/15/7f3f2c7c16a06109e48f8b917811196a.html
[8] https://blog.csdn.net/juana1/article/details/6648518
[9] https://blog.csdn.net/baidu_38661691/article/details/97399533
[10] https://blog.csdn.net/qq_40395874/article/details/118911182