編譯KernelSU-01通用流程

KernelSU 源碼編譯完整指南
KernelSU 是 Android 設(shè)備的內(nèi)核級權(quán)限管理工具,編譯核心是 「獲取對應(yīng)設(shè)備的內(nèi)核源碼 + 集成 KernelSU 補丁 + 編譯內(nèi)核鏡像」。以下是通用編譯流程,適配大多數(shù) Android 設(shè)備(重點以 AOSP 通用內(nèi)核、高通 / 聯(lián)發(fā)科芯片為例)。

一、前置準(zhǔn)備

  1. 編譯環(huán)境要求
  • 系統(tǒng):Ubuntu 20.04/22.04(推薦,WSL2 也可,需解決 USB 和編譯依賴問題)
  • 硬件:至少 8GB 內(nèi)存(16GB+ 推薦)、50GB+ 磁盤空間(內(nèi)核源碼 + 工具鏈需大量存儲)
  • 依賴安裝:
# Ubuntu/Debian 系列
sudo apt update && sudo apt install -y \
  git curl wget flex bison gperf build-essential \
  zip unzip libncurses5-dev libncursesw5-dev \
  x11proto-core-dev libx11-dev libgl1-mesa-dev \
  libxml2-utils xsltproc zlib1g-dev libssl-dev \
  bc python3 python3-pip python3-dev \
  liblz4-tool libelf-dev dwarves clang lld
  1. 關(guān)鍵工具下載
    (1)Android NDK(推薦,替代單獨工具鏈)
    KernelSU 推薦使用 NDK r25c 或 r26b(兼容性最好):
# 下載 NDK r25c(64位 Linux)
wget https://dl.google.com/android/repository/android-ndk-r25c-linux.zip
unzip android-ndk-r25c-linux.zip -d ~/Android/
# 配置環(huán)境變量(臨時生效,永久生效需寫入 ~/.bashrc)
export NDK_PATH=~/Android/android-ndk-r25c

(2)KernelSU 源碼

git clone https://github.com/tiann/KernelSU.git
cd KernelSU
# 切換到穩(wěn)定分支(推薦 latest 或指定版本,如 v0.7.0)
git checkout latest

二、核心步驟:獲取設(shè)備內(nèi)核源碼

編譯 KernelSU 必須基于 你設(shè)備的對應(yīng)內(nèi)核源碼(內(nèi)核版本、配置需與設(shè)備一致,否則無法開機(jī)),常見獲取方式:
方式 1:官方開源內(nèi)核(優(yōu)先)

克隆Android通用內(nèi)核(適用于多數(shù)arm64機(jī)型)

git clone https://android.googlesource.com/kernel/common.git
該倉庫是 Android 通用內(nèi)核(ACK)的官方源碼,Redmi Note 13 5G 的內(nèi)核本質(zhì)也是基于此類通用內(nèi)核加硬件專屬驅(qū)動修改而來,可結(jié)合小米其他機(jī)型的內(nèi)核差異來補全適配。

如小米note13 源碼

image.png

方式 2:提取設(shè)備當(dāng)前內(nèi)核配置
如果找不到官方源碼,可先提取設(shè)備的內(nèi)核配置(用于后續(xù)編譯匹配):
1.設(shè)備已 root(臨時 root 即可,如 Magisk)
2.執(zhí)行以下命令提取配置:

# 手機(jī)端 adb 命令
adb pull /proc/config.gz ./  # 提取配置文件
gunzip config.gz -c > .config  # 解壓為 .config(后續(xù)編譯用)

方式 3:第三方內(nèi)核源碼(如 LineageOS 內(nèi)核)
如果官方未開源,可使用第三方適配的內(nèi)核源碼(需確保與設(shè)備型號、Android 版本匹配):

# 示例:LineageOS 通用內(nèi)核(需替換為設(shè)備對應(yīng)分支)
git clone https://github.com/LineageOS/android_kernel_google_msm.git
cd android_kernel_google_msm
git checkout lineage-21.0  # 對應(yīng) Android 14

三、集成 KernelSU 到內(nèi)核源碼

  1. 進(jìn)入內(nèi)核源碼目錄
cd /path/to/your/kernel_source  # 替換為你的內(nèi)核源碼路徑
  1. 應(yīng)用 KernelSU 補丁
    KernelSU 提供自動集成腳本,支持大多數(shù)內(nèi)核(3.18+ 版本,Android 10+ 推薦):
# 假設(shè) KernelSU 源碼在 ~/KernelSU
~/KernelSU/kernel/setup.sh self
  1. 配置 KernelSU 選項(可選)
    編輯內(nèi)核配置文件 .config,可自定義以下選項(通常默認(rèn)即可):
make menuconfig  # 打開圖形化配置界面
  • 找到 KernelSU 菜單:
  • Enable KernelSU:必須勾選(默認(rèn)已勾)
  • KernelSU Version:默認(rèn)自動獲取
  • SU File Path:默認(rèn) /system/xbin/su(無需修改)
  • Support Magic Mount:支持模塊掛載(默認(rèn)開啟)
    保存配置并退出(按 Esc → 選擇 Save → 回車 → Exit)。

