KernelSU内核编译
KernelSU编译教程

环境搭建

搭建编译所需的环境

系统安装

教程基于ubuntu,你可以选择实机安装或者使用wsl2,如何安装请看使用 WSL 在 Windows 上安装 Linux

注:wsl将系统各盘挂载至/mnt目录,通过此挂载点可以实现文件传输

编译环境

使用以下命令安装所需软件包

1
2
3
4
5
sudo apt install -y bc bison build-essential curl flex g++-multilib gcc-multilib \
                    git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev \
                    lib32z1-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev \
                    libssl-dev libxml2 libxml2-utils lzop pngcrush schedtool \
                    squashfs-tools xsltproc zip zlib1g-dev unzip  

注: 若使用其他发行版或有部分软件包找不到,可以暂时忽略,等编译出现如xxx not found的错误时再安装

系统代理

如果你的设备能够直连Github,并且速度还不错,那你可以忽视这一步

我们使用clash作为代理工具

  1. 可以使用clash-verge-revclash-nyanpasu

  2. 具体配置不再赘述,其他代理客户端也行,具体看代理提供商支持哪些协议

  3. 使用以下命令设置终端代理

1
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7891

源码下载

现在开始下载所需的内核源码和工具,我们最好创建一个工作目录

1
2
3
mkdir -p kernel  && cd kernel #创建并进入工作目录
mkdir -p toolchains  #工具链目录
mkdir -p source  #内核源码目录

内核源码

如果你是小米用户,你可以试着下官方的源码,不过官方的源码可能不能成功编译,而且年久失修,大部分新机都没有公布源码,所以还是建议使用类原生的源码

1
2
3
4
5
官方源码仓库
https://github.com/MiCode/Xiaomi_Kernel_OpenSource

如果要下载的话请使用 git 命令
git clone --depth=1 https://github.com/MiCode/Xiaomi_Kernel_OpenSource -b cannon-r-oss  

cannon-r-oss是作者的手机代号,需将cannon-r-oss换成自己源码的分支

类原生的话就简单多了,点击仓库右上角的code,把HTTPS的链接复制下来

1
git clone xxx.git  # xxxxxxxx.git换成自己的链接

添加KernelSU

KernelSU 1.0 及更高版本已经不再支持非 GKI 内核,最后的支持版本为 v0.9.5,请注意使用正确的版本

使用

1
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s v0.9.5

将KernelSU-v0.9.5添加到内核源码树 然后需要编辑你的配置文件,通常在arch/arm64/configs/,较新的机型也可能在arch/arm64/configs/vendor/

进入文件夹,找到类似设备代号_defconfig的文件,比如我的代号是cannon,配置文件就是cannon_defconfig

使用任意编辑器打开你的配置文件,查找是否开启以下配置 如果没有开启相关的配置,需要手动添加

1
2
3
CONFIG_KPROBES=y
CONFIG_HAVE_KPROBES=y
CONFIG_KPROBE_EVENTS=y

工具链下载

作者使用zys-clang12和gcc4.9进行编译 因为zyc-clang需要下载压缩包并解压,所以我们先使用git下载gcc

1
git clone https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9.git

选择任意方式下载 zyc-clang

1
https://github.com/ZyCromerZ/Clang/releases/download/12.0.1-20230207-release/Clang-12.0.1-20230207.tar.gz

下载完成后用tar -zxvf Clang-xxxx.tar.gz解压

如果觉得目录太常不方便的话,可以用mv命令重命名文件夹

1
mv <原名称> <你想改的名称>   

编译脚本

一般我们会用一个编译脚本设置环境变量、配置文件等 我的脚本是参考别人教程

1
vim build.sh #创建编译脚本 

写入以下内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
starttime=`date +'%Y-%m-%d %H:%M:%S'`
export ARCH=arm64
export SUBARCH=arm64
make O=out cannon_defconfig
              make -j8 O=out \
    NM=~/kernel/toolchains/clang-12/bin/llvm-nm \
    OBJCOPY=~/kernel/toolchains/clang-12/bin/llvm-objcopy \
    LD=~/kernel/toolchains/clang-12/bin/ld.lld \
        CROSS_COMPILE=~/kernel/toolchains/clang-12/bin/aarch64-linux-gnu- \
        CROSS_COMPILE_ARM32=~/kernel/toolchains/gcc-arm-4.9/bin/arm-linux-androideabi- \
        CC=~/kernel/toolchains/clang-12/bin/clang \
        AR=~/kernel/toolchains/clang-12/bin/llvm-ar \
        OBJDUMP=~/kernel/toolchains/clang-12/bin/llvm-objdump \
        STRIP=~/kernel/toolchains/clang-12/bin/llvm-strip
        2>&1 | tee error.log
endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date=" $starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo Start: $starttime.
echo End: $endtime.
echo "Build Time: "$((end_seconds-start_seconds))"s."

需要注意的是,cannon_defconfig配置文件的路径已经在arch/arm64/configs/

假设你的配置文件是arch/arm64/configs/example_defconfig那你只需要填写example_defconfig即可

但如果你的配置文件位于arch/arm64/configs/vendor/example_defconfig则需要填写vendor/example_defconfig

开始编译

chmod +x build.sh添加执行权限,./build.sh执行编译脚本,产出在out/arch/arm64/boot目录

打包内核

能来到这一步,你应该能成功编译出内核,恭喜你,接下来我们需要将它打包成boot或内核刷入

AnyKernel3

项目地址:https://github.com/osm0sis/AnyKernel3

git下载AnyKernel3

1
git clone https://github.com/osm0sis/AnyKernel3.git

你需要把产出的Image放到AnyKernel3的根目录,然后编辑anykernel.sh 需要改的是以下几点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
kernel.string=KernelSU-cannon-inuyasha #内核名称
do.devicecheck=1 #设备检测,为0时关闭
do.modules=0
do.systemless=1
do.cleanup=1
do.cleanuponabort=0
device.name1=cannon  #设备代号,可以设置多个
device.name2=cannong
device.name3=
device.name4=
supported.versions=
supported.patchlevels=
supported.vendorpatchlevels=

block=auto;   
is_slot_device=auto;  
ramdisk_compression=auto; 
patch_vbmeta_flag=auto; 

配置完后使用zip -r9 UPDATE-AnyKernel3.zip * -x .git README.md *placeholder即可打包内核

如果使用zsh,可能会报错not matches found,只需要在.zshrc中添加

1
setopt no_nomatch

然后再source ~/.zshrc即可解决

MagiskBoot

如果你不喜欢用anykernel3,你也可以提取原版的boot.img使用编译出来的image替换原厂kernel

  1. 首先到Magisk下载magisk.apk,重命名为.zip并解压
  2. 把解压后的Magisk-v26.1/lib/arm64-v8a/libmagiskboot.so文件,用 adb push 到手机
1
adb push Magisk-v26.1/lib/arm64-v8a/libmagiskboot.so /data/local/tmp/magiskboot 

Magisk-v26.1需要改成下载的版本号

  1. 按照上面的方法把提取的boot.img和编译出的Image都push到手机
  2. adb shell进入adb,然后进入手机/data/local/tmp/目录,赋予magiskboot可执行权限chmod +x magiskboot
  3. 执行./magiskboot unpack boot.img解包boot.img得到kernel文件
  4. Image替换kernelmv -f Image kernel
  5. 最后执行./magiskboot repack boot.img命令重新打包boot.img,得到new-boot.img,备份原厂boot后在fastboot中刷入即

拓展

如果kprobe不正常工作,就会出现无限重启,不开机,替换boot后仍显示不支持等错误,接下来我们将手动修改源码集成ksu

首先让我们验证是否为kprobe的问题,

  1. 首先用vim打开KernelSU/kernel/ksu.c
  2. 找到ksu_enable_sucompat() 和 ksu_enable_ksud()这两行,使用//注释掉
1
2
// ksu_enable_sucompat();
// ksu_enable_ksud()

就像这样

重新编译你的内核,看能否开机,如果能正常开机就是kprobe的问题,如果还是不能开机,检查你的源码是否适用你的系统

修改内核源码

  1. 使用这条命添加KSU
1
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -
  1. 因为要改的比较多,推荐去看官方文档,写的比较详细

BugReport

如果手动集成还是失败,你可以去Github提供一个BugReport给作者,在管理其设置,发送日志即可发送错误日志

Docker支持

在手机终端中执行check-config.sh脚本,将所有missing的配置添加到内核配置文件,并重新编译内核

参考|部分引用

如何为非 GKI 内核集成 KernelSU

红米K40内核KernelSU编译

手机端编译安卓内核


Last modified on 2023-08-05