diff --git a/scripts/build.sh b/scripts/build.sh
index 509177b..6612bd2 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -348,36 +348,71 @@ update_gapps_file_name() {
     GAPPS_PATH=$DOWNLOAD_DIR/$GAPPS_FILE_NAME
 }
 WSA_MAJOR_VER=0
+getKernelVersion() {
+    local bintype kernel_string kernel_version
+    bintype="$(file -b "$1")"
+    if [[ $bintype == *"version"* ]]; then
+        readarray -td '' kernel_string < <(awk '{ gsub(/, /,"\0"); print; }' <<<"$bintype, ")
+        unset 'kernel_string[-1]'
+        for i in "${kernel_string[@]}"; do
+            if [[ $i == *"version"* ]]; then
+                IFS=" " read -r -a kernel_string <<<"$i"
+                kernel_version="${kernel_string[1]}"
+            fi
+        done
+    else
+        IFS=" " read -r -a kernel_string <<<"$(strings "$1" | grep 'Linux version')"
+        kernel_version="${kernel_string[2]}"
+    fi
+    IFS=" " read -r -a arr <<<"${kernel_version//-/ }"
+    printf '%s' "${arr[0]}"
+}
 update_ksu_zip_name() {
     KERNEL_VER=""
-    case "$WSA_MAJOR_VER" in
-        "2305") KERNEL_VER="5.15.94.2" ;;
-        "2306") KERNEL_VER="5.15.104.1" ;;
-        "2307") KERNEL_VER="5.15.104.2" ;;
-        "2308") KERNEL_VER="5.15.104.3" ;;
-        "2309") KERNEL_VER="5.15.104.4" ;;
-        *) abort "KernelSU is not supported in this WSA version: $WSA_MAJOR_VER" ;;
-    esac
+    if [ -f "$WORK_DIR/wsa/$ARCH/Tools/kernel" ]; then
+        KERNEL_VER=$(getKernelVersion "$WORK_DIR/wsa/$ARCH/Tools/kernel")
+    fi
     KERNELSU_ZIP_NAME=kernelsu-$ARCH-$KERNEL_VER.zip
     KERNELSU_PATH=$DOWNLOAD_DIR/$KERNELSU_ZIP_NAME
     KERNELSU_INFO="$KERNELSU_PATH.info"
 }
+
 if [ -z ${OFFLINE+x} ]; then
+    echo "Generating WSA Download Links"
     require_su
     if [ "$DOWN_WSA" != "no" ]; then
-        echo "Generate Download Links"
         python3 generateWSALinks.py "$ARCH" "$RELEASE_TYPE" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort
-        # shellcheck disable=SC1090
-        source "$WSA_WORK_ENV" || abort
+        echo "Downloading WSA"
     else
-        echo "Generate Download Links"
         python3 generateWSALinks.py "$ARCH" "$RELEASE_TYPE" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$DOWN_WSA" || abort
-        WSA_MAJOR_VER=$(python3 getWSAMajorVersion.py "$ARCH" "$WSA_ZIP_PATH")
+        echo "Skip download WSA, downloading WSA depends"
     fi
-    if [[ "$WSA_MAJOR_VER" -lt 2211 ]]; then
-        ANDROID_API=32
+    if ! aria2c --no-conf --log-level=info --log="$DOWNLOAD_DIR/aria2_download.log" -x16 -s16 -j5 -c -R -m0 --async-dns=false --check-integrity=true --continue=true --allow-overwrite=true --conditional-get=true -d"$DOWNLOAD_DIR" -i"$DOWNLOAD_DIR/$DOWNLOAD_CONF_NAME"; then
+        echo "We have encountered an error while downloading files."
+        exit 1
     fi
