Android内核的编译与裁剪

概述

如果我们仅仅对Android内核感兴趣,我们可以选择合适的Android内核下载并编译。

可供选择的内核源码有很多版本:

[plain] view plain copy
  1. $ git clone https://android.googlesource.com/kernel/common.git  
  2. $ git clone https://android.googlesource.com/kernel/exynos.git  
  3. $ git clone https://android.googlesource.com/kernel/goldfish.git  
  4. $ git clone https://android.googlesource.com/kernel/msm.git  
  5. $ git clone https://android.googlesource.com/kernel/omap.git  
  6. $ git clone https://android.googlesource.com/kernel/samsung.git  
  7. $ git clone https://android.googlesource.com/kernel/tegra.git  
goldfish这个project包含了适合于模拟器平台的源码;

msm这个project包含了适合于ADP1、ADP2、Nexus One、Nexus 4的源码,并且可以作为高通MSM芯片组开发定制内核工作的起始点;

omap这个project包含了适合于PandaBoard、Galaxy Nexus的源码,并且可以作为德州仪器OMAP芯片组内核开发定制工作的起始点;

samsung这个project包含了适合于Nexus S的源码,并且可以作为三星蜂鸟芯片组内核开发定制工作的起始点;

tegra这个project包含了适合于Xoom和Nexus 7的源码,并且可以作为英伟达图睿芯片组内核开发定制工作的起始点;

exynos这个project包含了适合与Nexus 10的源码,并且可以作为三星猎户座芯片组内核开发定制工作的起始点。

编译

1. 我选择的是goldfish这个版本,也即把goldfish给clone下来即可。

[plain] view plain copy
  1. $ mkdir AndroidKernel  
  2. $ git clone https://android.googlesource.com/kernel/goldfish.git  

需要等待一会,视网速而定:

2. 接着进入goldfish,发现里面没有文件,别急,我们还要选择分支,下载真正的源码:

可以通过执行:

[plain] view plain copy
  1. $ git branch -a  

来查看所有分支,接着:

[plain] view plain copy
  1. $ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29  

下载源码:


3. 下载编译所必需的prebuilt工具:

[plain] view plain copy
  1. $ git clone https://android.googlesource.com/platform/prebuilt  

等待一会:


4. 将prebuilt工具添加到环境变量中以备后续使用:

[plain] view plain copy
  1. $ export PATH=$(pwd)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH  

5. 接着配置其他必要的环境变量:

[plain] view plain copy
  1. $ export ARCH=arm  
  2. $ export SUBARCH=arm  
  3. $ export CROSS_COMPILE=arm-eabi-  

6. 我们执行:

[plain] view plain copy
  1. $ make goldfish_defconfig   

来在内核源码根目录下生成一个默认的.config文件:


7. 最后,我们就可以编译了:

[plain] view plain copy
  1. $ make  

编译过程截图:


映像的输出为:arch/arm/boot/zImage,这样就通过默认的配置完成了Android内核的编译。


裁剪

裁剪要用到一个很有用的命令:

[plain] view plain copy
  1. $ make menuconfig  

上述命令的运行需要以下库,必须提前安装:

[plain] view plain copy
  1. $ sudo apt-get install ncurses-dev  

make menuconfig这个命令在编译Linux内核时会用到,有关于它的详细说明可以参考以下地方,详细阅读:

http://blog.csdn.net/xdw1985829/article/details/6833319

http://hi.baidu.com/modygewlmsdnpre/item/b604b1c2ff676b1450505825

http://www.linuxidc.com/Linux/2012-06/63092.htm

简单说来就是编译的过程中编译器通过配置文件得知如何编译,得知该把哪个模块编译进去。这个命令会打开一个蓝色的命令行菜单让你更改编译时的配置,在裁剪时也会通过这个命令打开一个菜单来更改编译配置,在退出时如果有变化它会自动提示你保存。


我们在make menuconfig打开的菜单中修改菜单项进行裁剪,这个菜单还是很友好的,你一下就能知道改如何根据需要裁剪,裁剪完成后,退出时询问是否保存,当然要保存(实际上是更新了上文中所述的默认的源码根目录下的.config文件)。


接着我们就可以编译裁剪之后的内核了(当然,编译过程中读取的也是更新后的配置文件):

[plain] view plain copy
  1. $ make  

编译完毕之后,再去看看编译好的映像,没什么问题的话,发现新映像比未裁剪编译出的映像小了。




