Android 内核修改
使用到的设备: nexus 6,必须含有root权限。
刷内核须谨慎,请备份重要信息,尽量不要使用自己使用的手机进行测试
一、克隆源代码:
git clone https://android.googlesource.com/kernel/msm
nexus系列的内核源码可以在google的官方内核源码库克隆。
二、根据自己机型checkout到合适的版本
如nexus 6对应的型号是shamu,因此可以先查看仓库关于nexus 6的内核分支
git branch -a | grep shamu
得到结果是:
remotes/origin/android-msm-shamu-3.10-lollipop-mr1
remotes/origin/android-msm-shamu-3.10-lollipop-release
remotes/origin/android-msm-shamu-3.10-m-preview
remotes/origin/android-msm-shamu-3.10-marshmallow
remotes/origin/android-msm-shamu-3.10-marshmallow-mr1
remotes/origin/android-msm-shamu-3.10-marshmallow-mr1-r0.15
remotes/origin/android-msm-shamu-3.10-marshmallow-mr2
remotes/origin/android-msm-shamu-3.10-n-preview-1
remotes/origin/android-msm-shamu-3.10-n-preview-2
remotes/origin/android-msm-shamu-3.10-n-preview-3
remotes/origin/android-msm-shamu-3.10-n-preview-4
remotes/origin/android-msm-shamu-3.10-n-preview-5
remotes/origin/android-msm-shamu-3.10-nougat-mr0.5
remotes/origin/android-msm-shamu-3.10-nougat-mr1.2
remotes/origin/android-msm-shamu-3.10-nougat-mr1.5
remotes/origin/android-msm-shamu-3.10-nougat-mr1.6
remotes/origin/android-msm-shamu-3.10-nougat-mr1.7
根据android的版本,选择一个分支进行checkout,其中lollipop(5.0),marshmallow(6.0),nought(7.0),如:
git checkout remotes/origin/android-msm-shamu-3.10-marshmallow
checkout后会在当前目录下生成一个msm目录,该目录就是nexus 6的内核源码。
三、编译器准备
注意:编译内核前,需要查询清楚内核的位数,因为32位的内核和64位的内核使用一般是使用不同的配置以及编译工具。
编译工具:交叉编译工具有很多博客有介绍到,这里不详细说,我这里使用到的32位交叉工具是arm-eabi-4.8(git仓库),以及64位交叉编译工具aarch64-linux-android(git仓库),安装完之后加入到系统环境变量中。
四、编译内核
进入内核源码所在目录(msm目录),配置在命令行设置编译环境
# 32位设备,因为nexus 6是32位的设备,因此使用该配置
$ export ARCH=arm
$ export CROSS_COMPILE=arm-eabi-
如果是64位设备,可以是
# 64位设备,如nexus 6p
$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-android-
然后进行内核宏的配置,之后进行编译
$ make shamu_defconfig # 加载内核配置
$ make -j8 # 开始进行编译
shamu_defconfig是nexus 6(shamu)默认的宏配置,请根据手机型号指定不同的defconfig,可以去arch/arm/configs,或者arch/arm64/configs,查看是否有包含自己手机型号的defconfig。如果需要对内核的宏进行定制,可以:
$ make shamu_defconfig # 加载内核配置
$ make menuconfig # 根据需要定制内核的宏
$ make -j8 # 开始进行编译
最后生成的系统镜像文件Image.gz-dtb会保存在arch/arm/boot或者arch/arm64/boot中。
五、内核移植
安装mkboot工具:android的内核通过某种格式与分区表等信息打包在一起(boot.img),因此需要通过mkboot工具对内核进行解包和打包。我使用的mkboot工具,进行编译后得到了mkbootimg和unmkbootimg两个可执行文件。
从目标手机获得手机boot.img文件:通过数据线连接手机,执行
$ adb shell #进入手机终端
$ su # 转换为超级用户
cd /dev/block/platform/soc.0/f9824900.sdhci/by-name #中间路径也许不同,但最终是到by-name这个目录
ls -l boot # 这个文件是一个符号连接,链接到/dev/block下的某个文件
dd if=/dev/block/mmcblk0p34 of=/sdcard/boot.img #by-name目录下的boot即boot.img,但是它是一个符号链接,因此将符号连接的内容复制出来
$ adb pull /sdcard/boot.img ~/resource
将自己编译的内核放进boot.img:通过unmkbootimg解压boot.img
unmkbootimg -i boot.img #输出信息中,有建议怎么去重新打包boot.img
复制unmkbootimg提示的信息,然后将改信息中 --kernel 指定部分换为自己后编译后的内核文件Image.gz-dtb,-o指定新打包的内核名称,其余不需要修改,如:
mkbootimg --base 0 --pagesize 4096 --kernel_offset 0x00008000 --ramdisk_offset 0x02000000 --second_offset 0x00f00000 --tags_offset 0x01e00000 --cmdline 'androidboot.hardware=angler androidboot.console=ttyHSL0 msm_rtb.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 boot_cpus=0-3 no_console_suspend buildvariant=user' --kernel Image.gz-dtb --ramdisk ramdisk.cpio.gz -o newboot.img
回车执行后,获得重新打包的内核newboot.img。
将新boot.img重新刷写入手机
首先将手机切换到fastboot状态
$ su # 刷入内核需要获取root状态
adb reboot bootloader # 切换到fastboot状态
fastboot flash boot newboot.img #刷入新内核
fastboot reboot #重启
至此,新手机内核已经刷入完成,手机重启后,可以去设置-关于手机查看内核版本和型号。
可能会遇到的紧急情况
如果操作失误,可能会遇到分区表损坏的情况,导致开不了机,也使用不了recovery,这个时候只需要去官方下载官方rom,然后单独刷入recovery就可以重新使用recovery功能,然后重新刷官方rom就可以救砖(数据会全部丢失!!)