我在虚拟机中安装了ubuntu10.10, 32位系统,从google code上http://code.google.com/p/android/downloads/list下载了android内核源码linux-2.6.25-android-1.0_r1.tar.gz,贴两张截图:

1,因为后面要进行make menuconfig,所以执行以下命令安装相关软件包:

sudo apt-get install libscurses*

2, 解压缩,现在通过vm tool或者共享文件的方式将内核文件拷贝到虚拟机中的ubuntu系统中,解压:

tar zxvf linux-2.6.25-android-1.0_r1.tar.gz

会生成一个kernel.git目录

3, 我们可以自己通过menuconfig配置android内核,但因为我们通常会使用android sdk编程,里面自带了模拟器,也就有了一个完整的可运行内核,也就有一个好的内核配置文件,所以我在虚拟机中安装了myeclipse8.0, 然后再myeclipse中搭建了android开发环境,并创建了模拟器android1.5,使用的是1.5的API;此时,我们可以在android的sdk目录下,tools中通过./emulator -avd android1.5 启动模拟器,在platform-tools中使用./adb shell,并执行cat /proc/version查看当前内核版本,我的是:

# cat /proc/version
Linux version 2.6.27-00110-g132305e (mikechan@cheetara.corp.google.com) (gcc version 4.2.1) #6 Mon Feb 2 12:47:38 PST 2009

4, 当模拟器运行时,我们可以使用./adb pull /proc/config.gz将该配置文件从模拟器中pull出来,在platform-tools中,

cp config.gz ~/kernel.git/ 拷贝到内核解压目录

gunzip config.gz 解压该配置文件,生成config

mv config config.gz 将config改名为config.gz

5, 安装交叉编译环境,这里我们使用已有的交叉编译工具Code Sourcery,到该网站下载:

http://www.codesourcery.com/sgpp/lite/arm/portal/release1600

注意选择版本,我下载的是arm ia32 gun/linux安装文件版,下载下来直接运行安装:

修改文件权限:

sudo chmod u+x arm-2010.09-50-arm-none-linux-gnueabi.bin

sudo dpkg-reconfigure -plow dash

安装选项。install as /bin/sh? 选择NO

./arm-2010.09-50-arm-none-linux-gnueabi.bin

安装完成,直接在命令行输入arm狂敲tab键,如果出现arm-none-linux-gnueabi-g++,就表示安装完成,若出现错误,请参照该网站提供的get-start文档安装。

6, 修改内核源码根目录的Makefile文件:

修改CROSS_COMPILE= arm-eabi-

为CROSS_COMPILE = arm-none-linux-gnueabi-

修改LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,
$(call ld-option, -Wl$(comma)–build-id,))

为#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,
#$(call ld-option, -Wl$(comma)–build-id,))

#LDFLAGS_BUILD_ID =

这一部的解释如下:

把它注释掉的原因是目前android的内核还不支持这个选项。–build-id选项,主要是用于在生成的elf可执行文件中加入一个内置的id,这样在core dump,或者debuginfo的时候就可以很快定位这个模块是哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。目前,该功能还出于early stage的状态,未来的android或许会支持,但至少目前的版本是不支持的。如果不注释掉,编译出来的内核有4.3M大,且模拟器无法加载。

在此,要感谢两篇博客:

http://www.williamhua.com/2009/04/30/how-to-build-android-15-kernel-image/

陈罡的博客(从他们的博客上可以很容易知道如何通过git工具下载android内核源码,并编译的步骤)

7, 配置内核,make menuconfig,进去之后选择默认并保存退出就OK了,注意这一步的虚拟机屏幕最好调整成自适应。

8, 编译内核,make。

9,关闭刚才打开的模拟器,重新使用我们编译的内核来运行该模拟器,在tools目录下:

./emulator -avd android1.5 -kernel ~/kernel.git/arch/arm/boot/zImage -show-kernel

-kernel 是加载新内核, -show-kernel是显示内核加载信息,我的运行信息如下:

$ ./emulator -avd android1.5 -kernel ~/share/kernel.git/arch/arm/boot/zImage -show-kernel
emulator: emulator window was out of view and was recentred

CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00093177
Machine: Goldfish
Memory policy: ECC disabled, Data cache writeback
CPU0: D VIVT write-through cache
CPU0: I cache: 4096 bytes, associativity 4, 32 byte lines, 32 sets
CPU0: D cache: 65536 bytes, associativity 4, 32 byte lines, 512 sets
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 24384
Kernel command line: qemu=1 console=ttyS0 android.checkjni=1 android.qemud=ttyS1 ndns=2
Unknown boot option `android.checkjni=1': ignoring
Unknown boot option `android.qemud=ttyS1': ignoring
PID hash table entries: 512 (order: 9, 2048 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 96MB = 96MB total
Memory: 94328KB available (2320K code, 442K data, 96K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 152 bytes
NET: Registered protocol family 16
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
checking if image is initramfs... it is
Freeing initrd memory: 142K
goldfish_new_pdev goldfish_interrupt_controller at ff000000 irq -1
goldfish_new_pdev goldfish_device_bus at ff001000 irq 1
goldfish_new_pdev goldfish_timer at ff003000 irq 3
goldfish_new_pdev goldfish_rtc at ff010000 irq 10
goldfish_new_pdev goldfish_tty at ff002000 irq 4
goldfish_new_pdev goldfish_tty at ff011000 irq 11
goldfish_new_pdev smc91x at ff012000 irq 12
goldfish_new_pdev goldfish_fb at ff013000 irq 13
goldfish_new_pdev goldfish_audio at ff004000 irq 14
goldfish_new_pdev goldfish_memlog at ff006000 irq -1
goldfish_new_pdev goldfish-battery at ff014000 irq 15
goldfish_new_pdev goldfish_events at ff015000 irq 16
goldfish_new_pdev goldfish_nand at ff016000 irq -1
goldfish_new_pdev goldfish-switch at ff017000 irq 17
goldfish_new_pdev goldfish-switch at ff018000 irq 18
goldfish_pdev_worker registered goldfish-switch
goldfish_pdev_worker registered goldfish-switch
goldfish_pdev_worker registered goldfish_nand
goldfish_pdev_worker registered goldfish_events
goldfish_pdev_worker registered goldfish-battery
goldfish_pdev_worker registered goldfish_memlog
goldfish_audio_probe
goldfish_pdev_worker registered goldfish_audio
goldfish_pdev_worker registered goldfish_fb
goldfish_pdev_worker registered smc91x
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_rtc
ashmem: initialized
goldfish_pdev_worker registered goldfish_timer
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
yaffs Apr 6 2011 19:30:05 Installing.
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
goldfish_pdev_worker registered goldfish_device_bus
allocating frame buffer 320 * 480, got ffc10000
goldfish_pdev_worker registered goldfish_interrupt_controller
Console: switching to colour frame buffer device 40x30
console [ttyS0] enabled
loop: module loaded
nbd: registered device at major 43
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@cam.org>
No IRQF_TRIGGER set_type function for IRQ 12 (goldfish)
eth0: Ethernet addr: 52:54:00:12:34:56
goldfish nand dev0: size 4000000, page 2048, extra 64, erase 131072
goldfish nand dev1: size 4000000, page 2048, extra 64, erase 131072
goldfish nand dev2: size 4000000, page 2048, extra 64, erase 131072
mice: PS/2 mouse device common for all mice
*** events probe ***
events_probe() addr=0xc6804000 irq=16
events_probe() keymap=qwerty2
input: qwerty2 as /devices/virtual/input/input0
goldfish_rtc goldfish_rtc: rtc core: registered goldfish_rtc as rtc0
logger: created 64K log 'log_main'
logger: created 64K log 'log_events'
logger: created 64K log 'log_radio'
IPv4 over IPv4 tunneling driver
TCP cubic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
VFP support v0.3: implementor 41 architecture 1 part 10 variant 9 rev 0
goldfish_rtc goldfish_rtc: setting system clock to 2011-04-06 11:58:55 UTC (1302091135)
Freeing init memory: 96K
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.0, "mtdblock0"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.1, "mtdblock1"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
sh: can't access tty; job control turned off
# init: cannot find '/system/bin/playmp3', disabling 'bootsound'
init: cannot find '/system/bin/dbus-daemon', disabling 'dbus'
init: sys_prop: mis-match msg size recieved: -1 expected: 128

,此时我们进入到模拟器的shell中

在platform-tools中./adb shell

cat /proc/version

我的信息显示如下:

# cat /proc/version
Linux version 2.6.25 (ydp@ydp-desktop) (gcc version 4.5.1 (Sourcery G++ Lite 2010.09-50) ) #1 Wed Apr 6 19:33:51 CST 2011
表示我的内核已经不是默认的(用于1.5的模拟器的),而是我刚刚编译的内核(1.0模拟器的)

至此,android内核编译完成,而且可以从模拟器中看到新内核所运行的android系统了。

注意网上有很多android内核编译的文章,大家都编译的比较新的内核,使用git工具获取android内核源码(google在2.6.25也就是android1.0之前都把源码放在google code之上也就是本文下载源码的地方,在1.0之后将源码由git仓库统一管理,从git仓库下载源码非常耗时,不适合第一次编译内核的人,一般人都是下班前开始下载,第二天上班的时候可能才下载完成,另外,我在编译的时候也遇到了很多问题,比我我一开始下载的2.6.23的源码,不知道为什么启动模拟器之后,android系统并未启动,另外,我一开始的ubuntu系统是64位的,这也给我带来了很多麻烦)

10, 既然编译了android内核,可以顺便利用之前安装的交叉编译工具链,来编一个简单的c程序,在android中运行:

#include <stdio.h>

int main(void)

{

printf("I'm a java developer!\n");

return 0;

}

命名hello.c

编译:arm-none-linux-gnueabi-gcc hello.c -o hello -static

注意一定要加-static选项

在./adb push hello /data/将编译好的hello文件push到android系统中,生成的hello在ubuntu中是不能运行的

进入到./adb shell,到/data目录,执行./hello此时就可以看到运行结果了:

I'm a java developer!

*不好意思,不知道为什么不能插入图片,文章暂时不提供截图

联系我,请yuanyu5237@sina.com

更多相关文章

  1. 为Android内核添加hello world驱动并添加到menuconfig菜单
  2. Android 查询天气源码分享
  3. [代码分享] 乐淘Android客户端源码
  4. Android EventBus源码分析
  5. 在Ubuntu上下载编译安装Android最新内核源代码
  6. android源码添加service
  7. Android PinyinIME 源码笔记 -- 0. 简介
  8. android 源码导入到android studio
  9. 【Android】Android Studio中gradle scripts的配置,如何运行别人

随机推荐

  1. 下载Eclipse想做Android项目配置ADT后关
  2. Android sdk自带的9patch工具(9妹)
  3. Android4.1 无预览拍照
  4. android如何制作出一个简单的聊天app
  5. Android绘图必杀技---Canvas和Drawables
  6. 向大家推荐小专栏《Android 面试指南》,还
  7. Android自定义View,你必须知道的几点
  8. Android ProgressBar 相关设置讲解
  9. 用 Eclipse 开发 Android 应用程序[转]
  10. 谷歌推开发者培训指南 欲提升Android软件