环境搭建
搭建编译所需的环境
系统安装
教程基于ubuntu,你可以选择实机安装或者使用wsl2,如何安装请看使用 WSL 在 Windows 上安装 Linux
注:wsl下的文件传输需将文件移动到挂载点/mnt/c
编译环境
使用以下命令安装所需软件包
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
|
系统代理
如果你的设备能够直连Github,并且速度还不错,那你可以忽视这一步
我们使用clash作为代理工具
Linux
请看我的另一篇文章Clash-For-Linux
Windows
- 下载Clash-For-Windows(已存档)
- 都有图形化操作界面了还要我教?
- 使用以下命令设置终端代理
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 xxxxxxxxxxxx.git # xxxxxxxx.git换成自己的链接
|
添加KernelSU
只需使用
1
|
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -
|
即可将KernelSU添加到内核源码树
然后需要编辑你的配置文件,通常在arch/arm64/configs/
,较新的机型也可能在arch/arm64/configs/vendor/
进入文件夹,找到类似设备代号_defconfig
的文件,比如我的代号是cannon,配置文件就是cannon_defconfig
使用vim编辑配置文件,用ESC+/
进入查找,在/后面输入你要找的内容,例如/KPROBES
如果没有开启相关的配置,需要手动添加
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
|
浏览器访问
1
|
https://github.com/ZyCromerZ/Clang/releases/download/12.0.1-20230207-release/Clang-12.0.1-20230207.tar.gz
|
下载zyc-clang
下载完成后用tar -zxvf xxxx.tar.gz
解压
如果觉得目录太常不方便的话,可以用mv命令重命名文件夹
编译脚本
一般我们会用一个编译脚本设置环境变量、配置文件等
我的脚本是抄参考别人教程
写入以下内容
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
中添加
然后再source ~/.zshrc
即可解决
MagiskBoot
如果你不喜欢用anykernel3,你也可以提取原版的boot.img使用编译出来的image替换原厂kernel
- 首先到Magisk下载magisk.apk,重命名为.zip并解压
- 把解压后的
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
需要改成下载的版本号
- 按照上面的方法把提取的boot.img和编译出的Image都push到手机
- 用
adb shell
进入adb,然后进入手机/data/local/tmp
/目录,赋予magiskboot可执行权限chmod +x magiskboot
- 执行
./magiskboot unpack boot.img
解包boot.img得到kernel文件
- 用Image替换kernel
mv -f Image kernel
- 最后执行
./magiskboot repack boot.img
命令重新打包boot.img,得到new-boot.img,备份原厂boot后在fastboot中刷入即
拓展
如果kprobe不正常工作,就会出现无限重启,不开机,替换boot后仍显示不支持等错误,接下来我们将手动修改源码集成ksu
首先让我们验证是否为kprobe的问题,
- 首先用vim打开
KernelSU/kernel/ksu.c
- 找到
ksu_enable_sucompat() 和 ksu_enable_ksud()
这两行,使用//
注释掉
1
2
|
// ksu_enable_sucompat();
// ksu_enable_ksud()
|
就像这样
重新编译你的内核,看能否开机,如果能正常开机就是kprobe的问题,如果还是不能开机,检查你的源码是否适用你的系统
修改内核源码
- 使用这条命添加KSU
1
|
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -
|
- 因为要改的比较多,推荐去看官方文档,写的比较详细
BugReport
如果手动集成还是失败,你可以去Github提供一个BugReport给作者,在管理其设置,发送日志即可发送错误日志
参考|部分引用
如何为非 GKI 内核集成 KernelSU
红米K40内核KernelSU编译
手机端编译安卓内核