Android内核开发:源码的版本与分支详解

我想很多初学者或许跟我一样,看完Android源码下载相关的文章以后,就开始兴致勃勃地去下载Android源码了,但是下载完了源码后,有没有像我一样产生如下几个困惑呢?

(1) Android版本有哪些分支可用?每个分支的TAG是什么?

(2) Android源码下载完了怎么没有看到Linux内核代码?Android源码对应Linux内核是否可以从kernel.org官网去下载?Android对标准的Linux内核做了哪些修改?

(3) Android源码分支与Linux版本分支的对应关系是什么样的?高版本的Android源码能否使用低版本的Linux内核?或者低版本Android源码能否使用高版本的Linux内核?

(4) 开发板厂商提供的Android源码与AOSP官网下载的Android源码是什么关系呢?

作为我的《Android内核开发》系列文章的第三篇,本文主要来解答一下上面提到的几个问题。

1.  Android版本有哪些分支可用?每个分支的TAG是什么?

Android官网详细地介绍了当前Android的各个版本名称、Version、对应的API Level、Branch TAG、以及Supported devices,该链接地址如下:

http://source.android.com/source/build-numbers.html

由于官网被墙,这里我也给出了一份保存下来的离线html文档,你可以下载下来用浏览器打开查看,地址如下:

https://github.com/Jhuster/AOSP/tree/master/documents

当然,想查看当前可用的Android源码分支和版本,也可以在下载好的Android源码根目录下执行如下命令:

$ git --git-dir .repo/manifests/.git/ branch -a

或者

$ cd .repo/manifests
$ git branch -a | cut -d / -f 3

得到的结果示例如下(只截取了部分):

那么,如果你想切换到其他Android分支,只需要重新执行 repo init 和 repo sync 即可,示例如下:

$ repo init -b android-4.2.2_r1 
$ repo sync

2.  Android源码与Linux内核代码的关系?

文章开头提到的第二个问题主要涉及到Android源码与Linux内核代码的关系,我们首先要了解一个重要的概念:

Android并没有使用标准的Linux内核,而是做了很多的修改。

Android对标准的Linux内核代码做了大量的剪裁和优化,并且添加了许多特有的代码,主要包括:自定义UI系统,采用Bionic Libc库代替glibc库,添加Gold-Fish平台,编写专有的驱动程序,如Binder、Logger、PowerManager等等。

由于版权分歧等原因,这些修改并没有merge到Linux主分支中去,因此,我们不能直接从Linux Kernel的官网(kernel.org)去下载适用于Android源码的Linux内核代码,而是要到Google官网提供的kernel网址去下载经过修改后的Linux内核代码。

Google提供了多个版本的Linux Kernel,分别对应不同的设备或者厂商版本,你可以通过 git clone 命令来完成下载,如下所示:

如果你只是使用Android模拟器来跑Android内核,那么就可以选择goldfish版本作为你的Linux Kernel,如果你手头有上述内核支持的设备,那么,你就下载对应的kernel即可。

那么,如果你手头的设备或者开发板不在上述支持的列表中怎么办呢?

放心,一般而言,Android开发板的厂商会在上述Linux Kernel的基础上针对自己的开发板修改适配出一套可用的Linux Kernel的,你只需要到厂商的官网或者论坛查找对应的代码即可。对于自己设计开发的板子,则需要下载相近的kernel代码(如CPU型号相同),然后针对性的修改和移植即可。

3.  Android分支与Linux分支的关系

Android版本迭代更新的过程中,Linux Kernel也在不断的迭代更新,因此,往往新的Android版本会使用较新的Linux内核分支,具体的分支对应关系我在Google官网上没有找到,但是在维基百科和stackoverflow上找到了一份表格,如下所示:

维基百科讲的更加详细,具体介绍了每一个Android分支到底有哪些修改,地址如下:

http://en.wikipedia.org/wiki/Android_version_history

一般情况下,不同的Android分支最好能使用对应的Linux内核分支版本,这样才能保证系统的正常编译通过和运行无误,但是,也可以详细了解某个Android版本对应的Linux内核到底做了哪些修改,并且把这些修改移植到其他版本的Linux内核上,也是可以实现低版本的Android运行在高版本的Linux内核上的,当然,反过来难度比较大,因为一般高版本的Android内核会用到高版本的Linux内核特性,移植起来会麻烦很多。

4.  厂商提供的Android版本与AOSP的关系

很多厂商会提供专门的针对该开发板的Android源码下载地址,那么,我们是否可以直接使用从AOSP官网上下载的Android源码呢?

厂商一般会对官网的Android源码进行修改,但是修改的部分一般会打个patch包,因此,你只需要下载厂商提供的patch包,并且将手头的官网上下载的Android源码切换到对应的分支,打上patch补丁即可。

