首页
社区
课程
招聘
Pixel 3 Kernel 4.9 编译集成 ReSukiSU 指南
发表于: 10小时前 177

Pixel 3 Kernel 4.9 编译集成 ReSukiSU 指南

10小时前
177

Pixel 3 Kernel 4.9 编译集成 ReSukiSU 指南

前言

在编译 Pixel 3 的 SukiSU-Ultra 内核时遇到了各种兼容性问题,经过多次尝试后改用 ReSukiSU 方案。参考 JackA1ltman 的 NonGKI_Kernel_Build_2nd 仓库中提供的补丁代码,成功编译出带有 susfs 和 kpm 的 ReSukiSU 版本。

本文记录了完整的编译过程,供有相同需求的用户参考。编译过程中部分 patch 可能存在冲突需要手动修正,文章末尾会提供修正后的 patch 文件以及打包 boot 后驱动丢失的解决方案。

编译环境准备

本次编译采用 WSL 下的 Ubuntu 22.04,需先安装必要的编译环境,并下载 Pixel 3 源码。

必要编译环境

sudo apt install -y build-essential git make clang llvm lz4 zstd zip unzip tar curl wget bc cpio flex bison perl python3 python3-pip libssl-dev libelf-dev libncurses5-dev libncurses-dev libbz2-dev liblz4-tool u-boot-tools dtc coccinelle lib32stdc++6 gcc-aarch64-linux-gnu g++-aarch64-linux-gnu openjdk-8-jdk

设置 git

git config --global user.email "xxx@gmail.com"
git config --global user.name "xxx"

设置安装 repo

可以使用官方下载或者镜像下载

mkdir ~/bin
PATH=~/bin:$PATH
curl 6c0K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6N6r3!0J5j5h3N6W2i4K6u0W2k6$3!0G2k6$3I4W2j5i4m8A6M7#2)9J5k6h3y4G2L8g2)9J5c8X3N6A6N6q4)9J5k6s2u0W2M7r3!0Q4x3X3c8V1L8%4N6F1L8r3!0S2k6s2y4Q4x3V1k6J5k6i4m8G2 > ~/bin/repo
# curl -L c4eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0K9i4u0J5L8%4u0K6i4K6u0W2N6s2g2F1j5g2)9J5k6i4c8K6K9h3&6Y4K9s2g2S2i4K6u0W2k6h3c8#2i4K6u0W2j5$3&6Q4x3V1k6Y4K9i4c8Q4x3V1k6Y4K9i4c8Q4x3X3c8J5k6i4m8G2 -o repo 或者采用镜像站点进行下载
chmod a+x ~/bin/repo
repo version # 执行查看是否安装成功
# 后续需要用到python
sudo ln -s /usr/bin/python3 /usr/bin/python

内核源码下载

pixel3 内核源码直接使用官方的链接同步进行下载,或采用镜像站点进行下载即可(建议官方下载可将编译工具环境一并同步下来不需要在去配置)

官方下载请参考 Android 官方内核编译文档

image

mkdir android-kernel && cd android-kernel
repo init -u 02bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0W2k6$3!0G2k6$3I4W2M7$3!0#2M7X3y4W2i4K6u0W2j5$3!0E0i4K6u0r3K9$3g2J5L8X3g2D9i4K6u0r3L8h3q4F1K9h3k6W2M7%4b7`. -b android-msm-crosshatch-4.9-android12
repo sync -c --no-tags

镜像站点下载

⚠️ 注意:此种方式需要自行配置编译工具链,不建议新手使用

mkdir android-kernel && cd android-kernel
git clone -b android-msm-crosshatch-4.9-android12 f65K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2L8%4y4H3i4K6u0W2N6s2g2F1j5g2)9J5k6i4c8K6K9h3&6Y4K9s2g2S2i4K6u0W2k6h3c8#2i4K6u0W2j5$3&6Q4x3V1k6S2L8X3c8J5L8$3W2V1i4K6u0r3K9$3g2J5L8X3g2D9i4K6u0r3L8i4y4E0i4K6u0W2k6$3W2@1

