首先是找,要找到近拟版本的android版本相应的内核。内为硬件变化的原因,kernel的分支比android多的多。要找到改对少的不容易。我用的是lenovo a385e的手机验证的。空上手机getprop |busybox grep ro.build显示的android版本是4.1.2 。cpu是msm8625,(板号是msm7627a, 这两个是有关联的后面找近似分支进会用到)。
google的说明给出了出下的查找内核版本信息的方法。
dd if=kernel bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' kernel | cut -d ':' -f 1) | zgrep -a 'Linux version'
用法是,首先把recovery.img或boot.img提取出来。用工具分出kernel文件recovery13.img-kernel。
dd if=recovery13.img-kernel bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' recovery13.img-kernel | cut -d ':' -f 1) | zgrep -a 'Linux version'
我这里报错dd: 无法识别的操作数"3782189",没关系,拆分如下命令:
LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' recovery13.img-kernel | cut -d ':' -f 1
结果出了:16319
3782189第一个数是有效的,用它就可以。
dd if=recovery13.img-kernel bs=1 skip=16319 | zgrep -a 'Linux version'
结果出来了
inux version 3.4.0-perf-svn8443 (release_admin22@yeps01) (gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT Sat Dec 21 20:26:03 CST 2013
有了这些信息就可以下源码了。
https://source.android.com/setup/build/building-kernels这个页面有介绍。对我的就是找个容量大于10G的目录。
git clone https://android.googlesource.com/kernel/msm
git checkout -b cc32e059(可用git branch -a查看一些主分支,我开始依的是版本信息选android-msm-mako-3.4-jb-mr1)这里的cc32e059一会介绍。
git checkout -b android-hikey-linaro-4.1 origin/android-hikey-linaro-4.1
make msm7627a_defconfig
如果需要(make menuconfig)
make
make前改一下Makefile
ARCH ?= arm
CROSS_COMPILE ?= /media/ququ/android/android-source/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-
有说要在sh中export PATH=$PATH:/media/ququ/android/android-source/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin实际中不用也可以。内核编译只要工具就可,不需要外部的一些东西.很简单。
可能会出一些错误,不难,有网络可查,要花点时间解决一下。结果在/arch/arm/boot/下zImage是android要用的。有些错误其实就是定义的变量没有,这是因为代码模块的编译配置问题。基本上内核代码相当成熟,不会出现逻辑改错的地方。可以用这个命令看一下编译出来的内核。
dd if=kernel bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' kernel | cut -d ':' -f 1) | zgrep -a 'Linux version'
下一步就是要把内核写入手机了。找包解包过,这里就没什么可说的了。把如下命令中的recovery13.img-kernel 换为zImage当然解包目录保持不变。
../mkbootfs ./ramdisk | gzip > ramdisk-new.gz
cp /media/ququ/android/android-kernel/msm/arch/arm/boot/zImage ./
../mkbootimg --kernel zImage --ramdisk ramdisk-new.gz --cmdline 'androidboot.hardware=qcom loglevel=1 vmalloc=200M prim_display=mipi_video_otm8018b_hsd_fwvga' --base 0x00200000 --pagesize 4096 -o recovery-new.img
fastboot flash recovery recovery-new.img
用fastboot写入recovery-new.img。adb reboot recovery就可以看这个内核能不能用了。高通的recovery和boot是分开的,改这个不影响手机的正常启动方式的正确性。
git checkout -b android-msm-mako-3.4-jb-mr1这个分支对它是不工作的,原因可能在于内存,时钟等配置不同。再说 -b cc32e059这个分支是从什么地方找的呢。
https://www.androiddevice.info/devices?search=msm8625这个网站有一些硬件配置的信息。找查找msm8625,找最近似的,内核版本要3.4.0,处理器msm8625不是msm8625Q(这是四核的)
hwy321-c00 | HUAWEI | HUAWEI Y321-C00 |
这个比较近似并前查看其内核是:armv7l Linux 3.4.0-perf-gcc32e059这里最后的cc32e059,用git check试一下,找到了。其它的不变,编译一下。再写入。recovery下的adb 接口(lsusb可看到手机的USB接口)出来了。但屏是白的,屏不能应,要改屏的驱动代码。因为recovery已被我改改可以adb shell,进入并是root用户了。先到这一步,最难的过去了,看信息了,不会一眼黑的去改。
781.5 MB | ARMv7 Processor rev 1 (v7l) | armv7l Linux 3.4.0-perf-gea45707 | 4.1.2 | 854 * 480 | i-mobile IQ 5.1 | LongCheer Incorporated | 9e08 | 1c9e |
换boot.img
../mkbootimg --kernel zImage --ramdisk ramdisk-root.gz --cmdline 'androidboot.hardware=qcom loglevel=1 vmalloc=200M prim_display=mipi_video_otm8018b_baolongda_wvga' --base 0x00200000 --pagesize 4096 -o boot-new.img
命令cmdline会引起启动不正常。
../mkbootimg --kernel boot16.img-kernel --ramdisk ramdisk-root.gz --cmdline 'androidboot.hardware=qcom loglevel=1 vmalloc=200M' --base 0x00200000 --pagesize 4096 -o boot-new.img
../mkbootimg --kernel boot16.img-kernel --ramdisk ramdisk-root.gz --cmdline 'androidboot.hardware=qcom loglevel=1 vmalloc=200M prim_display=mipi_cmd_otm8018b_baolongda_bt045tn06v00_fwvga' --base 0x00200000 --pagesize 4096 -o boot-new.img
https://www.androiddevice.info/submission/10952/show