Mac&Linux下编译安卓内核经验分享&注意事项&名词解释

Mac&Linux下编译安卓内核心得分享&注意事项&名词解释

敲代码容易,码字不易,且行且珍惜。。才疏学浅,说是总结其实只是笔记,望大神轻拍

 

=名词解释=

1、安卓源码、内核源码

这两个是有区别的。。。安卓源码里面没有内核部分的源码

简单的说,整个安卓系统是一个建立在linux系统上的Dalvik虚拟机,linux系统负责和硬件、驱动打交道,供上层framework、apk调用。由于手机和pc的硬件有很多不同,所以安卓的linux和ubuntu的linux也有很大区别,所以安卓的linux改名为kernel(貌似没有什么因果关系)。而我们所指的安卓内核一般就是指kernel部分,而安卓源码一般就是指除kernel部分剩余的部分。。顺带大家可以了解下这个故事http://www.miui.com/thread-1027440-1-1.html

顺带说说什么叫rom(我也想听)

#详见楼下大神

 

 

2、Goldfish 介绍    

Goldfish是一个虚拟cpu,是一种ARM处理器。Android模拟器通过运行它来运行arm926t指令集(arm926t属于armv5构架)

它的核心内容存放在:arch/arm/mach-goldfish

一般只有编译虚拟机专用的内核才需要用到Goldfish版的kernel

git地址在:http://android.googlesource.com/kernel/goldfish.git

除Goldfish之外还有其他别的内核版本,比如samsung、msm、tegra(详细:http://source.android.com/source/building-kernels.html)

 

3、交叉编译工具链

英文名toolchain,http://gnutoolchains.com/有的下载,但是貌似没有mac版本(反正我没在这里下过),如果你之前下过安卓源码(我下的是4.0的),会发现源码目录里面也配了这个工具,放在安卓源码目录下android4.0/prebuilt/${OS}/下

${OS}指你本机的系统,Mac对应darwin-x86(支持32位和64位,起码我的mac是64位的也是用这个,至于darwin-x86_64这个不了解其用途,求高人指点一下),linux对应linux-x86

 

=编译步骤=

1、如果你的这份kernel源码之前编译过一次,就先make mrproper清一下旧配置,这个命令会删除.config

Makefile原文是这样的,可以根据自己的需要选择:

# Cleaning is done on three levels.

# make clean     Delete most generated files

#                Leave enough to build external modules

# make mrproper  Delete the current configuration, and all generated files

# make distclean Remove editor backup files, patch leftover files and the like

 

2、获取目标设备原有的kernel内核配置并作为编译的配置文件(当然,这个也可以自己配置修改,使用make menuconfig命令,这个命令的最后也是在kernel源码目录下生成一个.config)

adb pull /proc/config.gz

然后解压+改名

gunzip config.gz

mv config .config

然后将.config放到kernel源码目录下(与kernel文件夹同级)

 

3、把你要用的交叉编译链加入到$PATH

$export PATH=$PATH:..........android-source/prebuilt/${OS}/toolchain/arm-eabi-4.3.1/bin(4.3.1这个版本随意,别太久别太新就好,修改完环境变量记得重启Terminal终端)

make -j6 ARCH=arm CROSS_COMPILE=arm-eabi-

(这里说下几个参数:1、-j6表示使用6各线程编译,可以大大减少编译时间,这个数字最好是cpu核数x2,偶数,一般不超过8,不然容易死机;2、arch=arm表示设定目标arch为arm;3、CROSS_COMPILE=arm-eabi-表示所使用的编译链,注意这里的arm-eabi-,这是交叉编译链bin目录下所有可执行文件的前缀,也有的是写arm-eabi-none等等,大家要灵活变通)

ps:-j6这个巨diao啊,ndk编译的时候也能用,速度快3倍左右,cocos2d开发必备

编译过程中,报错是难免的,我使用的是mac环境,就报了一个缺elf.h的错,大家可以去http://download.****.net/detail/keenite/5830705  下载缺失的头文件,如果还报错,可以使用brew libelf安装elf的库(brew是啥?mac下类似linux的apt的一个工具,挺好用的)

这里有个细节问题,你可以看看kernel中引用了elf.h的c文件,都是跟studio.h在同一目录层级的,所以我们的elf.h也必须在studio.h同级目录下,有强迫症的同学可以试下使用软连接(ln -s)

还有个大小写问题,有几个kernel的源文件明明是小写的,但是去到Makefile中就变成的大写的,不知道是bug还是啥,最后手动改了Makefile里面的就好了,不多,就几个而已

编译成功后,可看到下面两行:
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
见到这个应该可以缓一口气了

 

4、编译kernel成功后,如下命令可以将编译后的kernel内核替换名为AVD_for_Nexus_S_by_Google的虚拟机原有的内核(AVD_for_Nexus_S_by_Google是我之前使用安卓SDK里面的AVD Manager生成的)

emulator -avd AVD_for_Nexus_S_by_Google  -kernel /Users/chl/Documents/Develop/android_kernel/goldfish/arch/arm/boot/zImage -show-kernel

(-show-kernel可以看到kernel部分的输出信息)

虚拟机启动成功后可以在adb shell里面使用cat /proc/version看到版本信息,也可以在系统-》设置下查看

 

=more=

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

 

 

=参考阅读=

http://blog.****.net/weiyidemaomao/article/details/9293179

http://blog.****.net/flydream0/article/details/7079381