同步完成后进入下一步 ReSukiSU 集成

ReSukiSU 集成

参考 ReSukiSU 官方集成方式 ReSukiSU 官方构建指南

进入/private/msm-google[所有操作基本基于此目录下]下载 ReSukiSU 补丁

curl -LSs "123K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6J5j5i4N6Q4x3X3g2Y4K9i4c8Z5N6h3u0#2M7$3g2J5j5$3!0F1N6r3g2F1N6q4)9J5k6h3y4G2L8g2)9J5c8W2u0W2f1%4g2C8K9g2y4g2i4K6u0r3f1X3g2e0N6h3E0A6f1#2g2Q4x3V1k6E0j5h3W2F1i4K6u0r3K9$3g2J5L8X3g2D9i4K6u0r3M7$3g2@1N6i4m8Q4x3X3g2K6K9l9`.`." | bash

由于需要集成 susfs 和 kpm 故不能全参考官方集成方式进行修补,需要借鉴**NonGKI_Kernel_Build_2nd**项目中补丁进行修补即可,参考 build-xiaomi-mix2s-evox10-a15.yml 这个 action 中的编译过程进行修补,直接从项目中找到对应文件进行修补即可

修补 KMP 部分

由于 4.9 内核部分缺少 memory 相关函数,需先进行此部分 patch 进行修复

patch -p1 < set_memory_to_49_and_low.patch

image

查看 patch 是否存在未修补的需要手动进行修补,可使用 git status 查看

git status

image

需要对存在 rej 文件进行修补,此处只对一个进行演示修补

image

对 rej 的文件对应的文件进行修补后清除一下 rej 文件

find . -type f \( -name "*.rej" -o -name "*.orig" \) -delete

修补 susfs 部分及 inline_hook

首先修补 susfs 部分文件,一路回车修补

patch -p1 < susfs_patch_to_4.9.patch

查看存在冲突部分进行手动修补(和修补 set_memory 一致自行修补),可以存在多个冲突需要仔细对照修补

git status

image

image

修补 inline_hook

./susfs_inline_hook_patches.sh

其他补丁集成

Hide Stuff 补丁

伪造 /proc 进程内存视图,抹除 KSU/SUSFS/ 定制内核所有痕迹,参考.github\workflows\patch-hide-stuff\action.yml 文件制作一个 bash 文件

if grep -q "show_vma_header_prefix_fake" "fs/proc/task_mmu.c"; then
  echo "[+] Found show_vma_header_prefix_fake."
else
  spatch --sp-file added_show_vma_header_prefix_fake.cocci --in-place fs/proc/task_mmu.c
  echo "[+] Added show_vma_header_prefix_fake."
fi
if grep -q "struct dentry \*dentry" "fs/proc/task_mmu.c"; then
  echo "[+] Found variable."
else
  sed -i '/const char \*name = NULL;/a\    struct dentry *dentry;' fs/proc/task_mmu.c
  echo "[+] Added dentry."
fi
if grep -q "jit-zygote-cache" "fs/proc/task_mmu.c"; then
  echo "[+] Found hide stuff."
else
  spatch --sp-file function_hide_stuff.cocci --in-place fs/proc/task_mmu.c
  echo "[+] Added hide stuff."
fi
if grep -q "bypass:" "fs/proc/task_mmu.c"; then
  echo "[+] Found bypass."
else
  if grep -q 'if (show_vma_header_prefix' "fs/proc/task_mmu.c"; then
      perl -i -0pe 's/(if \(show_vma_header_prefix\(m, start, end, flags, pgoff, dev, ino\)\)\s+return;)/$1\nbypass:/s' fs/proc/task_mmu.c
      echo "[+] Added bypass."
  else
      sed -i '/show_vma_header_prefix(m, start, end, flags, pgoff, dev, ino);/a\bypass:' fs/proc/task_mmu.c
      echo "[+] Added bypass."
  fi
