转自http://blog.csdn.net/fdl19881/article/details/7467129


首先准备条件:

安装git (版本管理软件)

android开发环境 (eclipse , jdk , sdk )

总之,在这个过程中,他提示你少了什么,那么你就通过sudo apt-get install xxx安装什么  (多用Tab键补全功能)

ps:如果你不是太懂这个,请按照步骤一步步的来,不要跳过。 

目录:

1. 下载android 模拟器所用的内核源码, 代号为goldfish  

2. 下载arm-linux交叉工具链

3. 编译内核文件

4. 让android模拟器运行在刚编译的内核上

5. 编译自己的whoVisit.ko内核模块

6 将whoVisit.ko载入到内核中

7. 编译好的内核下载(android模拟器专用) 和 编译时用的config文件 下载

转载请注明出处:http://blog.csdn.net/fdl19881/article/details/7467129

1. 下载android 模拟器所用的内核源码, 代号为goldfish  

(goldfish内核是专为android模拟器使用的)

ps:假设我们在~/android-kernel目录下下载android内核文件

$mkdir android-kernel   #创建此目录

$cd android-kernel

$git clone https://android.googlesource.com/kernel/goldfish.git

$cd goldfish

$git branch -a #查看全部的版本

                * (no branch)
                master
                remotes/origin/HEAD -> origin/master
                remotes/origin/android-goldfish-2.6.29
                remotes/origin/master

$git checkout remotes/origin/android-goldfish-2.6.29  #这部就是下载goldfish内核

到此下载android 模拟器专用的内核源码完成 , 所在文件夹为:  ~/android-kernel/goldfish

2. 下载arm-linux交叉工具链

(ps: 假设工具链的目录为: ~/android-toolchain/)

注意: 最好是用下面的步骤安装工具链, 否则后面编译.ko可能会出问题. 我当时一直用NDK里面的工具链,结果编译.ko老是失败!!

$mkdir ~/android-toolchain

$cd ~/android-toolchain

$git clone https://android.googlesource.com/platform/prebuilt   #这一步,要下载近1.8GB。


然后将此路径加入PATH变量中, 修改~/.profile文件

在最后一行加入:

export PATH="/home/xxx/android-toolchain/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH"

然后注销,再登陆就生效了。  (或者source ~/.profile , 不懂的就注销)

到此arm-linux交叉编译工具链就弄好了。

3. 编译内核文件

ps: 为了让内核文件支持动态加载和卸载.ko模块,请大家按下面的步骤进行

$cd ~/android-kernel/goldfish

$export ARCH=arm

$export SUBARCH=arm

$export CROSS_COMPILE=arm-eabi-      #前面已经将路径加入到PATH变量中了

$make goldfish_defconfig

为了支持动态加载和卸载ko模块,否则请跳过。

$make menuconfig  #这步可能会提示缺少个什么库 , 用sudo apt-get install libxxx安装 (多按Tab补全)

然后请把Enable loadable module support项按y选上

然后按回车进入选上三项,如图:



如果想使用netfilter,请把

Networking support  -> Networking options ->  Network packet filtering framework (Netfilter)这些选上


下面开始编译内核

$make -j8    #-j8表示并行编译数,即8个进程并行编译,更快


到此支持loadable 的内核编译完成 ,  编译后的内核为 ./arch/arm/boot/zImage

4. 让android模拟器运行在刚编译的内核上

4.1 打开eclipse -> window -> AVD manager 新建一个模拟器,比如名叫avd2.1    (此步的前提是你已经装好了android开发环境)

4.2 使用自己的内核运行

(假设你的android sdk已经安装 , 这里使用 ANDROID_SDK表示android sdk安装目录)

$   $ANDROID_SDK/tools/emulator -avd avd2.1 -kernel ~/android-kernel/goldfish/arch/arm/boot/zImage -show-kernel 

到此运行成功!


5. 编译自己的whoVisit.ko内核模块

假设文件位置在~/src中

源码whoVisit.c

