小米内核编译并刷入手机

手上有一个不用了的小米note pro,一直在尝试使用高通的代码编译出原始刷机包,但是在替换kernel代码以后刷机以后总是没法开机,然后一直在尝试另外的方式,但是总是不行。最近在网上看到了一种新的方式,开始也一直失败,但是还是有问题,以及工具使用问题,还是在一直失败。终于在昨天晚上(2021-03-19)成功了。并且加入了一些去除显示调试信息的修改。特此记录一下步骤,后面打算尝试把系统升级到Android11。话不多说,开始操作。

1、环境

①、Ubuntu18:我是用的win10的Hyper虚拟机安装的Ubuntu,其实Ubuntu14也可以;

②、小米内核代码:可以通过https://github.com/MiCode/Xiaomi_Kernel_OpenSource.git下载,也可以通过我自己的镜像下载(https://git.code1000.cn:2443/r/android/xiaomi_kernel.git);

③、交叉编译工具:https://git.code1000.cn:2443/r/toolchain_aarch64_travis.git,这个是我从https://bitbucket.org/jonascardoso/toolchain_aarch64_travis下载的,然后同步到我git上面的,里面添加了一个env.sh的shell脚本,后面有用。也可以从这儿查看内容并且下载到你的本地。

④、img解包工具:用来把官方boot.img中的boot.img-zImage替换换成我们自己编译出来的。可以从这里下载或者从我的git仓库ssh://ice@git.code1000.cn:2256/Android-Image-Kitchen.git下载。我这边使用Windows的版本不成功会报错,建议下载liunx版本的,我的git仓库的可以切换到Linux的分支。

⑤、 boot.img:你可以通过开发版的线刷包获取,你也可以进入手机通过dd命令拿你手机里面的.后面会有详细的步骤。

⑥、手机系统是开发版本,并且解锁了fastboot。如果你的手机不是开发版,并且下载不到开发版的线刷包,你可以通过小米助手(http://zhushou.xiaomi.com/)中的刷机功能来刷成开发版。fastboot的解锁,你可以通过https://www.miui.com/unlock/download.html来获取解锁fastboot的方法。

⑦、adb和fastboot工具:https://wp.code1000.cn:88/platform-tools.rar。里面的fastboot是我用的小米助手里面的,这个是Windows下的,Linux版本需要你们自己下一下。

2、 (Ubuntu18) 安装相关工具

    sudo apt-get install git ccache automake flex lzop bison \
gperf build-essential zip curl zlib1g-dev zlib1g-dev:i386 \
g++-multilib python-networkx libxml2-utils bzip2 libbz2-dev \
libbz2-1.0 libghc-bzlib-dev squashfs-tools pngcrush \
schedtool dpkg-dev liblz4-tool make optipng maven libssl-dev \
pwgen libswitch-perl policycoreutils minicom libxml-sax-base-perl \
libxml-simple-perl bc libc6-dev-i386 lib32ncurses5-dev \
x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev xsltproc unzip

3、 (Ubuntu18) 进入内核代码,切换到相应分支,我的小米note pro的Android N是libra-n-oss分支。

4、 (Ubuntu18) 修改调试识别代码。我们要修改的源文件位于 /Code_Opensource/kernel/fs/proc 目录下,array.c 和 base.c 这两个文件,总共3处需要修改,如图:

修改点1

这一处操作是修改Linux内核对进程状态的描述,主要是改掉”t (tracing stop)”,这表示进程处于跟踪状态或者暂停状态,会写入进程状态的描述文件的。修改时要 注意 保持数组大小不变,因为后面的代码会检查这个数组大小,如果数组大小变动了,编译的时候会出错。

修改点2

这一处操作是对 tpid 进行重新赋值。tpid 是描述进程状态的一个变量,它关联着进程状态描述的TracerPid 的值,表示 ptrace 对应的进程 id ,可以理解为如果目标程序处于调试状态,tpid的值 == 调试程序的pid;如果目标程序未处于调试状态,则 tpid 的值 == 0 。

修改点3

这一处操作是针对 proc_pid_wchan() 函数,它影响着  /proc/目标进程PID/wchan 这一文件,当进程处于调试状态下, wchan文件会显示ptrace_stop。

5、 (Ubuntu18) 复制 toolchain_aarch64_travis 中的env.sh文件复制到内核代码根目录,并且修改交叉编译路径和内核配置文件。

内核配置文件可以通过最新的提交记获取。
小米note pro的内核配置代码就是leo_user_defconfig

6、 (Ubuntu18) 执行env.sh脚本进行编译,最后会生成Image.gz-dtb文件,结束的时候会有具体的路径,我的就是arch/arm64/boot/Image.gz-dtb

7、 (Windows) 首先需要确认你的手机是开发版本的,并且解锁的fastboot。如果你可以通过最新的线刷包获取boot.img你可以跳过此步骤。否则进入设置搜索“ROOT权限管理”,开启root权限(开发版我不清楚需不需要开启,你们也可以试试不开启root权限)。打开开发者模式打开cmd命令窗口

adb shell

cd /dev/block/platform/soc.0/f9824900.sdhci/by-name(有可能不是这个目录,但是应该是在 dev/block/platform 目录下面,你可以通过find /dev/block/platform/ -name ” by-name ” 来找到具体的路径)

ls -la(找到boot对应的块设备,我的是/dev/block/mmcblk0p37)

dd if=/dev/block/mmcblk0p37 of=/sdcard/boot.img(备份boot分区到sdcard目录,并且把boot.img复制到Ubuntu18中的img解包工具目录下面,也就是 Android-Image-Kitchen 目录中)。

8、 (Ubuntu18) 进入 img解包工具目录,执行unpackimg.sh boot.img。把我们编译出的 Image.gz-dtb 文件复制到split_img文件夹中并且重命名成boot.img-zImage,覆盖掉原有的boot.img-zImage文件。

9、 (Ubuntu18) 执行repackimg.sh脚本会生成image-new.img文件,就是我们需要的boot.img,并且复制到Windows的目录下。

10、手机进入fastboot,一般关机以后按住开机和音量下键就可以进入到小机器人界面,也就是fastboot界面

11、 (Windows) 在cmd命令窗口执行“fastboot.exe flash boot 第9步复制的img镜像”。最后fastboot.exe reboot 重启手机即可

You May Also Like

About the Author: ice.zhai

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注