-    if [ "$ROOT_SOL" = "magisk" ]; then
+    rm -f "${DOWNLOAD_DIR:?}/$DOWNLOAD_CONF_NAME"
+fi
+
+echo "Extract WSA"
+if [ -f "$WSA_ZIP_PATH" ]; then
+    if ! python3 extractWSA.py "$ARCH" "$WSA_ZIP_PATH" "$WORK_DIR" "$WSA_WORK_ENV"; then
+        CLEAN_DOWNLOAD_WSA=1
+        abort "Unzip WSA failed, is the download incomplete?"
+    fi
+    echo -e "Extract done\n"
+    # shellcheck disable=SC1090
+    source "$WSA_WORK_ENV" || abort
+else
+    echo "The WSA zip package does not exist, is the download incomplete?"
+    exit 1
+fi
+if [[ "$WSA_MAJOR_VER" -lt 2211 ]]; then
+    ANDROID_API=32
+fi
+if [ -z ${OFFLINE+x} ]; then
+    echo "Generating Download Links"
+    if [ "$HAS_GAPPS" ] || [ "$ROOT_SOL" = "magisk" ]; then
         if [ -z ${CUSTOM_MAGISK+x} ]; then
             python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort
         fi
@@ -395,18 +430,14 @@ if [ -z ${OFFLINE+x} ]; then
         python3 generateGappsLink.py "$ARCH" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_FILE_NAME" || abort
     fi
 
-    echo "Download Artifacts"
+    echo "Downloading Artifacts"
     if ! aria2c --no-conf --log-level=info --log="$DOWNLOAD_DIR/aria2_download.log" -x16 -s16 -j5 -c -R -m0 --async-dns=false --check-integrity=true --continue=true --allow-overwrite=true --conditional-get=true -d"$DOWNLOAD_DIR" -i"$DOWNLOAD_DIR/$DOWNLOAD_CONF_NAME"; then
         echo "We have encountered an error while downloading files."
         exit 1
     fi
 else # Offline mode
-    WSA_MAJOR_VER=$(python3 getWSAMajorVersion.py "$ARCH" "$WSA_ZIP_PATH")
-    if [[ "$WSA_MAJOR_VER" -lt 2211 ]]; then
-        ANDROID_API=32
-    fi
-    declare -A FILES_CHECK_LIST=([WSA_ZIP_PATH]="$WSA_ZIP_PATH" [xaml_PATH]="$xaml_PATH" [vclibs_PATH]="$vclibs_PATH" [UWPVCLibs_PATH]="$UWPVCLibs_PATH")
-    if [ "$ROOT_SOL" = "magisk" ]; then
+    declare -A FILES_CHECK_LIST=([xaml_PATH]="$xaml_PATH" [vclibs_PATH]="$vclibs_PATH" [UWPVCLibs_PATH]="$UWPVCLibs_PATH")
+    if [ "$HAS_GAPPS" ] || [ "$ROOT_SOL" = "magisk" ]; then
         FILES_CHECK_LIST+=(["MAGISK_PATH"]="$MAGISK_PATH")
     fi
     if [ "$ROOT_SOL" = "kernelsu" ]; then
@@ -430,20 +461,6 @@ else # Offline mode
     require_su
 fi
 
-echo "Extract WSA"
-if [ -f "$WSA_ZIP_PATH" ]; then
-    if ! python3 extractWSA.py "$ARCH" "$WSA_ZIP_PATH" "$WORK_DIR" "$WSA_WORK_ENV"; then
-        CLEAN_DOWNLOAD_WSA=1
-        abort "Unzip WSA failed, is the download incomplete?"
-    fi
-    echo -e "Extract done\n"
-    # shellcheck disable=SC1090
-    source "$WSA_WORK_ENV" || abort
-else
-    echo "The WSA zip package does not exist, is the download incomplete?"
-    exit 1
-fi
-
 if [ "$HAS_GAPPS" ] || [ "$ROOT_SOL" = "magisk" ]; then
     echo "Extract Magisk"
     if [ -f "$MAGISK_PATH" ]; then
@@ -479,10 +496,11 @@ if [ "$ROOT_SOL" = "magisk" ]; then
     "$WORK_DIR/magisk/magiskboot" cpio "$WORK_DIR/wsa/$ARCH/Tools/initrd.img" "mv /init /wsainit" "add 0750 /lspinit ../bin/$ARCH/lspinit" "ln /lspinit /init" "add 0750 /magiskinit $WORK_DIR/magisk/magiskinit" "mkdir 0750 overlay.d" "mkdir 0750 overlay.d/sbin" "add 0644 overlay.d/sbin/magisk64.xz $WORK_DIR/magisk/magisk64.xz" "add 0644 overlay.d/sbin/magisk32.xz $WORK_DIR/magisk/magisk32.xz" "add 0644 overlay.d/sbin/stub.xz $WORK_DIR/magisk/stub.xz" "mkdir 000 .backup" "add 000 .backup/.magisk $WORK_DIR/magisk/config" || abort "Unable to patch initrd"
     echo -e "Integrate Magisk done\n"
 elif [ "$ROOT_SOL" = "kernelsu" ]; then