fi
if grep -q "lineage" "fs/proc/base.c"; then
  echo "[+] Found hide stuff part ii."
else
  spatch --sp-file function_hide_stuff_partii.cocci --in-place fs/proc/base.c
  echo "[+] Added hide stuff part ii."
fi
if grep -q "/dev/ashmem" "fs/proc/task_mmu.c"; then
  sed -i 's|"/dev/ashmem (deleted)"|"/system/framework/framework-res.apk"|' fs/proc/task_mmu.c
  sed -i 's|"/dev/ashmem (deleted)"|"/system/framework/framework-res.apk"|' fs/proc/base.c
  echo "[+] Changed ashmem to framework-res."
fi

然后将仓库中\Patches\HideStuff 的文件复制到/private/msm-google 下,将上面的 sh 在此目录下执行即可

image

no-kprobe 补丁

抛弃 kprobe 钩子,改用 syscall / SUSFS 内联钩子,躲开所有基于 kprobe 的 Root 检测,内核更稳、隐藏更强。

先执行 backport_kernel_read_and_kernel_write_4.9.patch

patch -p1 < backport_kernel_read_and_kernel_write_4.9.patch
#  然后查看git status 是否存在rej
git status

image

再执行 backport_patches.sh 和 backport_selinux_patches.sh

x@xx:~/android-kernel/private/msm-google$./backport_patches.sh
Current backport patch version:2025-11-14
======================================
[+] fs/namespace.c Patched!
[+] Count: 2
======================================
[+] fs/internal.h Patched!
[+] Count: 1
======================================
[-] KernelSU have no strncpy_from_user_nofault, Skipped.
======================================
[-] KernelSU have no strncpy_from_user_nofault, Skipped.
======================================
[-] KernelSU have no strncpy_from_user_nofault, Skipped.
======================================
======================================
[+] include/linux/seccomp.h Patched!
[+] Count: 1
======================================
x@xx:~/android-kernel/private/msm-google$ ./backport_selinux_patches.sh
Current SELinux backport patch version:2025-11-14
======================================
[-] KernelSU have no selinux_inode, Skipped.
[-] KernelSU have no selinux_cred, Skipped.
======================================
[-] KernelSU have no selinux_inode, Skipped.
======================================
[-] KernelSU have no selinux_cred, Skipped.
======================================
[-] KernelSU have no selinux_inode, Skipped.
[-] KernelSU have no selinux_cred, Skipped.
======================================

Re:Kernel 补丁

内核运行时环境伪装 + 系统调用表隐藏 + 规避内核版本 / 特征检测

patch -p1 < rekernel_extra.patch
./rekernel_patches.sh

Baseband Guard (BBC) 补丁

保护基带、EFS、Persist、Modem 等关键分区不被恶意篡改、非法刷写。⚠️ 注意:在集成过程中按照脚本编译后并未追加配置文件,此补丁可能未生效(若有大佬知道原因可告知,非常感谢)

根据仓库代码制作 bash 脚本进行操作,由于内核版本低有些不太兼容,需要手动修改一下

wget -O- e23K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6$3j5#2)9J5k6s2c8W2j5h3S2G2N6i4y4W2i4K6u0r3b7X3q4K6k6h3u0S2L8X3c8Q4x3X3c8Y4N6h3q4J5k6q4)9J5c8Y4u0S2N6#2)9J5c8X3#2S2K9h3&6Q4x3V1k6K6k6i4c8#2M7q4)9J5k6i4y4Z5 | bash
          echo -e "\nCONFIG_BBG=y" >> ./arch/arm64/configs/b1c1_defconfig

          if grep -q "DEFINE_LSM" "include/linux/lsm_hooks.h" && ! grep -q "baseband_guard" "./arch/arm64/configs/b1c1_defconfig"; then
            echo "=======Detect======="
            echo "= Found DEFINE_LSM ="
            echo "===================="

            if grep -q "CONFIG_LSM" "./arch/arm64/configs/b1c1_defconfig"; then
                echo "[-] Have not found default CONFIG_LSM values."
                echo 'CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,baseband_guard"' >> ./arch/arm64/configs/b1c1_defconfig
            else
                echo "[+] Found default CONFIG_LSM values."
                sed -i 's/\(CONFIG_LSM="[^"]*\)"/\1,baseband_guard"/' ./arch/arm64/configs/b1c1_defconfig
            fi

          fi

          echo "Patched Baseband Guard for your kernel successfully."

