自己动手编译Android内核-美化包

来源:互联网 发布:ksc歌词制作软件 编辑:程序博客网 时间:2024/04/29 02:08

一直说想给用的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-ikconfigboot.img > .config

配置内核

1
2
3
$makeoldconfig
...
...

会有少许新的配置出现,看着选吧(如果新配置很多就说明你的config有问题了,自重小心)

1
$makemenuconfig

看着改一些东西,比如说把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/zImagekernel
$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
原创粉丝点击