Build SukiSU Ultra for OnePlus 12 #8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build Sunos OnePlus_Kernel | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| CPU: | |
| description: "分支" | |
| required: true | |
| default: 'kplatform' | |
| FEIL: | |
| description: "配置文件" | |
| required: true | |
| default: 'default' | |
| CPUD: | |
| description: "处理器代号" | |
| required: true | |
| default: 'pineapple' | |
| ANDROID_VERSION: | |
| description: "内核安卓版本" | |
| required: true | |
| default: 'android14' | |
| KERNEL_VERSION: | |
| description: "内核版本" | |
| required: true | |
| default: '6.1' | |
| KERNEL_NAME: | |
| description: "修改内核名称" | |
| required: true | |
| default: '-android14-11-o-g1132d864665d' | |
| kernelsu_variant: | |
| description: "选择 KSU" | |
| required: true | |
| type: choice | |
| options: | |
| - Kernel | |
| - KSU_Next | |
| default: KSU_Next | |
| kernelsu_version: | |
| description: "选择 KSU 版本" | |
| required: true | |
| type: choice | |
| options: | |
| - without ksu | |
| - tag | |
| - main | |
| default: main | |
| SUSFS_ENABLED: | |
| description: "添加 SUSFS" | |
| required: true | |
| type: boolean | |
| default: true | |
| VFS_patch_ENABLED: | |
| description: "添加vfs补丁(新钩子)?" | |
| required: true | |
| type: choice | |
| options: | |
| - enable | |
| - disable | |
| default: enable | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Maximize build space | |
| uses: easimon/maximize-build-space@master | |
| with: | |
| root-reserve-mb: 8192 | |
| temp-reserve-mb: 2048 | |
| remove-dotnet: 'true' | |
| remove-android: 'true' | |
| remove-haskell: 'true' | |
| remove-codeql: 'true' | |
| - name: Configure Git | |
| run: | | |
| git config --global user.name "ychenxuan" | |
| git config --global user.email "3494167979@qq.com" | |
| - name: Install dependencies | |
| run: | | |
| set -e | |
| sudo apt update && sudo apt upgrade -y | |
| sudo apt install -y python3 git curl lld llvm libelf-dev dwarves patch build-essential flex bison libssl-dev bc | |
| - name: Install repo tool | |
| run: | | |
| set -e | |
| curl -fsSL https://storage.googleapis.com/git-repo-downloads/repo > ~/repo | |
| chmod a+x ~/repo | |
| sudo mv ~/repo /usr/local/bin/repo | |
| - name: Initialize repo and sync | |
| run: | | |
| set -e | |
| echo "📥 初始化内核源码..." | |
| mkdir -p kernel_workspace && cd kernel_workspace | |
| if [ ! -d "kernel_platform" ]; then | |
| git clone https://github.com/Jaslovecam/android_kernel_oneplus_sm8650.git kernel_platform | |
| fi | |
| cd kernel_platform | |
| git reset --hard | |
| git clean -fd | |
| # 清理可能存在的脏标记 | |
| if [ -f "scripts/setlocalversion" ]; then | |
| sed -i 's/ -dirty//g' scripts/setlocalversion | |
| fi | |
| echo "✅ 源码初始化完成" | |
| - name: "⚡ Setup KernelSU Next" | |
| run: | | |
| set -e | |
| cd kernel_workspace/kernel_platform | |
| echo "🛠️ 正在设置KernelSU Next..." | |
| # 备份原KernelSU目录(如果存在) | |
| if [ -d "KernelSU-Next" ]; then | |
| rm -rf KernelSU-Next.backup | |
| mv KernelSU-Next KernelSU-Next.backup | |
| fi | |
| # 下载并设置KernelSU | |
| if curl -LSs "https://raw.githubusercontent.com/pershoot/KernelSU-Next/next-susfs/kernel/setup.sh" | bash -s next-susfs; then | |
| if [ -d "KernelSU-Next" ]; then | |
| cd KernelSU-Next | |
| # 使用git命令获取commit计数,更稳定 | |
| KSU_VERSION=$(git rev-list --count HEAD 2>/dev/null || echo "11998") | |
| KSU_VERSION=$((KSU_VERSION + 10200)) | |
| echo "KSUVER=$KSU_VERSION" >> $GITHUB_ENV | |
| # 更新Makefile中的版本号 | |
| if [ -f "kernel/Makefile" ]; then | |
| sed -i "s/DKSU_VERSION=11998/DKSU_VERSION=${KSU_VERSION}/" kernel/Makefile | |
| fi | |
| echo "✅ KernelSU Next 配置完成 - 版本: $KSU_VERSION" | |
| else | |
| echo "❌ KernelSU目录未创建,使用默认版本" | |
| echo "KSUVER=11998" >> $GITHUB_ENV | |
| fi | |
| else | |
| echo "⚠️ KernelSU设置脚本执行失败,使用默认版本" | |
| echo "KSUVER=11998" >> $GITHUB_ENV | |
| fi | |
| - name: Apply SUSFS Patches | |
| if: ${{ (github.event.inputs.kernelsu_variant == 'KSU_Next') && github.event.inputs.SUSFS_ENABLED == 'true' }} | |
| run: | | |
| set -e | |
| cd kernel_workspace/kernel_platform | |
| echo "🔧 应用SUSFS补丁..." | |
| # 克隆补丁仓库 | |
| if [ ! -d "../susfs4ksu" ]; then | |
| git clone https://gitlab.com/simonpunk/susfs4ksu.git -b gki-${{ github.event.inputs.ANDROID_VERSION }}-${{ github.event.inputs.KERNEL_VERSION }} ../susfs4ksu || echo "⚠️ SUSFS仓库克隆失败,但继续执行" | |
| fi | |
| if [ ! -d "../kernel_patches" ]; then | |
| git clone https://github.com/cabagekiller/kernel_patches.git ../kernel_patches || echo "⚠️ 补丁仓库克隆失败,但继续执行" | |
| fi | |
| PATCH_FILE="../susfs4ksu/kernel_patches/50_add_susfs_in_gki-${{ github.event.inputs.ANDROID_VERSION }}-${{ github.event.inputs.KERNEL_VERSION }}.patch" | |
| if [ -f "$PATCH_FILE" ]; then | |
| echo "📋 找到SUSFS补丁文件: $(basename $PATCH_FILE)" | |
| # 备份原文件 | |
| cp "$PATCH_FILE" ./ | |
| # 尝试应用补丁 | |
| if patch -p1 --forward --dry-run < "$(basename $PATCH_FILE)" >/dev/null 2>&1; then | |
| echo "✅ 补丁检查通过,开始应用..." | |
| patch -p1 < "$(basename $PATCH_FILE)" | |
| echo "✅ SUSFS补丁应用成功" | |
| else | |
| echo "⚠️ 补丁可能已应用或存在冲突,跳过应用" | |
| fi | |
| # 复制相关文件 | |
| if [ -d "../susfs4ksu/kernel_patches/fs" ]; then | |
| mkdir -p fs | |
| cp -r ../susfs4ksu/kernel_patches/fs/* fs/ 2>/dev/null || true | |
| fi | |
| if [ -d "../susfs4ksu/kernel_patches/include/linux" ]; then | |
| mkdir -p include/linux | |
| cp -r ../susfs4ksu/kernel_patches/include/linux/* include/linux/ 2>/dev/null || true | |
| fi | |
| else | |
| echo "❌ SUSFS补丁文件未找到: $PATCH_FILE" | |
| echo "但继续执行构建流程..." | |
| fi | |
| - name: Apply Hide Stuff Patches | |
| if: ${{ github.event.inputs.SUSFS_ENABLED == 'true' }} | |
| run: | | |
| set -e | |
| cd kernel_workspace/kernel_platform | |
| echo "🎭 应用隐藏补丁..." | |
| if [ -f "../kernel_patches/69_hide_stuff.patch" ]; then | |
| cp "../kernel_patches/69_hide_stuff.patch" ./ | |
| if patch -p1 --forward --dry-run < "69_hide_stuff.patch" >/dev/null 2>&1; then | |
| echo "✅ 隐藏补丁检查通过,开始应用..." | |
| patch -p1 -F 3 < "69_hide_stuff.patch" | |
| echo "✅ 隐藏补丁应用成功" | |
| else | |
| echo "⚠️ 隐藏补丁可能已应用或存在冲突,跳过" | |
| fi | |
| else | |
| echo "⚠️ 隐藏补丁文件未找到,跳过" | |
| fi | |
| - name: Apply New Hooks Patches | |
| if: ${{ github.event.inputs.VFS_patch_ENABLED == 'enable' }} | |
| run: | | |
| set -e | |
| cd kernel_workspace/kernel_platform | |
| echo "🔗 应用VFS补丁..." | |
| if [ -f "../kernel_patches/next/syscall64_hooks.patch" ]; then | |
| cp "../kernel_patches/next/syscall64_hooks.patch" ./ | |
| if patch -p1 --forward --dry-run < "syscall64_hooks.patch" >/dev/null 2>&1; then | |
| echo "✅ VFS补丁检查通过,开始应用..." | |
| patch -p1 -F 3 < "syscall64_hooks.patch" | |
| echo "✅ VFS补丁应用成功" | |
| else | |
| echo "⚠️ VFS补丁可能已应用或存在冲突,跳过" | |
| fi | |
| else | |
| echo "⚠️ VFS补丁文件未找到,跳过" | |
| fi | |
| - name: Add SUSFS Configuration Settings | |
| run: | | |
| set -e | |
| cd kernel_workspace/kernel_platform | |
| echo "⚙️ 配置SUSFS设置..." | |
| CONFIG_FILE="./arch/arm64/configs/gki_defconfig" | |
| if [ ! -f "$CONFIG_FILE" ]; then | |
| echo "❌ 配置文件不存在: $CONFIG_FILE" | |
| exit 1 | |
| fi | |
| # 备份原配置 | |
| cp "$CONFIG_FILE" "${CONFIG_FILE}.backup" | |
| # 定义配置数组 | |
| declare -A configs=( | |
| ["CONFIG_KSU"]="y" | |
| ["CONFIG_KSU_SUSFS"]="y" | |
| ["CONFIG_KSU_SUSFS_HAS_MAGIC_MOUNT"]="y" | |
| ["CONFIG_KSU_SUSFS_SUS_PATH"]="y" | |
| ["CONFIG_KSU_SUSFS_SUS_MOUNT"]="y" | |
| ["CONFIG_KSU_SUSFS_AUTO_ADD_SUS_KSU_DEFAULT_MOUNT"]="y" | |
| ["CONFIG_KSU_SUSFS_AUTO_ADD_SUS_BIND_MOUNT"]="y" | |
| ["CONFIG_KSU_SUSFS_SUS_KSTAT"]="y" | |
| ["CONFIG_KSU_SUSFS_SUS_OVERLAYFS"]="y" | |
| ["CONFIG_KSU_SUSFS_TRY_UMOUNT"]="y" | |
| ["CONFIG_KSU_SUSFS_AUTO_ADD_TRY_UMOUNT_FOR_BIND_MOUNT"]="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_SU"]="n" | |
| ["CONFIG_KSU_WITH_KPROBES"]="n" | |
| ["CONFIG_COMPAT"]="y" | |
| ["CONFIG_KSU_VFS"]="y" | |
| ["CONFIG_TMPFS_XATTR"]="y" | |
| ) | |
| # 更新配置 | |
| for key in "${!configs[@]}"; do | |
| value="${configs[$key]}" | |
| # 删除现有配置 | |
| grep -v "^$key=" "$CONFIG_FILE" > "${CONFIG_FILE}.tmp" || true | |
| # 添加新配置 | |
| echo "$key=$value" >> "${CONFIG_FILE}.tmp" | |
| mv "${CONFIG_FILE}.tmp" "$CONFIG_FILE" | |
| echo "✅ 设置 $key=$value" | |
| done | |
| # 移除defconfig检查(如果存在) | |
| if [ -f "./build.config.gki" ]; then | |
| sed -i '2s/check_defconfig//' ./build.config.gki || true | |
| fi | |
| echo "✅ SUSFS配置完成" | |
| - name: Add make name | |
| run: | | |
| set -e | |
| cd kernel_workspace/kernel_platform | |
| echo "🏷️ 设置构建名称..." | |
| # 修改setlocalversion脚本 | |
| if [ -f "./scripts/setlocalversion" ]; then | |
| sed -i 's/check_defconfig//' ./build.config.gki 2>/dev/null || true | |
| sed -i 's/-dirty//' ./scripts/setlocalversion | |
| # 在版本字符串后添加标识 | |
| if grep -q 'echo "\$res"' ./scripts/setlocalversion; then | |
| sed -i 's|echo "\$res"|echo "\$res-Cabage"|' ./scripts/setlocalversion | |
| fi | |
| fi | |
| echo "✅ 构建名称设置完成" | |
| - name: Build kernel | |
| run: | | |
| set -e | |
| cd kernel_workspace/kernel_platform | |
| echo "🔨 开始内核构建..." | |
| # 创建输出目录 | |
| mkdir -p out | |
| # 检查必要的工具 | |
| echo "📋 检查构建工具..." | |
| which clang || { echo "❌ clang未安装"; exit 1; } | |
| which llvm-ar || { echo "❌ llvm工具链不完整"; exit 1; } | |
| # 步骤1: 基础配置 | |
| echo "步骤1: 基础配置..." | |
| if ! make ARCH=arm64 CC=clang LLVM=1 LLVM_IAS=1 O=out gki_defconfig 2>&1 | tee out/config.log; then | |
| echo "❌ 基础配置失败" | |
| tail -50 out/config.log | |
| exit 1 | |
| fi | |
| # 步骤2: 应用vendor配置(如果存在) | |
| if [ -f "vendor/pineapple_GKI.config" ]; then | |
| echo "步骤2: 应用vendor配置..." | |
| if ! make ARCH=arm64 CC=clang LLVM=1 LLVM_IAS=1 O=out vendor/pineapple_GKI.config 2>&1 | tee -a out/config.log; then | |
| echo "❌ Vendor配置失败" | |
| tail -50 out/config.log | |
| exit 1 | |
| fi | |
| fi | |
| # 步骤3: 最终配置确认 | |
| echo "步骤3: 最终配置确认..." | |
| if ! make ARCH=arm64 CC=clang LLVM=1 LLVM_IAS=1 O=out olddefconfig 2>&1 | tee -a out/config.log; then | |
| echo "❌ 最终配置失败" | |
| tail -50 out/config.log | |
| exit 1 | |
| fi | |
| # 步骤4: 构建内核 | |
| echo "步骤4: 开始内核编译..." | |
| start_time=$(date +%s) | |
| if make ARCH=arm64 CC=clang LLVM=1 LLVM_IAS=1 -j$(nproc --all) O=out 2>&1 | tee out/build.log; then | |
| end_time=$(date +%s) | |
| duration=$((end_time - start_time)) | |
| echo "✅ 内核构建成功! 耗时: ${duration}秒" | |
| # 检查生成的Image文件 | |
| if [ -f "out/arch/arm64/boot/Image" ]; then | |
| echo "✅ 内核镜像生成成功" | |
| ls -lh out/arch/arm64/boot/Image | |
| else | |
| echo "❌ 内核镜像未生成" | |
| exit 1 | |
| fi | |
| else | |
| echo "❌ 内核构建失败" | |
| echo "最后100行构建日志:" | |
| tail -100 out/build.log | |
| exit 1 | |
| fi | |
| # 步骤5: 安装模块 | |
| echo "步骤5: 安装内核模块..." | |
| mkdir -p Kernel_Prebuilts | |
| if make ARCH=arm64 CC=clang LLVM=1 LLVM_IAS=1 -j$(nproc --all) O=out modules_install INSTALL_MOD_PATH=./Kernel_Prebuilts 2>&1 | tee out/modules.log; then | |
| echo "✅ 模块安装成功" | |
| else | |
| echo "⚠️ 模块安装失败,但继续执行" | |
| fi | |
| - name: Set Timestamp and Variables | |
| id: timestamp | |
| run: | | |
| set -e | |
| CURRENT_TIMESTAMP=$(date +'%Y-%m-%d_%H-%M-%S') | |
| echo "CURRENT_TIMESTAMP=$CURRENT_TIMESTAMP" >> $GITHUB_ENV | |
| echo "ROOT_DIR_PREFIX=${{ github.event.inputs.CPU }}-${{ github.event.inputs.CPUD }}" >> $GITHUB_ENV | |
| echo "CONFIG_NAME=${{ github.event.inputs.FEIL }}" >> $GITHUB_ENV | |
| echo "DEVICE_NAME=${{ github.event.inputs.CPUD }}" >> $GITHUB_ENV | |
| echo "📅 时间戳: $CURRENT_TIMESTAMP" | |
| echo "📁 构建标识: ${{ github.event.inputs.CPU }}-${{ github.event.inputs.CPUD }}" | |
| - name: Prepare and Package AnyKernel3 | |
| run: | | |
| set -e | |
| cd $GITHUB_WORKSPACE | |
| echo "📦 准备AnyKernel3包..." | |
| # 检查内核镜像是否存在 | |
| if [ ! -f "kernel_workspace/kernel_platform/out/arch/arm64/boot/Image" ]; then | |
| echo "❌ 内核镜像未找到!" | |
| ls -la kernel_workspace/kernel_platform/out/arch/arm64/boot/ || true | |
| exit 1 | |
| fi | |
| # 克隆AnyKernel3 | |
| if [ ! -d "AnyKernel3" ]; then | |
| git clone https://github.com/cabagekiller/AnyKernel3.git -b gki-2.0 --depth=1 AnyKernel3 | |
| fi | |
| # 清理AnyKernel3目录 | |
| rm -rf AnyKernel3/.git AnyKernel3/README.md AnyKernel3/LICENSE | |
| # 复制内核镜像 | |
| echo "📁 复制内核镜像..." | |
| cp kernel_workspace/kernel_platform/out/arch/arm64/boot/Image AnyKernel3/ | |
| # 创建版本信息文件 | |
| cat > AnyKernel3/version-info.txt << EOF | |
| 构建信息: | |
| 设备: ${{ github.event.inputs.CPUD }} | |
| 分支: ${{ github.event.inputs.CPU }} | |
| 配置: ${{ github.event.inputs.FEIL }} | |
| Android版本: ${{ github.event.inputs.ANDROID_VERSION }} | |
| 内核版本: ${{ github.event.inputs.KERNEL_VERSION }} | |
| KernelSU版本: ${{ env.KSUVER }} | |
| 构建时间: ${{ env.CURRENT_TIMESTAMP }} | |
| KernelSU变体: ${{ github.event.inputs.kernelsu_variant }} | |
| SUSFS启用: ${{ github.event.inputs.SUSFS_ENABLED }} | |
| VFS补丁: ${{ github.event.inputs.VFS_patch_ENABLED }} | |
| EOF | |
| # 设置ZIP文件名 | |
| ZIP_FILENAME="AnyKernel3-Image_${DEVICE_NAME}_KSU-${KSUVER}_${CONFIG_NAME}_${CURRENT_TIMESTAMP}.zip" | |
| echo "ZIP_FILENAME=${ZIP_FILENAME}" >> $GITHUB_ENV | |
| # 创建ZIP包 | |
| echo "🗜️ 创建ZIP包: ${ZIP_FILENAME}" | |
| cd AnyKernel3 | |
| zip -r9 "../${ZIP_FILENAME}" . -x "*.git*" "*.md" "*.txt" "*.zip" | |
| cd .. | |
| # 验证ZIP包 | |
| if [ -f "${ZIP_FILENAME}" ]; then | |
| echo "✅ ZIP包创建成功" | |
| echo "文件大小: $(du -h ${ZIP_FILENAME} | cut -f1)" | |
| echo "ZIP内容:" | |
| unzip -l "${ZIP_FILENAME}" | head -20 | |
| else | |
| echo "❌ ZIP包创建失败" | |
| exit 1 | |
| fi | |
| env: | |
| KSUVER: ${{ env.KSUVER }} | |
| CURRENT_TIMESTAMP: ${{ env.CURRENT_TIMESTAMP }} | |
| CONFIG_NAME: ${{ env.CONFIG_NAME }} | |
| DEVICE_NAME: ${{ env.DEVICE_NAME }} | |
| - name: Create Release | |
| id: create_release | |
| uses: softprops/action-gh-release@v1 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| with: | |
| files: ${{ env.ZIP_FILENAME }} | |
| tag_name: release-${{ env.CURRENT_TIMESTAMP }} | |
| name: "Build ${{ env.DEVICE_NAME }} - ${{ env.CURRENT_TIMESTAMP }}" | |
| body: | | |
| # 内核构建发布 | |
| ## 构建信息 | |
| - **设备**: ${{ github.event.inputs.CPUD }} | |
| - **分支**: ${{ github.event.inputs.CPU }} | |
| - **配置**: ${{ github.event.inputs.FEIL }} | |
| - **Android版本**: ${{ github.event.inputs.ANDROID_VERSION }} | |
| - **内核版本**: ${{ github.event.inputs.KERNEL_VERSION }} | |
| ## KernelSU 信息 | |
| - **KernelSU变体**: ${{ github.event.inputs.kernelsu_variant }} | |
| - **KernelSU版本**: ${{ env.KSUVER }} | |
| - **SUSFS启用**: ${{ github.event.inputs.SUSFS_ENABLED }} | |
| - **VFS补丁**: ${{ github.event.inputs.VFS_patch_ENABLED }} | |
| ## 构建详情 | |
| - **构建时间**: ${{ env.CURRENT_TIMESTAMP }} | |
| - **构建标识**: ${{ env.ROOT_DIR_PREFIX }} | |
| ### 包含的功能 | |
| ✅ KernelSU Next 集成 | |
| ${{ github.event.inputs.SUSFS_ENABLED == 'true' && '✅ SUSFS 支持' || '❌ SUSFS 不支持' }} | |
| ${{ github.event.inputs.VFS_patch_ENABLED == 'enable' && '✅ VFS 补丁' || '❌ VFS 补丁' }} | |
| ## 使用说明 | |
| 1. 下载对应的AnyKernel3 ZIP包 | |
| 2. 通过自定义Recovery刷入 | |
| 3. 重启设备 | |
| > **注意**: 刷机前请备份重要数据 | |
| draft: false | |
| prerelease: false | |
| if: success() |