image

Baseband Guard (BBC) 补丁排错

官方脚本不匹配

大概率编译会报错,因为脚本中并未匹配到一条数据添加头文件,故需要手动添加

image

image

image

由于下载的 setup.sh 脚本中存在补丁匹配没匹配到添加函数头需手动修补

image

image

函数重复

会出现这个函数重复问题,直接注释一个即可

image

image

配置设置及编译

配置设置

pixel3 的配置文件为/private/msm-google/arch/arm64/configs/b1c1_defconfig 文件,添加如下配置

CONFIG_KSU=y
CONFIG_KSU_SUSFS=y
CONFIG_SUSFS_EXTRA_WORKS=y
CONFIG_KSU_SUSFS_SUS_PATH=y
CONFIG_KSU_SUSFS_SUS_MOUNT=y
CONFIG_KSU_SUSFS_SUS_KSTAT=y
CONFIG_KSU_SUSFS_SPOOF_UNAME=y
CONFIG_KSU_SUSFS_ENABLE_LOG=y
CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS=y
CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG=y
CONFIG_KSU_SUSFS_OPEN_REDIRECT=y
CONFIG_KSU_SUSFS_SUS_MAP=y
CONFIG_THREAD_INFO_IN_TASK=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KPM=y
#BBC配置 需要集成BBC开启
CONFIG_BBG=y

修改 android-kernel/build.config 文件,注释检查编译配置文件行

image

直接开始编译

./build/build.sh

若编译过程中错误停止提示字符超过 64 字节时,直接写死一个内核名称即可

image

image

编译完成后应为开启 kpm 需要对 Image 进行补丁,需去SukiSU_patch仓库中下载 patch 脚本

image

然后放到 /out/android-msm-pixel-4.9/private/msm-google/arch/arm64/boot 下进行修补 Image,将生成新的 oImage(即 patch 后的 Image),用其打包回 boot 即可

./patch_linux

image

解决 Image 打包成 boot 后驱动丢失问题

[!NOTE]
若编译整个安卓系统的可忽略打包 boot 后驱动丢失问题情况

由于直接使用 magiskboot 手动解压 boot 后将 Image 替换打包进去刷入系统会存在驱动丢失问题,故参考 B 站上的视频教程进行解决。

提取驱动编译参数

需要先找个原本的 boot.img(可以去刷机包中提取)

image

然后使用Android Image Kitchen工具提取 boot 文件和驱动参数,点击运行 unpackimg.bat 将自动解压 boot(注意软件不能在中文路径下使用)

image

需要解压页面中参数如下:

BOOT_IMAGE_HEADER_VERSION=2
KERNEL_CMDLINE="console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237 ehci-hcd.park=3 service_locator.enable=1 cgroup.memory=nokmem lpm_levels.sleep_disabled=1 usbcore.autosuspend=7 loop.max_part=7 androidboot.boot_devices=soc/1d84000.ufshc androidboot.super_partition=system buildvariant=user"
BASE_ADDRESS=0x00000000
PAGE_SIZE=4096

并且需要解压 split_img 目录下 boot.img-ramdisk.cpio.gz

image

然后将解压的 boot.img-ramdisk.cpio 文件放到内核编译目录下面

image

后续还需去官方编译源码中找到mkbootimg.py,该脚本可将把 kernel + ramdisk.cpio.gz + dtb + 头信息合成 boot.img 即可刷入

image

