feat: add KernelSU build workflow for Samsung A04 #1
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 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 }} |