name: Build Android OnePlus SM8650 Kernel on: workflow_dispatch: inputs: enable_bbr: description: "Enable BBR TCP Congestion Control" required: false default: "true" type: boolean enable_zram: description: "Enable ZRAM support" required: false default: "true" type: boolean zram_algorithm: description: "ZRAM compression algorithm" required: false default: "lz4" type: choice options: - lz4 - zstd kernel_name: description: "Custom kernel name (optional)" required: false default: "CustomKernel" type: string jobs: build-kernel: runs-on: ubuntu-latest env: ARCH: arm64 SUBARCH: arm64 steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install dependencies and update GCC run: | sudo apt-get update sudo apt-get install -y \ bc bison build-essential cpio curl flex \ git libncurses-dev libssl-dev \ libelf-dev lzop python3 unzip xz-utils \ zstd rsync ca-certificates wget \ pahole dwarves zip # 安装更新的GCC以满足内核版本要求 sudo apt-get install -y gcc-9 g++-9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90 # 验证GCC版本 gcc --version - name: Setup directory structure run: | # 创建与本地一致的目录结构 mkdir -p $GITHUB_WORKSPACE/kernel/toolchains mkdir -p $GITHUB_WORKSPACE/kernel/source mkdir -p $GITHUB_WORKSPACE/kernel/anykernel3 mkdir -p $GITHUB_WORKSPACE/kernel/output echo "=== Created directory structure ===" ls -la $GITHUB_WORKSPACE/kernel/ - name: Setup toolchains run: | cd $GITHUB_WORKSPACE/kernel echo "=== 下载 ARM GCC 工具链 ===" # 下载ARM GCC工具链 git clone --depth=1 \ https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9.git \ ./toolchains/gcc-arm-4.9 echo "=== 下载 Clang 工具链 ===" # 创建 Clang 目录 mkdir -p ./toolchains/clang-14 # 下载 Clang 工具链 cd toolchains wget -q https://github.com/ZyCromerZ/Clang/releases/download/14.0.6-20240212-release/Clang-14.0.6-20240212.tar.gz # 检查下载是否成功 if [ ! -f "Clang-14.0.6-20240212.tar.gz" ]; then echo "Error: Clang 工具链下载失败" exit 1 fi echo "=== 解压 Clang 工具链 ===" # 解压到 clang-14 目录 tar -xzf Clang-14.0.6-20240212.tar.gz -C clang-14 # 检查解压后的目录结构 echo "=== 检查解压后的目录结构 ===" ls -la clang-14/ # 如果存在嵌套目录,需要调整 if [ -d "clang-14/Clang-14.0.6-20240212" ]; then echo "检测到嵌套目录,正在调整..." mv clang-14/Clang-14.0.6-20240212/* clang-14/ rmdir clang-14/Clang-14.0.6-20240212 fi # 清理下载的压缩包 rm -f Clang-14.0.6-20240212.tar.gz # 返回 kernel 目录 cd $GITHUB_WORKSPACE/kernel echo "=== 验证工具链二进制文件 ===" # 验证关键工具存在 echo "检查 Clang 二进制文件..." if [ -f "./toolchains/clang-14/bin/clang" ]; then echo "✓ clang 存在" ls -la ./toolchains/clang-14/bin/clang else echo "✗ clang 不存在,检查目录结构:" find ./toolchains/clang-14 -name "clang" -type f 2>/dev/null || echo "未找到 clang 二进制文件" exit 1 fi echo "检查 aarch64-linux-gnu 工具..." if ls ./toolchains/clang-14/bin/aarch64-linux-gnu-* 1> /dev/null 2>&1; then echo "✓ aarch64-linux-gnu 工具存在" ls -la ./toolchains/clang-14/bin/aarch64-linux-gnu-* | head -3 else echo "✗ aarch64-linux-gnu 工具不存在" fi echo "检查 LLVM 工具..." if ls ./toolchains/clang-14/bin/llvm-* 1> /dev/null 2>&1; then echo "✓ LLVM 工具存在" ls -la ./toolchains/clang-14/bin/llvm-* | head -3 else echo "✗ LLVM 工具不存在" fi echo "检查 ARM GCC 工具..." if ls ./toolchains/gcc-arm-4.9/bin/arm-linux-androideabi-* 1> /dev/null 2>&1; then echo "✓ ARM GCC 工具存在" ls -la ./toolchains/gcc-arm-4.9/bin/arm-linux-androideabi-* | head -3 else echo "✗ ARM GCC 工具不存在" fi echo "=== 最终目录结构 ===" echo "kernel/" ls -la ./ echo "kernel/toolchains/" ls -la ./toolchains/ echo "工具链设置完成 ===" - name: Clone kernel source run: | cd $GITHUB_WORKSPACE/kernel git clone --depth=1 \ https://github.com/crdroidandroid/android_kernel_oneplus_sm8650.git \ ./source/android_kernel_oneplus_sm8650 echo "=== 内核源码目录结构 ===" echo "kernel/source/" ls -la ./source/ - name: Clone AnyKernel3 run: | cd $GITHUB_WORKSPACE/kernel git clone --depth=1 https://github.com/osm0sis/AnyKernel3.git ./anykernel3 echo "=== AnyKernel3 目录结构 ===" ls -la ./anykernel3/ - name: Copy config to kernel source run: | cd $GITHUB_WORKSPACE/kernel if [ -f "$GITHUB_WORKSPACE/config" ]; then cp $GITHUB_WORKSPACE/config ./source/android_kernel_oneplus_sm8650/myconfig echo "Custom config copied" else echo "Error: config file not found!" exit 1 fi - name: Copy and configure kernel config run: | cd $GITHUB_WORKSPACE/kernel if [ -f "$GITHUB_WORKSPACE/config" ]; then cp $GITHUB_WORKSPACE/config ./source/android_kernel_oneplus_sm8650/myconfig else echo "Error: config file not found!" exit 1 fi cd source/android_kernel_oneplus_sm8650 # Configure BBR if enabled if [ "${{ inputs.enable_bbr }}" = "true" ]; then echo "=== Enabling BBR TCP Congestion Control ===" cat >> myconfig << EOF # BBR TCP Congestion Control CONFIG_TCP_CONG_ADVANCED=y CONFIG_TCP_CONG_BBR=y CONFIG_DEFAULT_TCP_CONG="bbr" CONFIG_DEFAULT_BBR=y # CONFIG_DEFAULT_CUBIC is not set # CONFIG_DEFAULT_RENO is not set EOF fi # Configure ZRAM if enabled if [ "${{ inputs.enable_zram }}" = "true" ]; then echo "=== Enabling ZRAM with ${{ inputs.zram_algorithm }} compression ===" cat >> myconfig << EOF # ZRAM Support CONFIG_ZRAM=y CONFIG_ZRAM_DEF_COMP_LZ4=y CONFIG_ZRAM_WRITEBACK=y CONFIG_ZRAM_MEMORY_TRACKING=y CONFIG_ZSMALLOC=y CONFIG_ZSMALLOC_STAT=y EOF # Configure compression algorithm if [ "${{ inputs.zram_algorithm }}" = "zstd" ]; then cat >> myconfig << EOF CONFIG_CRYPTO_ZSTD=y CONFIG_ZRAM_DEF_COMP="zstd" CONFIG_ZRAM_DEF_COMP_ZSTD=y # CONFIG_ZRAM_DEF_COMP_LZ4 is not set EOF else cat >> myconfig << EOF CONFIG_CRYPTO_LZ4=y CONFIG_CRYPTO_LZ4HC=y CONFIG_ZRAM_DEF_COMP="lz4" CONFIG_ZRAM_DEF_COMP_LZ4=y EOF fi fi echo "=== Configuration Summary ===" echo "BBR Enabled: ${{ inputs.enable_bbr }}" echo "ZRAM Enabled: ${{ inputs.enable_zram }}" echo "ZRAM Algorithm: ${{ inputs.zram_algorithm }}" - name: Install SukiSU‑Ultra run: | # 1. 下载并切换内核目录 cd $GITHUB_WORKSPACE/kernel/source/android_kernel_oneplus_sm8650 export KCONFIG_CONFIG=myconfig # 2. 集成 SukiSU-Ultra curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s main echo "✅ 完成 SukiSU‑Ultra(配置:$KCONFIG_CONFIG)" - name: Build kernel run: | cd $GITHUB_WORKSPACE/kernel/source/android_kernel_oneplus_sm8650 # 记录开始时间 starttime=$(date +'%Y-%m-%d %H:%M:%S') echo "Build started at: $starttime" # 设置环境变量(与你本地脚本完全一致) export ARCH=arm64 export SUBARCH=arm64 export KCONFIG_CONFIG=$PWD/myconfig # 设置工具链路径变量(使用相对路径匹配你的本地环境) CLANG_PATH=$GITHUB_WORKSPACE/kernel/toolchains/clang-14/bin GCC_ARM_PATH=$GITHUB_WORKSPACE/kernel/toolchains/gcc-arm-4.9/bin # 验证所有必需的工具 echo "=== Verifying required tools ===" $CLANG_PATH/clang --version | head -2 $CLANG_PATH/aarch64-linux-gnu-gcc --version | head -1 || echo "aarch64-linux-gnu-gcc not found" $GCC_ARM_PATH/arm-linux-androideabi-gcc --version | head -1 test -f $CLANG_PATH/ld.lld && echo "ld.lld found" || echo "ld.lld not found" gcc --version | head -1 echo "================================" # 清理构建目录 rm -rf out mkdir -p out # 生成默认 config(与你本地脚本完全一致) make O=out KCONFIG_CONFIG=$KCONFIG_CONFIG olddefconfig # 检查 BBR 是否已启用 if [ "${{ inputs.enable_bbr }}" = "true" ]; then echo "=== 验证 BBR 配置 ===" grep -i bbr out/.config || echo "BBR 未在最终配置中找到" fi # 编译内核(与你本地脚本完全一致的参数) make -j$(nproc) O=out WERROR=0 \ KCFLAGS="-Wno-error=frame-larger-than= -O3 -pipe" \ KCPPFLAGS="-DCONFIG_CC_OPTIMIZE_FOR_PERFORMANCE" \ HOSTCFLAGS="-O3 -pipe" \ HOSTCXXFLAGS="-O3 -pipe" \ NM=$CLANG_PATH/llvm-nm \ OBJCOPY=$CLANG_PATH/llvm-objcopy \ LD=$CLANG_PATH/ld.lld \ CROSS_COMPILE=$CLANG_PATH/aarch64-linux-gnu- \ CROSS_COMPILE_ARM32=$GCC_ARM_PATH/arm-linux-androideabi- \ CC=$CLANG_PATH/clang \ AR=$CLANG_PATH/llvm-ar \ OBJDUMP=$CLANG_PATH/llvm-objdump \ STRIP=$CLANG_PATH/llvm-strip \ 2>&1 | tee out/error.log # 记录结束时间 endtime=$(date +'%Y-%m-%d %H:%M:%S') echo "Build finished at: $endtime" - name: Check build results run: | cd $GITHUB_WORKSPACE/kernel/source/android_kernel_oneplus_sm8650 echo "=== Build Results ===" if [ -f "out/arch/arm64/boot/Image" ]; then echo "✅ Kernel build successful!" ls -la out/arch/arm64/boot/ echo "Image size: $(du -h out/arch/arm64/boot/Image)" # 检查是否有DTB文件 if ls out/arch/arm64/boot/dts/*/*.dtb 2>/dev/null; then echo "DTB files found:" ls -la out/arch/arm64/boot/dts/*/*.dtb | head -5 fi else echo "❌ Kernel build failed!" echo "=== Last 100 lines of error log ===" tail -100 out/error.log echo "=== Error summary ===" grep -i "error\|failed\|stop" out/error.log | tail -10 exit 1 fi - name: Prepare AnyKernel3 package run: | cd $GITHUB_WORKSPACE/kernel # 设置内核名称 KERNEL_NAME="${{ inputs.kernel_name }}" if [ -z "$KERNEL_NAME" ]; then KERNEL_NAME="CustomKernel" fi # 获取内核版本信息 cd source/android_kernel_oneplus_sm8650 KERNEL_VERSION=$(make kernelversion 2>/dev/null || echo "unknown") BUILD_DATE=$(date +'%Y%m%d_%H%M') cd $GITHUB_WORKSPACE/kernel echo "=== 准备 AnyKernel3 打包 ===" echo "内核名称: $KERNEL_NAME" echo "内核版本: $KERNEL_VERSION" echo "构建日期: $BUILD_DATE" # 复制 AnyKernel3 模板到输出目录 cp -r anykernel3/* output/ # 复制内核文件 cp source/android_kernel_oneplus_sm8650/out/arch/arm64/boot/Image output/ # 修改 AnyKernel3 配置 cd output # 备份原始 anykernel.sh cp anykernel.sh anykernel.sh.bak # 自定义 anykernel.sh 配置 cat > anykernel.sh << 'EOF' ### AnyKernel3 Ramdisk Mod Script ## osm0sis @ xda-developers ### AnyKernel setup # global properties properties() { ' kernel.string=Wild Plus Kernel by TheWildJames or Morgan Weedman do.devicecheck=0 do.modules=0 do.systemless=0 do.cleanup=1 do.cleanuponabort=0 device.name1=corvette device.name2=PJX110 device.name3= device.name4= device.name5= supported.versions= supported.patchlevels= supported.vendorpatchlevels= '; } # end properties ### AnyKernel install ## boot shell variables block=boot is_slot_device=auto ramdisk_compression=auto patch_vbmeta_flag=auto no_magisk_check=1 # import functions/variables and setup patching - see for reference (DO NOT REMOVE) . tools/ak3-core.sh kernel_version=$(cat /proc/version | awk -F '-' '{print $1}' | awk '{print $3}') case $kernel_version in 5.1*) ksu_supported=true ;; 6.1*) ksu_supported=true ;; 6.6*) ksu_supported=true ;; *) ksu_supported=false ;; esac ui_print " " " -> ksu_supported: $ksu_supported" $ksu_supported || abort " -> Non-GKI device, abort." # boot install if [ -L "/dev/block/bootdevice/by-name/init_boot_a" -o -L "/dev/block/by-name/init_boot_a" ]; then split_boot # for devices with init_boot ramdisk flash_boot # for devices with init_boot ramdisk else dump_boot # use split_boot to skip ramdisk unpack, e.g. for devices with init_boot ramdisk write_boot # use flash_boot to skip ramdisk repack, e.g. for devices with init_boot ramdisk fi ## end boot install EOF # 创建更新信息文件 cat > kernel_info.txt << EOF Kernel Name: $KERNEL_NAME Kernel Version: $KERNEL_VERSION Build Date: $BUILD_DATE BBR Enabled: ${{ inputs.enable_bbr }} Compiler: Clang 14.0.6 Target Device: OnePlus ACE3 Pro(SM8650) Architecture: ARM64 EOF echo "=== AnyKernel3 准备完成 ===" ls -la ./ - name: Create AnyKernel3 ZIP package run: | cd $GITHUB_WORKSPACE/kernel/output # 设置包名 KERNEL_NAME="${{ inputs.kernel_name }}" if [ -z "$KERNEL_NAME" ]; then KERNEL_NAME="CustomKernel" fi BUILD_DATE=$(date +'%Y%m%d_%H%M') BBR_SUFFIX="" if [ "${{ inputs.enable_bbr }}" = "true" ]; then BBR_SUFFIX="_BBR" fi ZIP_NAME="${KERNEL_NAME}${BBR_SUFFIX}_${BUILD_DATE}.zip" echo "=== 创建 ZIP 包: $ZIP_NAME ===" # 创建 ZIP 包 zip -r9 "$ZIP_NAME" * -x "*.bak" # 验证 ZIP 包 if [ -f "$ZIP_NAME" ]; then echo "✅ ZIP 包创建成功!" echo "包名: $ZIP_NAME" echo "大小: $(du -h "$ZIP_NAME")" # 显示 ZIP 包内容 echo "=== ZIP 包内容 ===" unzip -l "$ZIP_NAME" | head -20 else echo "❌ ZIP 包创建失败!" exit 1 fi # 保存包名供后续步骤使用 echo "ZIP_NAME=$ZIP_NAME" >> $GITHUB_ENV - name: Upload build artifacts uses: actions/upload-artifact@v4 if: always() with: name: kernel-build-${{ github.run_number }} path: | kernel/source/android_kernel_oneplus_sm8650/out/arch/arm64/boot/Image* kernel/source/android_kernel_oneplus_sm8650/out/arch/arm64/boot/dts/*/*.dtb kernel/source/android_kernel_oneplus_sm8650/out/error.log kernel/source/android_kernel_oneplus_sm8650/out/.config kernel/output/*.zip kernel/output/kernel_info.txt - name: Upload AnyKernel3 ZIP uses: actions/upload-artifact@v4 if: success() with: name: ${{ env.ZIP_NAME }} path: kernel/output/${{ env.ZIP_NAME }} retention-days: 30