现在编译时需要重新修改编译命令

BUILD_BOOT_IMG=1
MKBOOTIMG_PATH=mkbootimg.py
VENDOR_RAMDISK_BINARY=ramdisk.cpio
KERNEL_BINARY=Image.lz4
BOOT_IMAGE_HEADER_VERSION=2 KERNEL_CMDLINE="console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237 ehci-hcd.park=3 service_locator.enable=1 cgroup.memory=nokmem lpm_levels.sleep_disabled=1 usbcore.autosuspend=7 loop.max_part=7 androidboot.boot_devices=soc/1d84000.ufshc androidboot.super_partition=system buildvariant=user"
BASE_ADDRESS=0x00000000
PAGE_SIZE=4096
build/build.sh

直接可编译出 boot.img

image

但由于需要对 Image 进行 kpm 补丁,故可以对 Image 进行补丁后在执行脚本合并 boot.img,先对 oImage 压缩到 lz4 格式

lz4 oImage
# 然后指定oImage.lz4路径,dtb ramdisk 路径和生成boot路径,其余参数和编译使用提取脚本参与一致,也看查看编译时脚本最后运行参数即可提取到该脚本参数
python mkbootimg.py --kernel /home/x/android-kernel/out/android-msm-pixel-4.9/dist/oImage.lz4  --header_version 2 --base 0x00000000 --pagesize 4096 --cmdline 'console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237 ehci-hcd.park=3 service_locator.enable=1 cgroup.memory=nokmem lpm_levels.sleep_disabled=1 usbcore.autosuspend=7 loop.max_part=7 androidboot.boot_devices=soc/1d84000.ufshc androidboot.super_partition=system buildvariant=user' --dtb /home/x/android-kernel/out/android-msm-pixel-4.9/dist/dtb.img --ramdisk /home/x/android-kernel/out/android-msm-pixel-4.9/dist/ramdisk.gz -o /home/x/android-kernel/out/android-msm-pixel-4.9/dist/boot.img

image

刷入 boot 及管理器安装

刷入 boot 时可以进行临时刷入,若 boot 存在问题可关机重启后就正常了

adb reboot bootloader
# 临时刷入,重启后失效
fastboot boot boot.img
# 永久刷入
fastboot flash boot boot.img
# 刷入完成后重启进入系统
fastboot reboot

可以安装 ReSukiSu 管理器也可使用 SukiSU-Ultra 的管理

image

image

image

验证功能是否正常

刷入系统后,打开管理器查看是否正常识别:

  1. 打开 ReSukiSU 或 SukiSU-Ultra 管理器,确认显示内核版本信息
  2. 检查 SUSFS 状态:在管理器中确认 susfs 模块是否正常加载
  3. 检查 KPM 状态:确认 Kernel Patch Module 功能是否可用
  4. 安装一个测试模块验证模块管理功能正常

常见问题 FAQ

Q: patch 冲突如何手动修补?
A: 使用 git status 查找 .rej 文件,对照 .rej 内容手动修改对应源文件,修补完成后使用 find . -type f \( -name "*.rej" -o -name "*.orig" \) -delete 清理。

Q: 编译报错"字符超过 64 字节"怎么处理?
A: 找到对应的内核版本字符串定义位置,将其写死为一个固定的短内核名称即可。

Q: BBC (Baseband Guard) 补丁编译报错?
A: 由于官方脚本未正确匹配头文件,需要手动添加缺失的头文件引用,具体参考上文 BBC 补丁排错部分。

Q: 打包 boot 后驱动丢失怎么办?
A: 参考上文"解决 Image 打包成 boot 后驱动丢失问题"章节,使用 mkbootimg.py 并指定正确的 ramdisk、dtb 和 cmdline 参数重新打包。

Patch 地址

参考链接

解决驱动异常:

上游内核源码及工具(susfs、SukiSU-Ultra、KernelSU):


[培训]《冰与火的战歌:Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 10小时前 被secflag编辑 ,原因: 标题
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回