基于nexus6修改android内核

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就可以救砖(数据会全部丢失!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值