四、編譯內(nèi)核鏡像

  1. 配置編譯環(huán)境變量
    根據(jù)設(shè)備架構(gòu)和內(nèi)核版本設(shè)置(關(guān)鍵!錯誤會導(dǎo)致編譯失?。?/li>
# 1. 設(shè)置目標(biāo)架構(gòu)(常見:arm64-v8a → ARCH=arm64;x86_64 → ARCH=x86_64)
export ARCH=arm64
# 2. 設(shè)置交叉編譯器(使用 NDK 內(nèi)置工具鏈)
# 這個命令末尾的 -(連字符)不是筆誤,而是交叉編譯器的「命名約定」 —— 核心原因是 CROSS_COMPILE 是「前綴」而非完整路徑,編譯器工具鏈的可執(zhí)行文件名稱會以這個前綴開頭,末尾的 - 是為了拼接工具名(如 gcc、ld、as 等)
export CROSS_COMPILE=$NDK_PATH/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
# 3. 設(shè)置編譯工具(可選,clang 編譯需添加)
export CC=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
export CLANG_TRIPLE=aarch64-linux-android-
# 4. 設(shè)置設(shè)備_defconfig(關(guān)鍵!替換為你設(shè)備的 defconfig)
# 示例:Pixel 6 → google/gs101_defconfig;小米 12 → vendor/xiaomi/sm8350_defconfig
DEFCONFIG=your_device_defconfig  # 替換為實際 defconfig 名稱
  1. 生成編譯配置
make O=out $DEFCONFIG  # O=out 指定輸出目錄為 out(避免污染源碼)
  • 如果之前已提取過設(shè)備 .config,可直接復(fù)制到 out 目錄:
cp /path/to/your/.config out/.config
  1. 開始編譯
# -j 后面是線程數(shù)(推薦 = CPU 核心數(shù) × 1.5,如 8 核 → -j12)
make O=out -j$(nproc)
  1. 編譯成功后的產(chǎn)物
    編譯完成后,在 out/arch/$ARCH/boot/ 目錄下生成內(nèi)核鏡像,常見格式:
  • Image.gz:通用壓縮鏡像
  • Image.lz4:LZ4 壓縮鏡像(部分設(shè)備使用)
  • boot.img:完整 boot 鏡像(部分內(nèi)核源碼支持直接生成)
  • dtbo.img:設(shè)備樹覆蓋鏡像(部分設(shè)備需要)

五、刷入設(shè)備(關(guān)鍵步驟)

編譯后的內(nèi)核鏡像需打包為 boot.img(或 init_boot.img,Android 13+ 部分設(shè)備使用),再刷入設(shè)備。

  1. 打包 boot.img(如果只生成 Image.gz)
    需要設(shè)備的原始 boot.img(可從官方 ROM 提取),使用 magiskboot 或 mkbootimg 打包:
# 1. 提取原始 boot.img 的 ramdisk 和 dtb
magiskboot unpack boot_original.img
# 2. 替換內(nèi)核鏡像(Image.gz 替換原 kernel)
cp out/arch/arm64/boot/Image.gz kernel
# 3. 重新打包
magiskboot repack boot_original.img boot_kernelsu.img
  1. 刷入設(shè)備
    1.設(shè)備解鎖 Bootloader(需提前解鎖,各品牌解鎖方式不同)
    2.進(jìn)入 Fastboot 模式:
adb reboot bootloader

3.刷入 boot.img:

fastboot flash boot boot_kernelsu.img
# 如果是 Android 13+ 且使用 init_boot.img:
# fastboot flash init_boot init_boot_kernelsu.img

4.重啟設(shè)備:

fastboot reboot

六、驗證 KernelSU 是否生效
1.設(shè)備重啟后,安裝 KernelSU 管理器(APK):

2.打開 APK:

  • 如果顯示「KernelSU 已激活」,說明編譯和刷入成功
  • 可嘗試授予 APP root 權(quán)限,驗證功能正常

常見問題排查

  1. 編譯報錯「undefined reference to xxx」
  • 原因:內(nèi)核版本與 KernelSU 不兼容( KernelSU 支持 3.18+ 內(nèi)核,優(yōu)先 Android 10+)
  • 解決:升級內(nèi)核源碼版本,或使用 KernelSU 對應(yīng)分支(如舊內(nèi)核用 legacy 分支)
  1. 編譯卡在「CC xxx.o」無響應(yīng)
  • 原因:內(nèi)存不足或線程數(shù)過多
  • 解決:減少 -j 線程數(shù)(如 make -j4),或增加交換分區(qū)(SWAP)
  1. 刷入后無法開機(jī)(卡在開機(jī) logo)
  • 原因:內(nèi)核配置與設(shè)備不匹配(defconfig 錯誤、驅(qū)動缺失)
  • 解決:
    a.確認(rèn) defconfig 是設(shè)備專用版本
    b.對比原始內(nèi)核的 .config 與編譯配置,補全缺失的驅(qū)動選項
    c.檢查內(nèi)核版本是否與設(shè)備 Android 版本兼容(如 Android 14 需內(nèi)核 5.4+)
  1. KernelSU 管理器顯示「未激活」
  • 原因:KernelSU 補丁未正確集成,或內(nèi)核鏡像未刷入成功
  • 解決:
    a.重新執(zhí)行 setup.sh 腳本,確保補丁應(yīng)用成功
    b.檢查編譯日志,確認(rèn) CONFIG_KERNELSU=y 已生效
    c.重新打包 boot.img,確保內(nèi)核鏡像替換正確
    參考資料

參考資料

如果遇到具體設(shè)備的編譯問題(如找不到 defconfig、芯片平臺特殊配置),可提供設(shè)備型號、Android 版本、內(nèi)核版本,進(jìn)一步細(xì)化步驟!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容