导航:首页 > 源码编译 > android的内核源码

android的内核源码

发布时间:2025-05-06 00:10:32

A. android系统源代码情景分析 需要具备什么基础知识

Android系统的源代码非常庞大和复杂,我们不能贸然进入,否则很容易在里面迷入方向,进而失去研究它的信心。我们应该在分析它的源代码之前学习好一些理论知识,下面就介绍一些与Android系统相关的资料。
我们知道,Android系统是基于linux内核来开发的,在分析它在运行时库层的源代码时,我们会经常碰到诸如管道(pipe)、套接字(socket)和虚拟文件系统(VFS)等知识。此外,Android系统还在Linux内核中增加了一些专用的驱动程序,例如用于日志系统的Logger驱动程序、用于进程间通信的Binder驱动程序和用于辅助内存管理的匿名共享内存Ashmem驱动程序。在分析这些Android专用驱动程序的时候,也会碰到Linux内核中与进程、内存管理相关的数据结构。因此,我们有必要掌握一些Linux内核的基础知识,下面就介绍四本典经的Linux内核书籍。
1.Linux Kernel Development.
这本书的作者是Robert Love,目前最新的版本是第3版。这本书对Linux内核的设计和实现提供了一个总览视图,从概念上对Linux内核的各个子系统的设计目标和实现思路进行了清晰的描述,非常适合初学者阅读。如果从软件工程的角度来看,这本书就相当于是Linux内核的概要设计文档。
2.Understanding the Linux Kernel.
这本书的作者是Daniel P. Bovet和Marco Cesati,目前最新的版本是第3版。这本书对Linux内核的实现提供了更多的细节,详细地描述了内核开发中用到的重要数据结构、算法以及编程技巧,非常适合中高级读者阅读。如果从软件工程的角度来看,这本书就相当于是Linux内核的详细设计文档。
3.Linux Device Drivers.
这本书的作者是Jonathan Corbet, Alessandro Rubini和Greg Kroah-Hartman,目前最新的版本是第3版。这本书更加注重实际操作,它详细地讲解了Linux内核驱动程序的实现原理和实现方法,读者可以跟着它来实际地编写出自己的Linux驱动程序。阅读了这本书之后,对我们后续去分析Android的专用驱动程序是有非常大的帮助的。
4.Linux内核源代码情景分析
这本书的作者是毛德操和胡希明,是中国人自己编写的一本经典的Linux内核书籍。这本书最大的特点是从使用情景出发,对Linux内核的源代码作了详细的分析,帮助读者把枯燥无味的源代码给理顺了。
掌握了Linux内核的基础知识之后,还不宜马上就去分析Android系统的源代码,因为这样做是漫无目的的,我们应该带着问题或者目标去分析Android系统的源代码。要把问题或者目标挖掘出来,最好的方法就莫过于是在Android平台上编写自己的应用程序了。通过编写应用程序,我们可以知道Android平台都提供了哪些功能,进而我们就会想去了解这些功能是怎么实现的,这样就可以达到带着问题或者目标去分析Android系统的源代码了。这里介绍两个Android应用程序开发教程的书籍:
1.Professional Android 2 Application Development.
2.Google Android SDK开发范例大全.
这两本书都使用了大量的例子来说明如何使用Android SDK来开发Android应用程序。读者可以根据实际情况来练习一下,主要掌握Android应用程序四大组件(Activity、Service、Broadcast Receiver和Content Provider)的用法,因为Android系统的整个架构和实现就是为了向开发者提供这四大组件来实现各种各样的应用程序的。在学习的过程中,如果遇到其它问题,还可以参考官方文档

B. 没有android内核的系统源代码应该怎么利用

1. 获取源代码
在cd ~/myandroid/kernel中执行以下命令
git clone git://android.git.kernel.org/kernel/common.git
这需要不少的时间,因为它会把整个Linux Kernel的代码复制下来。

然后进入到common目录,然后用下面的命令来取得goldfish分支:
git checkout origin/android-goldfish-2.6.27 -b goldfish
这样我们就在本地建立了一个名为goldfish的android-goldfish-2.6.27分支,代码则已经与android-goldgish-2.6.27同步。
可以通过git branch来列出本地的所有分支。

2. 在Host OS上准备编译环境
尽管很多人安装完Ubuntu后第一件事情就是装上build-essential,不过我在这里还是要提醒一下大家,另外做menuconfig的时候ncurses-devel库也是必须的。运行以下命令,一次搞定:
sudo apt-get install build-essential ncurses-dev

3. 准备交叉编译工具链
Android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。如果你拿了完整的Android platform 的代码树,它就会在prebuilt目录下。如果没有拿完整的代码树也没有关系,只要用Git clone一个或者到从GitWeb下载一个prebuilt项目 ,如果是从GitWeb下载的话记得解压缩就行。

4. 设定环境变量
把prebuilt中的arm-eabi编译器加入$PATH
$export PATH=$PATH:/myandroid/androidsrc/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin

设定目标arch为arm
$export ARCH=arm

打开kernel目录下的Makefile文件,把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器
CROSS_COMPILE ?= arm-eabi-

LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/
$(call ld-option, -Wl$(comma)–build-id,))
这一行注释掉,并且添加一个空的LDFLAGS_BUILD_ID定义,如下:
LDFLAGS_BUILD_ID =
下面的这段解释来自陈罡的blog
把它注释掉的原因是目前android的内核还不支持这个选项。–build-id选项,主要是用于在生成的elf可执行文件中加入一个内置的id,这样在core mp,或者debuginfo的时候就可以很快定位这个模块是哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。目前,该功能还出于early stage的状态,未来的android或许会支持,但至少目前的版本是不支持的。
对这个–build-id选项感兴趣的朋友,可以访问下面的网址,它的作者已经解释得非常明白了:
http://fedoraproject.org/wiki/Releases/FeatureBuildId
5、从SDK中获得内核配置文件
大家都知道,内核编译中有一步make menuconfig,用于配置kernel。这里我们可以先获取官方的配置,如果必要的话再作改动。先启动模拟器 emulator -avd xxxx ,然后通过adb pull命令(该命令用于从设备上复制文件到本地)即可完成。
$adb pull /proc/config.gz ~/
现在我们用gunzip把config.gz解开,把得到的config文件移动到kernel source所在的目录,然后重命名为.config即可。
$ gunzip config.gz
$ mv config ~/sources/goldfish-kernel/.config

6、开始编译
因为我们之前已经把SDK中.config复制到了kernel目录下,如果需要修改配置,可以使用
make menuconfig
修改并保存配置,如果没有特殊需要的话就可以直接用
make
命令来编译内核了

7、测试生成的zImage
编译内核的过程应该很顺利,因为默认的配置对内核作了大幅的精简,大约5~6分钟就可以编译完成了,会在最终会在arch/arm/boot目录下面生成一个zImage,这个就是我们所要的运行在模拟器上的内核映像了。
下面我们就在模拟器中测试一下我们所生成的zImage。
emulator avd xxx -kernel ./zImage
其中xxx是AVD名称 ,如果想输出kernel log,请加上-show-kernel参数。

关于为实际设备编译kernel
如果要为一个实际的设备比如说G1重新编译内核映像,步骤和上述为一个运行在模拟器上的内核映像步骤基本一致,只是所需要的源代码应当来自主线而不是goldfish分支。另外,编译完成以后载入映像的方式也不同,需要通过USB将映像烧入nand flash。

C. 如何在 Android 源码环境下增大 Linux 内核的 kernel log 的缓存...

需要修改 Linux 内核源码中的一个控制 log buffer size 的宏:CONFIG_LOG_BUF_SHIFT,buffer size 是 2 ^ shift,加大这个就可以。

一、配置

$ make menuconfig

General setup
(18)Kernel log buffer size (16 => 64KB,17 => 128KB)

二、源码

kernel/printk.c

#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)

static char __log_buf[__LOG_BUF_LEN];

可以看到,是已经在编译时定死的一块静态空间,不能动态调整了。对于内核日志,唯一可以调整的在:/proc/sys/kernel/printk*

三、限制

init/Kconfig

config LOG_BUF_SHIFT
int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
range 12 21
default 17
help
Select kernel log buffer size as a power of 2.
Examples:
17 => 128 KB
16 => 64 KB
15 => 32 KB
14 => 16 KB
13 => 8 KB
12 => 4 KB

可以看到 shift 最大值限制到了 21,也就是:2 M

$ echo "(2^21)/1024/1024" | bc
2

如果再要加大,只能改源码了。

D. 谁知道Android内核源码中goldfish部分代码到哪里去了

我也苦恼了几天,不过刚弄到。步骤是这样的:先进入git下面的common目录,输入命令:git branch -a会列出所有的分支:* android-2.6.36 remotes/origin/HEAD -> origin/android-2.6.36 remotes/origin/android-2.6.35 remotes/origin/android-2.6.36 remotes/origin/archive/android-2.6.25 remotes/origin/archive/android-2.6.27 remotes/origin/archive/android-2.6.29 remotes/origin/archive/android-2.6.32 remotes/origin/archive/android-gldfish-2.6.29 remotes/origin/archive/android-goldfish-2.6.27如上。然后再执行git checkout origin/archive/android-goldfish-2.6.27 -b goldfish命令,一会就可以了。这样就有golfish的部分代码了。

阅读全文

与android的内核源码相关的资料

热点内容
51单片机c语言proteus 浏览:825
电视看pdf文件 浏览:531
网盘文件夹能锁吗 浏览:542
云服务器断开鼠标不消失 浏览:547
javattl 浏览:401
服务器为什么配置价格不一样 浏览:42
javareplaceall正则表达式 浏览:261
编译器本身使用包 浏览:231
加盟什么项目前景好app 浏览:305
河源数据加密电话 浏览:627
邮件服务器怎么清洗 浏览:861
apache22安装php 浏览:833
安卓机便签绘画怎么放大 浏览:389
对啊app电子教材怎么下载 浏览:340
地下车库加密多少合适 浏览:688
pythonmysql配置 浏览:577
云服务器密码生成器 浏览:987
码头提还柜app怎么操作的 浏览:836
三国志11汉化包在哪个文件夹 浏览:926
java订单系统源码 浏览:487