chore: add CODEOWNERS #14
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 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: | | ||
| KERNEL_DIR="$GITHUB_WORKSPACE/android-kernel" | ||
| echo "Cloning into $KERNEL_DIR" | ||
| git clone --depth=1 \ | ||
| -b ${{ github.event.inputs.kernel_branch }} \ | ||
| ${{ github.event.inputs.kernel_source }} \ | ||
| "$KERNEL_DIR" | ||
| echo "KERNEL_DIR=$KERNEL_DIR" >> $GITHUB_ENV | ||
| echo "OUT_DIR=$KERNEL_DIR/out" >> $GITHUB_ENV | ||
| ls "$KERNEL_DIR/" | ||
| - name: Fix kernel script permissions | ||
| run: | | ||
| find "$KERNEL_DIR/scripts" -type f \( -name "*.sh" -o -name "gcc-version*" -o -name "clang-*" -o -name "lld-*" -o -name "gcc-plugin*" -o -name "link-vmlinux*" -o -name "mkcompile_h" \) -exec chmod +x {} \; | ||
| find "$KERNEL_DIR/scripts" -type f ! -name "*.c" ! -name "*.h" ! -name "*.py" ! -name "*.txt" ! -name "Makefile" -exec chmod +x {} \; | ||
| echo "Script permissions fixed." | ||
| - name: Patch Mali GPU Kconfig | ||
| run: | | ||
| # Samsung Exynos kernels ship a Mali GPU Kconfig that uses | ||
| # 'depends on' with a shell-expansion syntax unsupported by | ||
| # the host kconfig parser, causing "syntax error" at lines 27-29. | ||
| # Fix: comment out the two broken 'depends on' lines. | ||
| MALI_KCONFIG="$KERNEL_DIR/drivers/gpu/arm/Kconfig" | ||
| if [ -f "$MALI_KCONFIG" ]; then | ||
| echo "Patching $MALI_KCONFIG" | ||
| # Replace lines that call shell commands inside 'depends on' with a safe stub | ||
| sed -i 's/^\(\s*depends on\s*\$(shell.*\)/# \1/' "$MALI_KCONFIG" | ||
| # Also handle bare shell() calls in source lines | ||
| sed -i '/^source.*\$(shell/d' "$MALI_KCONFIG" | ||
| echo "Mali Kconfig patched." | ||
| else | ||
| echo "Mali Kconfig not found at expected path, searching..." | ||
| find "$KERNEL_DIR/drivers/gpu" -name "Kconfig" | xargs grep -l 'shell' 2>/dev/null | while read f; do | ||
| sed -i 's/^\(\s*depends on\s*\$(shell.*\)/# \1/' "$f" | ||
| sed -i '/^source.*\$(shell/d' "$f" | ||
| echo "Patched: $f" | ||
| done | ||
| fi | ||
| - name: Detect kernel version | ||
| id: kver | ||
| run: | | ||
| VER=$(grep "^VERSION =" "$KERNEL_DIR/Makefile" | awk '{print $3}') | ||
| PATCH=$(grep "^PATCHLEVEL =" "$KERNEL_DIR/Makefile" | awk '{print $3}') | ||
| SUB=$(grep "^SUBLEVEL =" "$KERNEL_DIR/Makefile" | awk '{print $3}') | ||
| echo "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 "$KERNEL_DIR" | ||
| 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: Configure kernel | ||
| run: | | ||
| cd "$KERNEL_DIR" | ||
| 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_DIR" 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_DIR/.config" | ||
| scripts/config --file "$OUT_DIR/.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_DIR/.config" \ | ||
| --set-str CONFIG_LOCALVERSION "-KSU-${{ steps.ksu_info.outputs.ksu_version }}" \ | ||
| --disable CONFIG_LOCALVERSION_AUTO | ||
| scripts/config --file "$OUT_DIR/.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_DIR" ARCH=arm64 CC=clang \ | ||
| CLANG_TRIPLE=aarch64-linux-gnu- \ | ||
| CROSS_COMPILE=aarch64-linux-gnu- \ | ||
| olddefconfig | ||
| - name: Compile kernel | ||
| run: | | ||
| cd "$KERNEL_DIR" | ||
| export PATH=$HOME/toolchain/clang/bin:$PATH | ||
| make -j$(nproc --all) O="$OUT_DIR" 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_DIR/arch/arm64/boot/Image" ]; then | ||
| echo "::error::Build failed - kernel Image not found!" | ||
| exit 1 | ||
| fi | ||
| echo "Build successful! Size: $(du -h $OUT_DIR/arch/arm64/boot/Image | cut -f1)" | ||
| - name: Collect DTBs | ||
| run: | | ||
| find "$OUT_DIR/arch/arm64/boot/dts" -name "*.dtb" 2>/dev/null \ | ||
| | sort | xargs cat > "$OUT_DIR/arch/arm64/boot/dtb.img" 2>/dev/null || true | ||
| if [ -s "$OUT_DIR/arch/arm64/boot/dtb.img" ]; then | ||
| echo "HAS_DTB=true" >> $GITHUB_ENV | ||
| echo "DTB size: $(du -h $OUT_DIR/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 $GITHUB_WORKSPACE/AnyKernel3 | ||
| cd $GITHUB_WORKSPACE/AnyKernel3 | ||
| rm -rf .git .github *.md | ||
| cp "$OUT_DIR/arch/arm64/boot/Image" ./ | ||
| cp $GITHUB_WORKSPACE/ak3out/anykernel.sh ./ | ||
| if [ "$HAS_DTB" = "true" ]; then | ||
| cp "$OUT_DIR/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 }} | ||