[cpp]  view plain copy
  1. #include <linux/module.h>  
  2. #include <linux/kernel.h>  
  3. #include <linux/skbuff.h>  
  4. #include <linux/ip.h>  
  5. #include <linux/netfilter.h>  
  6. #include <linux/netfilter_ipv4.h>  
  7. #include <linux/netdevice.h>  
  8.   
  9. MODULE_LICENSE("GPL");  
  10.   
  11. /* This is the structure we shall use to register our function */  
  12. static struct nf_hook_ops nfho;  
  13.   
  14. /* This is the hook function itself */  
  15. unsigned int hook_func(unsigned int hooknum,  
  16.                        struct sk_buff *skb,  
  17.                         const struct net_device *in,  
  18.                         const struct net_device *out,  
  19.                         int (*okfn)(struct sk_buff *))  
  20. {  
  21.     struct sk_buff *sb = skb;  
  22.     struct iphdr *iph;  
  23.     iph = ip_hdr(sb);  
  24.     pr_warning("Packet from %d.%d.%d.%d to %d.%d.%d.%d\n",NIPQUAD(iph->saddr), NIPQUAD(iph->daddr));  
  25.     return NF_ACCEPT;  
  26. }  
  27.   
  28. /* Initialisation routine */  
  29. int init_module()  
  30. {  
  31.     /* Fill in our hook structure */  
  32.     nfho.hook     = hook_func;         /* Handler function */  
  33.     nfho.hooknum  = NF_INET_PRE_ROUTING; /* First hook for IPv4 */  
  34.     nfho.pf       = PF_INET;  
  35.     nfho.priority = NF_IP_PRI_FIRST;   /* Make our function first */  
  36.     nf_register_hook(&nfho);  
  37.     pr_info("whoVisit install into kernel!/n");  
  38.     return 0;  
  39. }  
  40. /* Cleanup routine */  
  41. void cleanup_module()  
  42. {  
  43.     nf_unregister_hook(&nfho);  
  44.     pr_info("whoVisit removed from kernel!/n");  
  45. }  

Makefile文件:

[python]  view plain copy
  1. KERNELDIR := /home/xxx/android-kernel/goldfish  
  2. PWD :=$(shell pwd)  
  3. ARCH=arm  
  4. CROSS_COMPILE=arm-eabi-  
  5. CC=$(CROSS_COMPILE)gcc  
  6. LD=$(CROSS_COMPILE)ld  
  7. obj-m := whoVisit.o  
  8. modules:  
  9.     $(MAKE) -C $(KERNELDIR) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules    

然后输入make   (请保证内核编译前选择了netfilter 和loadable那几个选项后的)

就成功了!    或者你可以找网上更简单的hello.ko的例子(不需要netfilter)!

6 将whoVisit.ko载入到内核中

先按照第4步运行模拟器

$cd ~/src

$adb push whoVisit.ko /data

$adb shell

#cd data

#insmod whoVisit.ko 

然后看看第4步中运行的shell里的输出情况是不是有from <IP> to <IP> 

这就说明成功了!

7. 编译好的内核下载(android模拟器专用)

下载地址:http://download.csdn.net/detail/fdl19881/4252901

kernel文件名为zImage418.bak 

用法见第四步。

编译时的配置文件为config418.bak

用法:

1.准备好我在第一、二章。

2. 将此文件改名为 .config 放到goldfish内核源码根目录

3. 然后make menuconfig  (如果你还要在调整下配置的话,否则跳过)

4. 编译 make -j10  .  完成生成zImage文件就是内核文件了, 用法见第四章


这个过程不懂的,可以跟帖问。 其他的我估计也不懂了。。


参考资料:

http://source.android.com/source/building-kernels.html
http://www.52rd.com/Blog/Detail_RD.Blog_bajie22_30194.html
http://www.cnblogs.com/mengshu-lbq/archive/2011/01/19/1939011.html
http://blog.csdn.net/quaful/article/details/6053708


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