mirror of
https://github.com/Dichgrem/GKI-build.git
synced 2025-12-16 21:52:00 -05:00
503 lines
17 KiB
YAML
503 lines
17 KiB
YAML
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: 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/
|
||
|
||
# 如果存在 Image.gz,也复制它
|
||
if [ -f "source/android_kernel_oneplus_sm8650/out/arch/arm64/boot/Image.gz" ]; then
|
||
cp source/android_kernel_oneplus_sm8650/out/arch/arm64/boot/Image.gz output/
|
||
fi
|
||
|
||
# 复制 DTB 文件(如果存在)
|
||
if ls source/android_kernel_oneplus_sm8650/out/arch/arm64/boot/dts/*/*.dtb 2>/dev/null; then
|
||
mkdir -p output/dtbs
|
||
cp source/android_kernel_oneplus_sm8650/out/arch/arm64/boot/dts/*/*.dtb output/dtbs/
|
||
echo "DTB files copied to dtbs/"
|
||
fi
|
||
|
||
# 修改 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
|
||
# begin properties
|
||
properties() { '
|
||
kernel.string=
|
||
do.devicecheck=1
|
||
do.modules=0
|
||
do.systemless=1
|
||
do.cleanup=1
|
||
do.cleanuponabort=0
|
||
device.name1=OnePlus12
|
||
device.name2=OP594DL1
|
||
device.name3=PJD110
|
||
device.name4=
|
||
device.name5=
|
||
supported.versions=
|
||
supported.patchlevels=
|
||
'; } # end properties
|
||
|
||
# shell variables
|
||
block=/dev/block/bootdevice/by-name/boot;
|
||
is_slot_device=1;
|
||
ramdisk_compression=auto;
|
||
patch_vbmeta_flag=auto;
|
||
|
||
## AnyKernel methods (DO NOT CHANGE)
|
||
# import patching functions/variables - see for reference
|
||
. tools/ak3-core.sh;
|
||
|
||
## AnyKernel file attributes
|
||
# set permissions/ownership for included ramdisk files
|
||
set_perm_recursive 0 0 755 644 $ramdisk/*;
|
||
set_perm_recursive 0 0 750 750 $ramdisk/init* $ramdisk/sbin;
|
||
|
||
## AnyKernel install
|
||
dump_boot;
|
||
|
||
# begin ramdisk changes
|
||
|
||
# end ramdisk changes
|
||
|
||
write_boot;
|
||
## end 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 12 (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
|