Skip to content

.github/workflows/build-kernel.yml #5

.github/workflows/build-kernel.yml

.github/workflows/build-kernel.yml #5

Workflow file for this run

name: Build Kernel with KernelSU (Samsung A04s)
on:
workflow_dispatch:
inputs:
kernel_source:
description: 'Kernel source URL'
required: true
default: 'https://github.com/SavedByLight/android_kernel_samsung_a04s'
kernel_branch:
description: 'Kernel branch'
required: true
default: 'main'
kernelsu_tag:
description: 'KernelSU tag or "main" for latest'
required: false
default: 'main'
create_release:
description: 'Create GitHub Release'
required: false
default: false
type: boolean
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout build repo
uses: actions/checkout@v4
- name: Set up swap space
uses: pierotofy/set-swap-space@master
with:
swap-size-gb: 12
- name: Install build dependencies
run: |
sudo apt-get update -qq
sudo apt-get install -y --no-install-recommends \
bc bison build-essential ca-certificates cpio flex \
git kmod libelf-dev libssl-dev lz4 python3 \
zip unzip wget curl sed binutils-aarch64-linux-gnu \
crossbuild-essential-arm64 gcc-aarch64-linux-gnu \
gcc-arm-linux-gnueabi clang lld llvm
- name: Clone kernel source
run: |
echo "Cloning ${{ github.event.inputs.kernel_source }} @ ${{ github.event.inputs.kernel_branch }}"
git clone --depth=1 \
-b ${{ github.event.inputs.kernel_branch }} \
${{ github.event.inputs.kernel_source }} \
android-kernel
ls android-kernel/
- name: Detect kernel version
id: kver
run: |
VER=$(grep "^VERSION =" android-kernel/Makefile | awk '{print $3}')
PATCH=$(grep "^PATCHLEVEL =" android-kernel/Makefile | awk '{print $3}')
SUB=$(grep "^SUBLEVEL =" android-kernel/Makefile | awk '{print $3}')
echo "Detected kernel version: $VER.$PATCH.$SUB"
echo "version=$VER.$PATCH.$SUB" >> $GITHUB_OUTPUT
echo "major=$VER.$PATCH" >> $GITHUB_OUTPUT
- name: Fetch latest KernelSU version
id: ksu_info
run: |
TAG="${{ github.event.inputs.kernelsu_tag }}"
if [ "$TAG" = "main" ] || [ -z "$TAG" ]; then
LATEST=$(curl -s https://api.github.com/repos/tiann/KernelSU/releases/latest \
| grep '"tag_name"' | cut -d'"' -f4)
echo "Latest KernelSU: $LATEST"
echo "ksu_version=$LATEST" >> $GITHUB_OUTPUT
else
echo "ksu_version=$TAG" >> $GITHUB_OUTPUT
fi
- name: Integrate KernelSU
run: |
cd android-kernel
KSU_TAG="${{ steps.ksu_info.outputs.ksu_version }}"
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s "$KSU_TAG"
head -5 KernelSU/kernel/Makefile 2>/dev/null || head -5 drivers/kernelsu/Makefile 2>/dev/null
- name: Setup Clang 17
run: |
mkdir -p $HOME/toolchain/clang
wget -q \
https://github.com/ZyCromerZ/Clang/releases/download/17.0.0-20230725-release/Clang-17.0.0-x86_64.tar.gz \
-O /tmp/clang.tar.gz \
&& tar -xzf /tmp/clang.tar.gz -C $HOME/toolchain/clang/ \
&& rm /tmp/clang.tar.gz \
|| {
echo "Clang download failed, using system clang"
mkdir -p $HOME/toolchain/clang/bin
for b in clang clang++ ld.lld llvm-ar llvm-nm llvm-objcopy llvm-objdump llvm-strip; do
[ -f "/usr/bin/$b" ] && ln -sf "/usr/bin/$b" "$HOME/toolchain/clang/bin/$b"
done
}
echo "$HOME/toolchain/clang/bin" >> $GITHUB_PATH
- name: Apply GPU driver fix (MT6765)
run: |
TARGET=$(find android-kernel/drivers/gpu -name "mtk_mfgsys.c" 2>/dev/null | head -n 1)
if [ -n "$TARGET" ]; then
sed -i 's/PVRSRVGetDevicePowerState(ui32RGXDevIdx,/PVRSRVGetDevicePowerState(MTKGetRGXDevNode(),/g' "$TARGET"
sed -i 's/MTKWriteBackFreqToRGX(ui32RGXDevIdx,/MTKWriteBackFreqToRGX(MTKGetRGXDevNode(),/g' "$TARGET"
sed -i 's/PVRSRVDevicePostClockSpeedChange(ui32RGXDevIdx,/PVRSRVDevicePostClockSpeedChange(MTKGetRGXDevNode(),/g' "$TARGET"
sed -i 's/PVRSRVDevicePreClockSpeedChange(ui32RGXDevIdx,/PVRSRVDevicePreClockSpeedChange(MTKGetRGXDevNode(),/g' "$TARGET"
echo "GPU fix applied."
else
echo "mtk_mfgsys.c not found - skipping."
fi
- name: Configure kernel
run: |
cd android-kernel
export PATH=$HOME/toolchain/clang/bin:$PATH
DEFCONFIG=$(find arch/arm64/configs -name "*a04s*" -o -name "*a04*defconfig" 2>/dev/null | head -1 | xargs -r basename)
[ -z "$DEFCONFIG" ] && DEFCONFIG="a04_defconfig"
echo "Using defconfig: $DEFCONFIG"
echo "DEFCONFIG=$DEFCONFIG" >> $GITHUB_ENV
make O=out ARCH=arm64 CC=clang \
CLANG_TRIPLE=aarch64-linux-gnu- \
CROSS_COMPILE=aarch64-linux-gnu- \
"$DEFCONFIG"
sed -i 's/CONFIG_WERROR=y/CONFIG_WERROR=n/g' out/.config
scripts/config --file out/.config \
-e CONFIG_KSU \
-e CONFIG_KPROBES \
-e CONFIG_HAVE_KPROBES \
-e CONFIG_KPROBE_EVENTS \
-e CONFIG_OVERLAY_FS \
-e CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE \
-d CONFIG_KSU_DEBUG
scripts/config --file out/.config \
--set-str CONFIG_LOCALVERSION "-KSU-${{ steps.ksu_info.outputs.ksu_version }}" \
--disable CONFIG_LOCALVERSION_AUTO
scripts/config --file out/.config \
--disable CONFIG_DEBUG_INFO \
--disable CONFIG_DEBUG_INFO_SPLIT \
--disable CONFIG_DEBUG_INFO_REDUCED \
--disable CONFIG_DEBUG_INFO_DWARF4 \
--disable CONFIG_FTRACE \
--disable CONFIG_PROFILING \
--enable CONFIG_STRIP_ASM_SYMS \
--enable CONFIG_CC_OPTIMIZE_FOR_SIZE
make O=out ARCH=arm64 CC=clang \
CLANG_TRIPLE=aarch64-linux-gnu- \
CROSS_COMPILE=aarch64-linux-gnu- \
olddefconfig
- name: Compile kernel
run: |
cd android-kernel
export PATH=$HOME/toolchain/clang/bin:$PATH
make -j$(nproc --all) O=out ARCH=arm64 \
CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm \
OBJCOPY=llvm-objcopy STRIP=llvm-strip \
LLVM=1 LLVM_IAS=1 \
CLANG_TRIPLE=aarch64-linux-gnu- \
CROSS_COMPILE=aarch64-linux-gnu- \
CROSS_COMPILE_ARM32=arm-linux-gnueabi- \
KCFLAGS="-w" \
Image dtbs 2>&1 | tee $GITHUB_WORKSPACE/compile.log
if [ ! -f out/arch/arm64/boot/Image ]; then
echo "::error::Build failed - kernel Image not found!"
exit 1
fi
echo "Build successful! Size: $(du -h out/arch/arm64/boot/Image | cut -f1)"
- name: Collect DTBs
run: |
find android-kernel/out/arch/arm64/boot/dts -name "*.dtb" 2>/dev/null \
| sort | xargs cat > android-kernel/out/arch/arm64/boot/dtb.img 2>/dev/null || true
if [ -s android-kernel/out/arch/arm64/boot/dtb.img ]; then
echo "HAS_DTB=true" >> $GITHUB_ENV
echo "DTB size: $(du -h android-kernel/out/arch/arm64/boot/dtb.img | cut -f1)"
else
echo "HAS_DTB=false" >> $GITHUB_ENV
echo "No DTBs found."
fi
- name: Write anykernel.sh
run: |
mkdir -p $GITHUB_WORKSPACE/ak3out
python3 - <<'PYEOF'
import os
lines = [
"# AnyKernel3 Ramdisk Mod Script\n",
"# Samsung Galaxy A04s (SM-A047F) + KernelSU\n",
"properties() { '\n",
"kernel.string=Samsung A04s KernelSU Kernel\n",
"do.devicecheck=1\n",
"do.modules=0\n",
"do.systemless=1\n",
"do.cleanup=1\n",
"do.cleanuponabort=1\n",
"device.name1=a04s\n",
"device.name2=a047f\n",
"device.name3=SM-A047F\n",
"device.name4=a047fxxu\n",
"device.name5=a047x\n",
"supported.versions=12-14\n",
"supported.patchlevels=\n",
"'; }\n",
"block=auto;\n",
"is_slot_device=0;\n",
"ramdisk_compression=auto;\n",
"patch_vbmeta_flag=auto;\n",
". tools/ak3-core.sh;\n",
"split_boot;\n",
"if [ -f \"$AKHOME/dtb.img\" ]; then\n",
" flash_dtb;\n",
"fi\n",
"flash_boot;\n",
]
out = os.path.join(os.environ['GITHUB_WORKSPACE'], 'ak3out', 'anykernel.sh')
with open(out, 'w') as f:
f.writelines(lines)
print(f'Written: {out}')
PYEOF
- name: Package with AnyKernel3
run: |
git clone --depth=1 https://github.com/osm0sis/AnyKernel3 AnyKernel3
cd AnyKernel3
rm -rf .git .github *.md
cp $GITHUB_WORKSPACE/android-kernel/out/arch/arm64/boot/Image ./
cp $GITHUB_WORKSPACE/ak3out/anykernel.sh ./
if [ "$HAS_DTB" = "true" ]; then
cp $GITHUB_WORKSPACE/android-kernel/out/arch/arm64/boot/dtb.img ./
echo "DTB included."
fi
BUILD_DATE=$(date +%Y%m%d-%H%M)
KSU_VER="${{ steps.ksu_info.outputs.ksu_version }}"
ZIP_NAME="SamsungA04s-KernelSU-${KSU_VER}-${BUILD_DATE}.zip"
zip -r9 "$GITHUB_WORKSPACE/$ZIP_NAME" . -x '.git*'
echo "ZIP_NAME=$ZIP_NAME" >> $GITHUB_ENV
echo "Packaged $ZIP_NAME ($(du -h $GITHUB_WORKSPACE/$ZIP_NAME | cut -f1))"
- name: Verify zip contents
run: |
unzip -l "$GITHUB_WORKSPACE/$ZIP_NAME"
unzip -l "$GITHUB_WORKSPACE/$ZIP_NAME" | grep -q "Image" \
&& echo "Image present - OK" \
|| { echo "::error::Image missing from zip!"; exit 1; }
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.ZIP_NAME }}
path: ${{ env.ZIP_NAME }}
retention-days: 14
- name: Upload compile log on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: compile-log-${{ github.run_number }}
path: compile.log
- name: Create GitHub Release
if: github.event.inputs.create_release == 'true'
uses: softprops/action-gh-release@v2
with:
tag_name: ksu-${{ steps.ksu_info.outputs.ksu_version }}-build${{ github.run_number }}
name: KernelSU ${{ steps.ksu_info.outputs.ksu_version }} - Samsung A04s
body: |
## Samsung A04s (SM-A047F) Kernel + KernelSU
| | |
|---|---|
| **KernelSU version** | `${{ steps.ksu_info.outputs.ksu_version }}` |
| **Kernel version** | `${{ steps.kver.outputs.version }}` |
| **Kernel source** | [SavedByLight/android_kernel_samsung_a04s](https://github.com/SavedByLight/android_kernel_samsung_a04s) |
| **Branch** | `${{ github.event.inputs.kernel_branch }}` |
| **Build** | `#${{ github.run_number }}` |
### Flash instructions
1. Boot into TWRP / OrangeFox
2. Flash the ZIP
3. Reboot to system
4. Install KernelSU Manager APK from https://github.com/tiann/KernelSU/releases
5. Open Manager - status should show Working
> Built via GitHub Actions
files: ${{ env.ZIP_NAME }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}