-    update_ksu_zip_name
     echo "Extract KernelSU"
     # shellcheck disable=SC1090
     source "${KERNELSU_INFO:?}" || abort
+    echo "WSA Kernel Version: $KERNEL_VER"
+    echo "KernelSU Version: $KERNELSU_VER"
     if ! unzip "$KERNELSU_PATH" -d "$WORK_DIR/kernelsu"; then
         CLEAN_DOWNLOAD_KERNELSU=1
         abort "Unzip KernelSU failed, package is corrupted?"
diff --git a/scripts/generateKernelSULink.py b/scripts/generateKernelSULink.py
index 3c36bd9..a287809 100644
--- a/scripts/generateKernelSULink.py
+++ b/scripts/generateKernelSULink.py
@@ -27,6 +27,7 @@ import requests
 import json
 import re
 from pathlib import Path
+from packaging import version
 
 
 class Prop(OrderedDict):
@@ -53,20 +54,34 @@ tempScript = sys.argv[3]
 kernelVersion = sys.argv[4]
 file_name = sys.argv[5]
 abi_map = {"x64": "x86_64", "arm64": "arm64"}
-print(f"Generating KernelSU download link: arch={abi_map[arch]}, kernel version={kernelVersion}", flush=True)
-res = requests.get(f"https://api.github.com/repos/tiann/KernelSU/releases/latest")
+print(
+    f"Generating KernelSU download link: arch={abi_map[arch]}, kernel version={kernelVersion}", flush=True)
+res = requests.get(
+    f"https://api.github.com/repos/tiann/KernelSU/releases/latest")
 json_data = json.loads(res.content)
 headers = res.headers
 x_ratelimit_remaining = headers["x-ratelimit-remaining"]
+kernel_ver = 0
 if res.status_code == 200:
     link = ""
     assets = json_data["assets"]
     for asset in assets:
-        if re.match(f'kernel-WSA-{abi_map[arch]}-{kernelVersion}.*\.zip$', asset["name"]) and asset["content_type"] == "application/zip":
+        asset_name = asset["name"]
+        if re.match(f'kernel-WSA-{abi_map[arch]}-{kernelVersion}.*\.zip$', asset_name) and asset["content_type"] == "application/zip":
+            tmp_kernel_ver = re.search(
+                u'\d{1}.\d{1,}.\d{1,}.\d{1,}', asset_name.split("-")[3]).group()
+            if (kernel_ver == 0):
+                kernel_ver = tmp_kernel_ver
+            elif version.parse(kernel_ver) < version.parse(tmp_kernel_ver):
+                kernel_ver = tmp_kernel_ver
+    print(f"Kernel version: {kernel_ver}", flush=True)
+    for asset in assets:
+        if re.match(f'kernel-WSA-{abi_map[arch]}-{kernel_ver}.*\.zip$', asset["name"]) and asset["content_type"] == "application/zip":
             link = asset["browser_download_url"]
             break
     if link == "":
-        print(f"Error: No KernelSU release found for arch={abi_map[arch]}, kernel version={kernelVersion}", flush=True)
+        print(
+            f"Error: No KernelSU release found for arch={abi_map[arch]}, kernel version={kernelVersion}", flush=True)
         exit(1)
     release_name = json_data["name"]
     with open(os.environ['WSA_WORK_ENV'], 'r') as environ_file:
@@ -79,7 +94,8 @@ elif res.status_code == 403 and x_ratelimit_remaining == '0':
     print(f"Github API Error: {message}", flush=True)
     ratelimit_reset = headers["x-ratelimit-reset"]
     ratelimit_reset = datetime.fromtimestamp(int(ratelimit_reset))
-    print(f"The current rate limit window resets in {ratelimit_reset}", flush=True)
+    print(
+        f"The current rate limit window resets in {ratelimit_reset}", flush=True)
     exit(1)
 
 print(f"download link: {link}", flush=True)