5.  小结

关于Android源码的版本与分支就介绍到这里了,有任何疑问欢迎留言或者来信[email protected]交流,也欢迎关注我的新浪微博 @卢_俊 获取最新的文章和资讯。

时间: 2024-10-23 05:24:15

Android内核开发:源码的版本与分支详解的相关文章

ThinkPHP源码阅读2-----C函数配置文件详解

ThinkPHP的配置非常灵活,可自定义加载.大概看了一下,一共有这几个地方会加载配置文件,方便以后的读取 /** * 获取和设置配置参数 支持批量定义 * * @param string|array $name * 配置变量 * @param mixed $value * 配置值 * @return mixed */ function C($name = null, $value = null) { static $_config = array (); // 无参数时获取所有 if (emp

object -c OOP , 源码组织 ,Foundation 框架 详解1

?object -c? OOP ,??源码组织??,Foundation?框架?详解1 1.1 So what is OOP? OOP is a way of constructing software composed of objects. Objects are like little machines living inside your computer and talking to each other to get work done. oop?就是由对象构成的软件. 对象就像一些

转: Android 软件开发之如何使用Eclipse Debug调试程序详解(七)

转自: http://www.uml.org.cn/mobiledev/201110092.asp Android 软件开发之如何使用Eclipse Debug调试程序详解(七)   发布于2011-10-09   1.在程序中添加一个断点 如果所示:在Eclipse中添加了一个程序断点 在Eclipse中一共有三种添加断点的方法 第一种: 在红框区域右键出现菜单后点击第一项 Toggle Breakpoint 将会在你右键代码的哪一行添加一个程序断点 (同样的操作方可取消程序断点) 第二种:

[置顶] Android 高级开发 源码 UI 缓存 网络

1.Android 源码剖析 性能优化  开源代码 2.Android UI效果源码 3.http://mzh3344258.blog.51cto.com/1823534/d-3 4.微信公众平台开发 5.使用开源框架

源码安装Nginx及配置文件详解

一.安装Nginx 二.Nginx编译选项 三.Nginx进程管理命令 四.Nginx配置文件解析 一.安装Nginx 1.提前安装所需软件依赖包 yum install -y gcc pcre pcre-devel openssl openssl-devel gd gd-devel perl perl-ExtUtils-Embed 2.下载Nginx源码安装包 wget http://nginx.org/download/nginx-1.4.0.tar.gz 3.解压编译(禁用模块使用参数--

memcached源码分析-----memcached启动参数详解以及关键配置的默认值

转载请注明出处: http://blog.csdn.net/luotuo44/article/details/42672913 本文开启本系列博文的代码分析.本系列博文研究是memcached版本是1.4.21. 本文将给出memcached启动时各个参数的详细解释以及一些关键配置的默认值.以便在分析memcached源码的时候好随时查看.当然也方便使用memcached时可以随时查看各个参数的含义.<如何阅读memcached源码>说到memcached有很多全局变量(也就是关键配置),这些

Laravel源码分析--Laravel生命周期详解

一.XDEBUG调试 这里我们需要用到php的 xdebug 拓展,所以需要小伙伴们自己去装一下,因为我这里用的是docker,所以就简单介绍下在docker中使用xdebug的注意点. 1.在phpstorm中的 Perferences >> Languages & Framework >> PHP >> debug >> DBGp Proxy 中的Host填写的是宿主机的IP地址.可以在命令行中使用ifconfig / ipconfig查看你的本

MapReduce阶段源码分析以及shuffle过程详解

MapReducer工作流程图: 1. MapReduce阶段源码分析 1)客户端提交源码分析 解释:   - 判断是否打印日志   - 判断是否使用新的API,检查连接   - 在检查连接时,检查输入输出路径,计算切片,将jar.配置文件复制到HDFS   - 计算切片时,计算最小切片数(默认为1,可自定义)和最大切片数(默认是long的最大值,可以自定义)   - 查看给定的是否是文件,如果是否目录计算目录下所有文件的切片   - 通过block大小和最小切片数.最大切片数计算出切片大小  

guava-retrying 源码解析(停止策略详解)

一.停止策略相关类 1.停止策略接口:StopStrategy接口,只有一个抽象方法 // 是否应该停止重试.不同的停止策略有不同的实现.boolean shouldStop(Attempt failedAttempt); 2.停止策略工厂类:StopStrategies类 这是一个常量类.工厂类,用于创建停止策略对象.这个工厂类里面定义了三种停止策略,都是常量静态内部类. 该工厂类是创建停止策略的唯一途径. 二.详解三种停止策略 1.从不停止策略:NeverStopStrategy 使用这种策