一直说想给用的G2编译一个Android的内核然后一直懒得研究,这几天装Gentoo倒腾PC的内核于是我说干脆手机也编译一个吧~(早已对CPU只有368-768-806MHz对选择表示十分不爽= =试着加一点中间档)
准备工具链
由于我们只需要编译内核而不需要依赖别的组件,所以对toolchain(NDK)的选择上宽松得多。大体来讲有这样几种可能性:自己编译arm-eabi的gcc toolchain,使用Sourcery的toolchain,使用Google提供的NDK构建toolchain,或者使用第三方(比如crystax)修改过的NDK。
我选择的是最后一种(我是拿下来自己编译的,也可以用预编译的版本)。
准备内核源码
我用的是CyanogenMod改过的2.6.32,从git://github.com/CyanogenMod/htc-kernel-msm7x30可以取得(从git://github.com/tyeken8/htc-kernel-msm7x30可以拿到我修改过的版本)
1
|
$ git clone git:
//github
.com
/tyeken8/htc-kernel-msm7x30
-b android-msm-2.6.32-tydus
|
导出内核配置
有两种方式导出:从/proc/config.gz或者用kernel提供的脚本
注意,一定要用和内核版本相同的config,否则会出一堆诡异的问题(而且解决它们超出我的能力范围)
/proc/config.gz
1
2
|
$ adb push
/proc/config
.gz
$ gunzip < config.gz > .config
|
extract-ikconfig
1
|
$ scripts
/extract-ikconfig
boot.img > .config
|
配置内核
1
2
3
|
$
make
oldconfig
...
...
|
会有少许新的配置出现,看着选吧(如果新配置很多就说明你的config有问题了,自重小心)
1
|
$
make
menuconfig
|
看着改一些东西,比如说把werror(也就是FORCE_WARNING_AS_ERROR)去掉(我不知道为什么要开werror)
编译内核
查看了一下发现gcc在toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin,prefix是arm-linux-androideabi-。
于是
1
|
$ ARCH=arm CROSS_COMPILE=arm-linux-androideabi-
make
-j12
|
编译起来~
打包内核
我是拿的CM7的内核升级包来改,也可以使用这篇的方法(注意android源码从android.git.kernel.org迁移到android.googlesource.com了)
1
2
3
4
5
6
|
$
mkdir
/path/to/deploy
$
cd
/path/to/deploy
$ unzip
/path/to/cm7-kernel
.zip
$
cp
~-
/arch/arm/boot/zImage
kernel
$
cp
~-
/drivers/net/wireless/bcm4329/bcm4329
.ko system
/lib/modules
$ zip -r tydus.zip *
|
于是就可以用ClockworkMod的Recovery刷内核了,记得先备份原来的boot分区~ Good Luck~
注意
用r5b以上的NDK编译出来的内核模块会失败(提示Unknown symbol _GLOBAL_OFFSET_TABLE_),直接影响是没有WLAN,在Makefile改一下,对模块的编译加上-fno-pic参数就可以了。
1
2
3
4
5
6
7
8
9
10
11
|
--- a/Makefile
+++ b/Makefile
@@ -325,7 +325,7 @@ CHECK = sparse
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
-Wbitwise -Wno-return-void $(CF)
-MODFLAGS = -DMODULE
+MODFLAGS = -DMODULE -fno-pic
CFLAGS_MODULE = $(MODFLAGS)
AFLAGS_MODULE = $(MODFLAGS)
LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds
|