diff --git a/scripts/generateWSALinks.py b/scripts/generateWSALinks.py
index 5286b5e..7692f1e 100644
--- a/scripts/generateWSALinks.py
+++ b/scripts/generateWSALinks.py
@@ -20,7 +20,6 @@
 
 import html
 import logging
-import os
 import re
 import sys
 
@@ -70,7 +69,8 @@ if ms_account_conf.is_file():
     with open(ms_account_conf, "r") as f:
         conf = Prop(f.read())
         user = conf.get('user_code')
-print(f"Generating WSA download link: arch={arch} release_type={release_name}\n", flush=True)
+print(
+    f"Generating WSA download link: arch={arch} release_type={release_name}\n", flush=True)
 with open(Path.cwd().parent / ("xml/GetCookie.xml"), "r") as f:
     cookie_content = f.read().format(user)
 
@@ -146,8 +146,9 @@ threads = []
 wsa_build_ver = 0
 for filename, values in identities.items():
     if re.match(f"MicrosoftCorporationII\.WindowsSubsystemForAndroid_.*\.msixbundle", filename):
-        tmp_wsa_build_ver = re.search(u'\d{4}.\d{5}.\d{1,}.\d{1,}', filename).group()
-        if(wsa_build_ver == 0):
+        tmp_wsa_build_ver = re.search(
+            u'\d{4}.\d{5}.\d{1,}.\d{1,}', filename).group()
+        if (wsa_build_ver == 0):
             wsa_build_ver = tmp_wsa_build_ver
         elif version.parse(wsa_build_ver) < version.parse(tmp_wsa_build_ver):
             wsa_build_ver = tmp_wsa_build_ver
@@ -162,25 +163,21 @@ for filename, values in identities.items():
         out_file_name = f"{values[1]}_{arch}.appx"
         out_file = download_dir / out_file_name
     elif not skip_wsa_download and re.match(f"MicrosoftCorporationII\.WindowsSubsystemForAndroid_.*\.msixbundle", filename):
-        tmp_wsa_build_ver = re.search(u'\d{4}.\d{5}.\d{1,}.\d{1,}', filename).group()
-        if(wsa_build_ver != tmp_wsa_build_ver):
+        tmp_wsa_build_ver = re.search(
+            u'\d{4}.\d{5}.\d{1,}.\d{1,}', filename).group()
+        if (wsa_build_ver != tmp_wsa_build_ver):
             continue
         version_splitted = wsa_build_ver.split(".")
         major_ver = version_splitted[0]
         minor_ver = version_splitted[1]
         build_ver = version_splitted[2]
         revision_ver = version_splitted[3]
-        with open(os.environ['WSA_WORK_ENV'], 'r') as environ_file:
-            env = Prop(environ_file.read())
-            env.WSA_VER = wsa_build_ver
-            env.WSA_MAJOR_VER = major_ver
-        with open(os.environ['WSA_WORK_ENV'], 'w') as environ_file:
-            environ_file.write(str(env))
         out_file_name = f"wsa-{release_type}.zip"
         out_file = download_dir / out_file_name
     else:
         continue
-    th = Thread(target=send_req, args=(values[0][0], values[0][1], out_file_name))
+    th = Thread(target=send_req, args=(
+        values[0][0], values[0][1], out_file_name))
     threads.append(th)
     th.daemon = True
     th.start()
diff --git a/scripts/getWSAMajorVersion.py b/scripts/getWSAMajorVersion.py
deleted file mode 100644
index f10ce26..0000000
--- a/scripts/getWSAMajorVersion.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/python3
-#
-# This file is part of MagiskOnWSALocal.
-#
-# MagiskOnWSALocal is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# MagiskOnWSALocal is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with MagiskOnWSALocal.  If not, see <https://www.gnu.org/licenses/>.
-#
-# Copyright (C) 2023 LSPosed Contributors
-#
-
-import sys
-
-import zipfile
-from pathlib import Path
-
-arch = sys.argv[1]
-
-zip_name = ""
-wsa_zip_path= Path(sys.argv[2])
-
-with zipfile.ZipFile(wsa_zip_path) as zip:
-    for f in zip.filelist:
-        if arch in f.filename.lower():
-            zip_name = f.filename
-            break
-ver_no = zip_name.split("_")
-long_ver = ver_no[1]
-ver = long_ver.split(".")
-major_ver = ver[0]
-print(major_ver)