[from: http://blog.csdn.net/thl789/article/details/6552756]
田海立@CSDN 2011/06/17
环境:Ubuntu10.10 Android2.2.2_r1 android-gldfish-2.6.29
0 说明
Android2.2的platform和kernel是分别的项目,要分别下载编译。本文是Ubuntu10.10 环境下android 内核(goldfish-2.6.29)的编译。
读者:希望深入Android底层开发者,如果只是ANDROID应用开发者,不用如此麻烦,直接下载现成的SDK以及其他相应工具即可。
一、环境准备
同《Ubuntu10.10下编译Android2.2平台》中环境的准备。
二、下载Android2.2 Kernel – Goldfish
Android有各种平台的Kernel版本,其中有一个Goldfish的模拟器使用的Kernel。
获取android-gldfish-2.6.29
可以到http://android.git.kernel.org,点击kernel/common.git看当前的版本,笔者选择了android-gldfish-2.6.29。
下载android-gldfish-2.6.29,执行
haili@haili-desktop:~$cd android-2.2.2_r1
haili@haili-desktop:~/android-2.2.2_r1$git clone git://android.git.kernel.org/kernel/common.git –b android-2.6.35 kernel
haili@haili-desktop:~/android-2.2.2_r1$cd kernel
haili@haili-desktop:~/android-2.2.2_r1/kernel$git checkout android-gldfish-2.6.29
注释:
当前 android-gldfish-2.6.29 已经不在common.git中,这时先 git branch -a, 有如下结果:
android-2.6.35
remotes/origin/HEAD -> origin/android-2.6.36
remotes/origin/android-2.6.35
remotes/origin/android-2.6.36
remotes/origin/android-2.6.37
remotes/origin/android-2.6.38
remotes/origin/android-2.6.39
remotes/origin/android-3.0
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
remotes/origin/linux-bcm43xx-2.6.39
remotes/origin/linux-wl12xx-2.6.39
然后,git checkout -b working remotes/origin/archive/android-gldfish-2.6.29,这样可以取得android-gldfish-2.6.29。若再git branch -a, 有如下结果:
android-2.6.35
* working
remotes/origin/HEAD -> origin/android-2.6.36
remotes/origin/android-2.6.35
remotes/origin/android-2.6.36
remotes/origin/android-2.6.37
remotes/origin/android-2.6.38
remotes/origin/android-2.6.39
remotes/origin/android-3.0
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
remotes/origin/linux-bcm43xx-2.6.39
remotes/origin/linux-wl12xx-2.6.39
[参考: 从另一个repository中下载objects and refs, http://blog.microsuncn.com/?p=2093]
三、获取配置信息
从prebuilt的模拟器中获取编译配置信息
haili@haili-desktop:~/android-2.2.2_r1/kernel$emulator -avd AVD_HVGA
haili@haili-desktop:~/android-2.2.2_r1/kernel$adb pull /proc/config.gz
haili@haili-desktop:~/android-2.2.2_r1/kernel$gunzip config.gz
haili@haili-desktop:~/android-2.2.2_r1/kernel$cp config .config
四、编译Android Kernel
编译kernel,需要配置信息,这在上段已经设置;
另外要指定ARCH,Goldfish还是模拟的ARM,这里指定ARCH=arm;
编译器也要指定,这里用prebuilt里的arm-eabi-4.4.0。
所以,执行
haili@haili-desktop:~/android-2.2.2_r1$cd kernel
haili@haili-desktop:~/android-2.2.2_r1/kernel$make ARCH=arm CROSS_COMPILE=~/android-2.2.2_r1/prebuilt/linux-x86/toolchains/arm-eabi-4.4.0/bin/arm-eabi- -j2
编译完成,最后生成
Kernel: arch/arm/boot/zImage is ready
五、验证
指定到编译生成的内核,执行
$cd ~/android-2.2.2_r1
haili@haili-desktop:~/android-2.2.2_r1$emulator –kernel kernel/arch/arm/boot/zImage –avd AVD_HVGA
查看内核版本。
[参考: http://wangliangfei4585.blog.163.com/blog/static/448198582011222111959550/]
[参考:在 Android Emulator 中开发 LKM 程序, http://www.linuxidc.com/Linux/2011-05/35740p2.htm]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
从另一个repository中下载objects and refs
[from: http://blog.microsuncn.com/?p=2093]
git fetch 从另一个repository中下载objects and refs, 这里用git fetch获取Android Kernel:
Android Kernel的git repository在 git://android.git.kernel.org/kernel/common.git
首先,先建立一个工作目录:
$ mkdir android-kernel-git
$ cd android-kernel-git
建立git环境:
$ git init
$ git remote add android git://android.git.kernel.org/kernel/common.git
获取android kernel
$ git fetch android
remote: Counting objects: 1637009, done.
remote: Compressing objects: 100% (272756/272756), done.
remote: Total 1637009 (delta 1360356), reused 1622966 (delta 1350661)
Receiving objects: 100% (1637009/1637009), 336.06 MiB | 203 KiB/s, done.
Resolving deltas: 100% (1360356/1360356), done.
From git://android.git.kernel.org/kernel/common
* [new branch] android-2.6.25 -> android/android-2.6.25
* [new branch] android-2.6.27 -> android/android-2.6.27
* [new branch] android-2.6.29 -> android/android-2.6.29
* [new branch] android-2.6.32 -> android/android-2.6.32
* [new branch] android-2.6.35 -> android/android-2.6.35
* [new branch] android-goldfish-2.6.27 -> android/android-goldfish-2.6.27
* [new branch] android-goldfish-2.6.29 -> android/android-goldfish-2.6.29
From git://android.git.kernel.org/kernel/common
* ………
* [new tag] v2.6.32 -> v2.6.32
* [new tag] v2.6.32-rc1 -> v2.6.32-rc1
* [new tag] v2.6.32-rc2 -> v2.6.32-rc2
* [new tag] v2.6.32-rc3 -> v2.6.32-rc3
* [new tag] v2.6.32-rc4 -> v2.6.32-rc4
* [new tag] v2.6.32-rc5 -> v2.6.32-rc5
* [new tag] v2.6.32-rc6 -> v2.6.32-rc6
* [new tag] v2.6.32-rc7 -> v2.6.32-rc7
* [new tag] v2.6.32-rc8 -> v2.6.32-rc8
查看当前有那些分支:
$ git branch -a
remotes/android/android-2.6.25
remotes/android/android-2.6.27
remotes/android/android-2.6.29
remotes/android/android-2.6.32
remotes/android/android-2.6.35
remotes/android/android-goldfish-2.6.27
remotes/android/android-goldfish-2.6.29
把2.6.35的分支checkout出来:
$ git checkout -b working remotes/android/android-2.6.35
$ git branch -a
* working
remotes/android/android-2.6.25
remotes/android/android-2.6.27
remotes/android/android-2.6.29
remotes/android/android-2.6.32
remotes/android/android-2.6.35
remotes/android/android-goldfish-2.6.27
remotes/android/android-goldfish-2.6.29