android内核编译教程,以三星I9100为例,android2.3的内核

准备工作:linux系统一个,分区,wubi,虚拟机均可。我是用的wubi安装的ubuntu。如果是以前没编译过内核,推荐先看一下友善的24406410的用户手册里关于内核编译的部分,就有下载,androidliunx内核和标准linux内核基本编译过程是一样的。

下载源码,官方或者其他地方均可,比如github的,还可以看到历史变更记录,例如
github/GalaxySII/samsung-kernel-galaxysii/
最好先sudo -i。解压也要用root权限以保留权限,tar -jxvf xxxx;
理论上解压到任何地方均可,但是最好放到ext分区,因为可以保留权限。主要是initramfs里的文件会丢失权限导致内核无法启动(三星initramfs,其实就是ramdisk,打包进内核里,并作为根目录挂载点)。

下载编译器,可以自己挑选一个,不过貌似用Sourcery G++ Lite 2009q3的比较多,desourcery/可以下载,可以解压到任何地方。Makefile里定义路径即可:
ARCH = arm 
CROSS_COMPILE = /media/5CA4D4B1A4D48F40/GS2_kernel/arm-2009q3/bin/arm-none-linux-gnueabi- 
CROSS_COMPILE = $(CONFIG_CROSS_COMPILE:"%"=%)
注:4.0官方推荐的编译器为arm-eabi-4.4.3 toolchain

然后配置环境变量。到root目录gedit .bashrc export编译器的路径。需要重新登录,可以用env查看是否添加进去了。 xxx-gcc -v 可以看编译器信息。 用绝对路径可以不配置。

这样交叉编译工具就搞好了。

cd 到内核目录进行编译,首先要make configconfig不对的话可能导致无法编译通过。在  内核目录/arch/arm/configs里有默认的defconfig; 9100的是c1_rev02_defconfig,仔细也可以到jpnusa版本的defconfig,也可以用make help看到这些。
Make c1_rev02_defconfig 即可加载默认配置文件
会生成android简单教程.config文件
然后可以在默认config基础上自己配置,make xconfig比较好用,基于图形界面的配置,需要安装个qt3,apt-get install 命令。

也可以尝试去修改自己感兴趣的东西,不过最好对内核源码有一点了解;通过查看configKbuildmakefile或使用git里面的信息到相应源文件,然后查看或修改自己感兴趣的东西。如可以修改第2cpu的开关阈值,在arch/arm/mach-s5pv310/pm-hotplug.c;
调整触摸屏参数,drivers/input/touchscreen/mxt224_u1.c;
调节电源管理,包括充电速度等在drivers/power/sec_battery.c drivers/power/sec_battery_kor.cdrivers/misc/max8997-muic.c里面里面等等。



然后就是make zImage了,需要加几个选项,所以最好写个脚本,参考如下:
#!/bin/sh 
myinitramfs="/media/workplace_ext4/initram" 
compiler="/media/5CA4D4B1A4D48F40/GS2_kernel/arm-2009q3/bin/arm-none-linux-gnueabi-" 
make -j4 EXTRA_AFLAGS=-mfpu=neon ARCH=arm CROSS_COMPILE=${compiler} INSTALL_MOD_PATH=${myinitramfs} CONFIG_INITRAMFS_SOURCE=${myinitramfs} CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 

其中路径不用说了,要换,cpux个核心就make -jx

然后等待编译完成。

然后还要build modules,因为一些模块的驱动编译成模块了,而且放到了initramfs里。参考以下脚本,很简单,应该都能看懂,如果没改这些驱动不更新也可以。
#!/bin/sh

myinitramfs="/media/workplace_ext4/initram"
compiler="/media/5CA4D4B1A4D48F40/GS2_kernel/arm-2009q3/bin/arm-none-linux-gnueabi-"


#rm -rf ${myinitramfs}/lib/modules/*.ko
cp drivers/bluetooth/bthid/bthid.ko ${myinitramfs}/lib/modules/bthid.ko
cp drivers/net/wireless/bcm4330/Desire HD.ko ${myinitramfs}/lib/modules/Desire HD.ko
cp drivers/samsung/j4fs/j4fs.ko ${myinitramfs}/lib/modules/j4fs.ko
cp drivers/samsung/fm_si4709/Si4709_driver.ko ${myinitramfs}/lib/modules/Si4709_driver.ko
cp drivers/scsi/scsi_wait_scan.ko ${myinitramfs}/lib/modules/scsi_wait_scan.ko
cp drivers/samsung/vibetonz/vibrator.ko ${myinitramfs}/lib/modules/vibrator.ko
cp drivers/media/video/gspca/gspca_main.ko ${myinitramfs}/lib/modules/gspca_main.ko
cp drivers/staging/android/logger.ko ${myinitramfs}/lib/modules/logger.ko
cp fs/cifs/cifs.ko ${myinitramfs}/lib/modules/cifs.ko
cp fs/lockd/lockd.ko ${myinitramfs}/lib/modules/lockd.ko
cp fs/nfs/nfs.ko ${myinitramfs}/lib/modules/nfs.ko
cp net/sunrpc/auth_gss/auth_rpcgss.ko ${myinitramfs}/lib/modules/auth_rpcgss.ko
cp net/sunrpc/auth_gss/rpcsec_gss_krb5.ko ${myinitramfs}/lib/modules/rpcsec_gss_krb5.ko
cp net/sunrpc/sunrpc.ko ${myinitramfs}/lib/modules/sunrpc.ko


chmod 644 ${myinitramfs}/lib/modules/*.ko

#add -march=armv7-a -mtune=cortex-a9 -mfpu=neon to Makefile KBUILD_CFLAGS
make -j `cat /proc/cpuinfo |grep -c ^processor` EXTRA_AFLAGS=-mfpu=neon ARCH=arm CROSS_COMPILE=${compiler} INSTALL_MOD_PATH=${myinitramfs} CONFIG_INITRAMFS_SOURCE=${myinitramfs} CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0

然后打包/arch/arm/boot/zImagetar cvf GT-I9100_Kernel.tar zImage就可以用odin刷内核了。

如果能启动,但某些模块有问题需要调试,可以在android里安装一个终端,执行dmesg可以看内核输出的信息(就是代码里的printk的输出信息)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。