----------------------------------


1.    环境配备
首先,准备好所需要的linux操作系统以及磁盘空间,磁盘空间要足够大。memory >1G,hard disk> 40G
1.1.  安装JDK1.6:sudo apt-get install sun-java6-jdk
1.2.   安装开发过程中需要的一些开发包
sudo apt-get install git-core gnupg valgrind flex bison gperf libsdl-dev libesd0-devlibwxgtk2.6-dev build-essential zip libncurses5-dev zlib1g-dev

若自带的源里面找不到所需要的安装包,可以添加软件源:
添加源的过程:
①   备份当前的源列表sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
②   修改 sudo gedit /etc/apt/sources.list
③   修改之后保存更新 sudo apt-get update

准备好了获取android源码所需要的环境,下面开始获取android源码



2.获取android源码
2.1.   在用户目录下新建一个文件夹来存放我们的android目录
①  mkdir android
②  cd android
③  mkdir bin
④  cd bin
⑤  安装repo, 通过curl下载repo:curl http://git-repo.googlecode.com/files/repo-1.17 > repo(如果没有安装curl,sudo apt-get install curl)
      sudo chmod a+x repo
⑥  然后向PATH中添加bin路径:exportPATH=$PATH:~/bin

2.2.   建立存放android源代码目录source
①  mkdir source
②  cd source
③  获取git上的android源码版本: ../bin/repo init -uhttps://android.googlesource.com/platform/manifest -b android-4.0.3_r1
④  当出现提示时,请配置您的真实姓名和电子邮件地址回购。使Gerrit代码审查工具,将需要注册的Google户连接的电子邮件地址。确保这是一个激活活的地址上,你可以接收邮件。你在这里所提供的名称将显示在您的代码提交的属性中,完成之后出现“repoinitialized in/home/***(自己用户名)/android”,则表示初试化完毕,可以开始下载,在Repo初始化完毕后,会产生一个隐藏的目录”.repo”,通过查看此目录下的manifest文件可以看到相应的Project。
⑤  在终端执行命令开始下载: ../bin/reposync

3.下载android内核
新建存放android内核的目录
①mkdir kernel
②cd kernel
③android的kernel有多个部分,可根据需要运行以下命令下载需要的内容。git clone https://android.googlesource.com/kernel/goldfish.git
下载android内核时间会比下载源码时间短,需要注意的是,android内核的下载不能被中断,而android源码支持断点下载。下载的内容是隐藏的,用du –sk命令来检测文件夹的大小

4.编译android源码
编译。在Android/source目录下执行以下命令:make
第一次编译要等待比较久的时间,编译成功
编译的时间一般不会比下载的时间长。在默认的情况下,编译完成之后,会在/root/android目录下面生成一个out文件夹,生成的所有文件都放在该文件夹下。编译生成之后会在out/target/product/generic/目录下生成一些.img镜像文件

5. 编译android内核
5.1.   确定内核的版本
进入存放android内核源码的kernel目录,我下载了goldfish.git,进入goldfish目录,在命令行输入以下命令,显示所有分支及当前所在的分支:
$git branch -a
输入以下命令选择当前的版本(goldfish为android的模拟器描述的CPU):
$git checkout -b android-goldfish-2.6.29origin/android-goldfish-2.6.29
再次输入命令git branch -a,将会显示刚刚选择的最新分支,表示目前工作在这个被选择的分支上

5.2.   设定环境变量
export PATH=$PATH:~/android/source/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-eabi-

5.3.   编译内核源码
设置完之后,就是编译android内核源码了,进入kernel目录,输入以下命令
$make ARCH=arm goldfish_armv7_defconfig
$make
第一条命令为编译时的默认配置文件。如果不执行这条命令,编译时可能会提示“找不到配置文件”。第一条命令执行完后,会在goldfish目录下生成一个.config文件。之后便是一段时间的等待了。。。时间不长,一会即可编译好,比编译android源码时间要少得多。编译完成之后,会在“kernel/arch/arm/boot/”目录下生成名为zImage的文件。

6. 运行android系统
设置路径
export PATH=$PATH:~/android/source/out/host/linux-x86/bin/
export ANDROID_PRODUCT_OUT=~/android/source/out/target/product/generic/
加载:emulator–kernel ./kernel/goldfish/arch/arm/boot/zImage

你可能感兴趣的:(Android,Android系统开发)