Skip to content

feat: add KernelSU build workflow for Samsung A04 #1

feat: add KernelSU build workflow for Samsung A04

feat: add KernelSU build workflow for Samsung A04 #1

Workflow file for this run

name: Build Kernel with KernelSU (Samsung A04)
on:
workflow_dispatch:
inputs:
kernel_source:
description: 'Kernel source URL'
required: true
default: 'https://github.com/rsuntkOrgs/kernel_samsung_wingtech'
kernel_branch:
description: 'Kernel branch'
required: true
default: 'a045x'
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
push:
branches: [main]
paths:
- '.github/workflows/build-kernel.yml'
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 wget curl sed binutils-aarch64-linux-gnu \
crossbuild-essential-arm64 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
- name: Fetch KernelSU version info
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 "KernelSU latest release: $LATEST"
echo "ksu_version=$LATEST" >> $GITHUB_OUTPUT
else
echo "ksu_version=$TAG" >> $GITHUB_OUTPUT
fi
- name: Integrate KernelSU via setup.sh
run: |
cd android-kernel
KSU_TAG=${{ steps.ksu_info.outputs.ksu_version }}
echo "Integrating KernelSU $KSU_TAG ..."
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s "$KSU_TAG"
# Verify
echo "KernelSU integrated:"
head -5 KernelSU/kernel/Makefile || head -5 drivers/kernelsu/Makefile
- name: Setup Clang toolchain
run: |
mkdir -p $HOME/toolchain/clang
# Use a stable Clang from ZyCromerZ (proven for MT6765 / 4.19)
wget -q --show-progress \
https://github.com/ZyCromerZ/Clang/releases/download/14.0.6-20220902-full/Clang-14.0.6-x86_64.tar.gz \
-O /tmp/clang.tar.gz || {
echo "ZyCromerZ Clang download failed, falling back to system clang"
mkdir -p $HOME/toolchain/clang/bin
ln -sf /usr/bin/clang $HOME/toolchain/clang/bin/clang
ln -sf /usr/bin/ld.lld $HOME/toolchain/clang/bin/ld.lld
for t in /usr/bin/llvm-*; do [ -f "$t" ] && ln -sf "$t" $HOME/toolchain/clang/bin/; done
exit 0
}
tar -xzf /tmp/clang.tar.gz -C $HOME/toolchain/clang/
rm /tmp/clang.tar.gz
echo "$HOME/toolchain/clang/bin" >> $GITHUB_PATH
- name: Apply GPU driver fix (MT6765)
run: |
cd android-kernel
TARGET=$(find drivers/gpu -name "mtk_mfgsys.c" 2>/dev/null | head -n 1)
if [ -n "$TARGET" ]; then
echo "Applying GPU fix to $TARGET"
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 GPU fix."
fi
- name: Configure kernel
run: |
cd android-kernel
export PATH=$HOME/toolchain/clang/bin:$PATH
# Find defconfig
DEFCONFIG=$(find arch/arm64/configs -name "a04*defconfig" -o -name "*a045*" 2>/dev/null | head -1 | xargs basename)
if [ -z "$DEFCONFIG" ]; then
DEFCONFIG="a04_defconfig"
fi
echo "Using defconfig: $DEFCONFIG"
make O=out ARCH=arm64 $DEFCONFIG
# Disable Werror to avoid upstream warnings killing the build
sed -i 's/CONFIG_WERROR=y/CONFIG_WERROR=n/g' out/.config
# KernelSU — enable + keep KPROBES on for 4.19 non-GKI hook method
scripts/config --file out/.config \
-e CONFIG_KSU \
-e CONFIG_KPROBES \
-e CONFIG_HAVE_KPROBES \
-e CONFIG_OVERLAY_FS \
-e CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE
# Build identity
scripts/config --file out/.config \
--set-str CONFIG_LOCALVERSION "-KSU-${{ steps.ksu_info.outputs.ksu_version }}" \
--disable CONFIG_LOCALVERSION_AUTO
# Strip debug info to shrink image size
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
echo "Configuration done."
- 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 2>&1 | tee $GITHUB_WORKSPACE/compile.log
if [ ! -f out/arch/arm64/boot/Image ]; then
echo "::error::Kernel Image not found after build!"
exit 1
fi
SIZE=$(du -h out/arch/arm64/boot/Image | cut -f1)
echo "Kernel Image size: $SIZE"
- 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 ./
cat > anykernel.sh << 'AKEOF'
properties() {
kernel.string=Samsung A04 + KernelSU
do.devicecheck=1
do.modules=0
do.cleanup=1
do.cleanuponabort=1
device.name1=a04
device.name2=a045f
device.name3=SM-A045F
device.name4=a045x
supported.versions=12-14
}
block=auto
is_slot_device=0
. tools/ak3-core.sh
split_boot
flash_boot
AKEOF
BUILD_DATE=$(date +%Y%m%d-%H%M)
KSU_VER=${{ steps.ksu_info.outputs.ksu_version }}
ZIP_NAME="SamsungA04-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: 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 A04"
body: |
## Samsung A04 (SM-A045F) Kernel + KernelSU
| | |
|---|---|
| **KernelSU version** | `${{ steps.ksu_info.outputs.ksu_version }}` |
| **Kernel source** | `${{ github.event.inputs.kernel_source }}` |
| **Branch** | `${{ github.event.inputs.kernel_branch }}` |
| **Build number** | `#${{ github.run_number }}` |
### Flash instructions
1. Boot into TWRP / OrangeFox recovery
2. Flash the ZIP
3. Install **KernelSU Manager APK** from the [KernelSU releases page](https://github.com/tiann/KernelSU/releases)
> Built automatically via GitHub Actions
files: ${{ env.ZIP_NAME }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}