└── .github └── workflows └── Build KSU from ACK.yml /.github/workflows/Build KSU from ACK.yml: -------------------------------------------------------------------------------- 1 | name: Build KSU from ACK 2 | on: 3 | workflow_dispatch: 4 | inputs: 5 | TAG: 6 | required: true 7 | default: 'android15-6.6-2025-02' 8 | ENABLE_KSU: 9 | required: true 10 | type: boolean 11 | default: true 12 | description: 'Enable KernelSU' 13 | BUILD_AS_LKM: 14 | required: true 15 | type: boolean 16 | default: false 17 | description: 'Build KernelSU as LKM' 18 | 19 | jobs: 20 | build: 21 | name: Build ${{ inputs.TAG }} 22 | runs-on: ubuntu-latest 23 | env: 24 | CCACHE_COMPILERCHECK: "%compiler% -dumpmachine; %compiler% -dumpversion" 25 | CCACHE_NOHASHDIR: "true" 26 | CCACHE_HARDLINK: "true" 27 | steps: 28 | - name: Maximize Build Space 29 | uses: easimon/maximize-build-space@master 30 | with: 31 | swap-size-mb: 8192 32 | root-reserve-mb: 8192 33 | temp-reserve-mb: 2048 34 | remove-dotnet: 'true' 35 | remove-android: 'true' 36 | remove-haskell: 'true' 37 | remove-codeql: 'true' 38 | 39 | - name: Download Kernel Source 40 | run: | 41 | sudo apt-get remove firefox -y 42 | sudo apt-get update 43 | sudo apt-get upgrade -y 44 | sudo apt-get install repo -y 45 | cd $GITHUB_WORKSPACE 46 | git config --global user.name "YuKongA" 47 | git config --global user.email 70465933+YuKongA@users.noreply.github.com 48 | mkdir android-kernel && cd android-kernel 49 | repo init --depth=1 --u https://android.googlesource.com/kernel/manifest -b common-${{ inputs.TAG }} --repo-rev=v2.16 50 | REMOTE_BRANCH=$(git ls-remote https://android.googlesource.com/kernel/common ${{ inputs.TAG }}) 51 | DEFAULT_MANIFEST_PATH=.repo/manifests/default.xml 52 | if grep -q deprecated <<< $REMOTE_BRANCH; then 53 | echo "Found deprecated branch: ${{ inputs.TAG }}" 54 | sed -i 's/"${{ inputs.TAG }}"/"deprecated\/${{ inputs.TAG }}"/g' $DEFAULT_MANIFEST_PATH 55 | fi 56 | repo --trace sync -c -j$(nproc --all) --no-tags 57 | 58 | - name: Setup KernelSU 59 | if: inputs.ENABLE_KSU == true 60 | run: | 61 | cd $GITHUB_WORKSPACE 62 | git clone https://github.com/tiann/KernelSU.git 63 | cd $GITHUB_WORKSPACE/android-kernel 64 | echo "[+] KernelSU setup" 65 | GKI_ROOT=$(pwd) 66 | echo "[+] GKI_ROOT: $GKI_ROOT" 67 | echo "[+] Copy KernelSU driver to $GKI_ROOT/common/drivers" 68 | ln -sf $GITHUB_WORKSPACE/KernelSU/kernel $GKI_ROOT/common/drivers/kernelsu 69 | echo "[+] Add KernelSU driver to Makefile" 70 | DRIVER_MAKEFILE=$GKI_ROOT/common/drivers/Makefile 71 | DRIVER_KCONFIG=$GKI_ROOT/common/drivers/Kconfig 72 | grep -q "kernelsu" "$DRIVER_MAKEFILE" || printf "\nobj-\$(CONFIG_KSU) += kernelsu/\n" >> "$DRIVER_MAKEFILE" 73 | grep -q "kernelsu" "$DRIVER_KCONFIG" || sed -i "/endmenu/i\\source \"drivers/kernelsu/Kconfig\"" "$DRIVER_KCONFIG" 74 | echo "[+] Apply Compilation Patches" 75 | if [ ! -e build/build.sh ]; then 76 | GLIBC_VERSION=$(ldd --version 2>/dev/null | head -n 1 | awk '{print $NF}') 77 | echo "GLIBC_VERSION: $GLIBC_VERSION" 78 | if [ "$(printf '%s\n' "2.38" "$GLIBC_VERSION" | sort -V | head -n1)" = "2.38" ]; then 79 | echo "Patching resolve_btfids/Makefile" 80 | cd $GKI_ROOT/common/ && sed -i '/\$(Q)\$(MAKE) -C \$(SUBCMD_SRC) OUTPUT=\$(abspath \$(dir \$@))\/ \$(abspath \$@)/s//$(Q)$(MAKE) -C $(SUBCMD_SRC) EXTRA_CFLAGS="$(CFLAGS)" OUTPUT=$(abspath $(dir $@))\/ $(abspath $@)/' tools/bpf/resolve_btfids/Makefile || echo "No patch needed." 81 | fi 82 | fi 83 | echo "[+] KernelSU setup done." 84 | 85 | - name: Setup for LKM 86 | if: inputs.ENABLE_KSU == true && inputs.BUILD_AS_LKM == true 87 | working-directory: android-kernel 88 | run: | 89 | pip install ast-grep-cli 90 | sudo apt-get install llvm-15 -y 91 | ast-grep -U -p '$$$ check_exports($$$) {$$$}' -r '' common/scripts/mod/modpost.c 92 | ast-grep -U -p 'check_exports($$$);' -r '' common/scripts/mod/modpost.c 93 | sed -i '/config KSU/,/help/{s/default y/default m/}' common/drivers/kernelsu/Kconfig 94 | echo "drivers/kernelsu/kernelsu.ko" >> common/android/gki_aarch64_modules 95 | if [ ! -e build/build.sh ]; then 96 | sed -i 's/needs unknown symbol/Dont abort when unknown symbol/g' build/kernel/*.sh || echo "No unknown symbol scripts found" 97 | if [ -e common/modules.bzl ]; then 98 | sed -i 's/_COMMON_GKI_MODULES_LIST = \[/_COMMON_GKI_MODULES_LIST = \[ "drivers\/kernelsu\/kernelsu.ko",/g' common/modules.bzl 99 | fi 100 | else 101 | TARGET_FILE="build/kernel/build.sh" 102 | if [ ! -e "$TARGET_FILE" ]; then 103 | TARGET_FILE="build/build.sh" 104 | fi 105 | sed -i 's/needs unknown symbol/Dont abort when unknown symbol/g' $TARGET_FILE || echo "No unknown symbol in $TARGET_FILE" 106 | sed -i 's/if ! diff -u "\${KERNEL_DIR}\/\${MODULES_ORDER}" "\${OUT_DIR}\/modules\.order"; then/if false; then/g' $TARGET_FILE 107 | sed -i 's@${ROOT_DIR}/build/abi/compare_to_symbol_list@echo@g' $TARGET_FILE 108 | sed -i 's/needs unknown symbol/Dont abort when unknown symbol/g' build/kernel/*.sh || echo "No unknown symbol scripts found" 109 | fi 110 | 111 | - name: Symbol Magic 112 | if: inputs.ENABLE_KSU == true 113 | run: | 114 | echo "[+] Export all symbol from abi_gki_aarch64.xml" 115 | COMMON_ROOT=$GITHUB_WORKSPACE/android-kernel/common 116 | KSU_ROOT=$GITHUB_WORKSPACE/KernelSU 117 | ABI_XML=$COMMON_ROOT/android/abi_gki_aarch64.xml 118 | SYMBOL_LIST=$COMMON_ROOT/android/abi_gki_aarch64 119 | # python3 $KSU_ROOT/scripts/abi_gki_all.py $ABI_XML > $SYMBOL_LIST 120 | echo "[+] Add KernelSU symbols" 121 | cat $KSU_ROOT/kernel/export_symbol.txt | awk '{sub("[ \t]+","");print " "$0}' >> $SYMBOL_LIST 122 | 123 | - name: Remove protected symbols 124 | working-directory: android-kernel 125 | run: rm common/android/abi_gki_protected_exports_* || echo "No protected exports!" 126 | 127 | - name: Setup ccache 128 | uses: hendrikmuhs/ccache-action@v1.2 129 | with: 130 | key: gki-kernel-aarch64-${{ inputs.TAG }} 131 | max-size: 2G 132 | 133 | - name: Make working directory clean to avoid dirty 134 | working-directory: android-kernel 135 | run: cd common/ && git add -A && git commit -a -m "Add KernelSU" 136 | 137 | - name: Build Boot/LKM 138 | working-directory: android-kernel 139 | run: | 140 | if [ -e build/build.sh ]; then 141 | BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=Image AVB_SIGN_BOOT_IMG=1 AVB_BOOT_PARTITION_SIZE=$((64*1024*1024)) AVB_BOOT_ALGORITHM=SHA256_RSA2048 AVB_BOOT_KEY=prebuilts/kernel-build-tools/linux-x86/share/avb/testkey_rsa2048.pem BOOT_IMAGE_HEADER_VERSION=4 LTO=thin BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh CC="/usr/bin/ccache clang" || echo "COMPILE_KERNEL=false" >>$GITHUB_ENV 142 | else 143 | tools/bazel run --cache_dir=/home/runner/.cache/bazel --config=fast --config=stamp --lto=thin //common:kernel_aarch64_dist -- --dist_dir=dist || echo "COMPILE_KERNEL=false" >>$GITHUB_ENV 144 | fi 145 | 146 | - name: Prepare artifacts 147 | if: inputs.BUILD_AS_LKM == false 148 | run: | 149 | OUTDIR=android-kernel/out/*/dist 150 | if [ ! -e $OUTDIR ]; then 151 | OUTDIR=android-kernel/dist 152 | fi 153 | mkdir output 154 | cp $OUTDIR/boot.img ./output/ 155 | git clone https://github.com/YuKongA/AnyKernel3 156 | rm -rf ./AnyKernel3/.git 157 | cp $OUTDIR/Image ./AnyKernel3/ 158 | 159 | - name: Prepare artifacts 160 | if: inputs.ENABLE_KSU == true && inputs.BUILD_AS_LKM == true 161 | run: | 162 | mkdir lkm 163 | if [ ${{ env.COMPILE_KERNEL }} = "false" ]; then 164 | sudo apt-get install fd-find -y 165 | fdfind -e ko kernelsu -x cp -f {} ./lkm/ 166 | else 167 | OUTDIR=android-kernel/out/*/dist 168 | if [ ! -e $OUTDIR ]; then 169 | OUTDIR=android-kernel/dist 170 | fi 171 | cp $OUTDIR/kernelsu.ko ./lkm/ 172 | fi 173 | llvm-strip-15 -d ./lkm/kernelsu.ko 174 | 175 | - name: Upload Boot 176 | if: inputs.ENABLE_KSU == true && inputs.BUILD_AS_LKM == false 177 | uses: actions/upload-artifact@v4 178 | with: 179 | name: Boot_KernelSU_${{ inputs.TAG }} 180 | path: ./output/boot.img 181 | 182 | - name: Upload AnyKernel3 183 | if: inputs.ENABLE_KSU == true && inputs.BUILD_AS_LKM == false 184 | uses: actions/upload-artifact@v4 185 | with: 186 | name: AnyKernel3_KernelSU_${{ inputs.TAG }} 187 | path: ./AnyKernel3/* 188 | 189 | - name: Upload Boot 190 | if: inputs.ENABLE_KSU == false && inputs.BUILD_AS_LKM == false 191 | uses: actions/upload-artifact@v4 192 | with: 193 | name: Boot_Non-KernelSU_${{ inputs.TAG }} 194 | path: ./output/boot.img 195 | 196 | - name: Upload AnyKernel3 197 | if: inputs.ENABLE_KSU == false && inputs.BUILD_AS_LKM == false 198 | uses: actions/upload-artifact@v4 199 | with: 200 | name: AnyKernel3_Non-KernelSU_${{ inputs.TAG }} 201 | path: ./AnyKernel3/* 202 | 203 | - name: Upload LKM 204 | if: inputs.ENABLE_KSU == true && inputs.BUILD_AS_LKM == true 205 | uses: actions/upload-artifact@v4 206 | with: 207 | name: LKM_KernelSU_${{ inputs.TAG }} 208 | path: ./lkm/kernelsu.ko 209 | --------------------------------------------------------------------------------