mirror of
https://github.com/LSPosed/MagiskOnWSALocal.git
synced 2025-09-01 10:10:07 +00:00
Support integrate KernelSU (#403)
* Support integrate KernelSU * Fix zip MIME type * Better print
This commit is contained in:
parent
4a04f98a08
commit
fa79cc8480
5 changed files with 158 additions and 47 deletions
|
@ -80,6 +80,10 @@ clean_download() {
|
||||||
if [ "$CLEAN_DOWNLOAD_GAPPS" ]; then
|
if [ "$CLEAN_DOWNLOAD_GAPPS" ]; then
|
||||||
rm -f "${GAPPS_PATH:?}"
|
rm -f "${GAPPS_PATH:?}"
|
||||||
fi
|
fi
|
||||||
|
if [ "$CLEAN_DOWNLOAD_KERNELSU" ]; then
|
||||||
|
rm -f "${KERNELSU_PATH:?}"
|
||||||
|
rm -f "${KERNELSU_INFO:?}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
abort() {
|
abort() {
|
||||||
|
@ -152,6 +156,7 @@ GAPPS_VARIANT_MAP=(
|
||||||
|
|
||||||
ROOT_SOL_MAP=(
|
ROOT_SOL_MAP=(
|
||||||
"magisk"
|
"magisk"
|
||||||
|
"kernelsu"
|
||||||
"none"
|
"none"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -342,7 +347,11 @@ vclibs_PATH=$DOWNLOAD_DIR/Microsoft.VCLibs."$ARCH".14.00.Desktop.appx
|
||||||
xaml_PATH=$DOWNLOAD_DIR/Microsoft.UI.Xaml_"$ARCH".appx
|
xaml_PATH=$DOWNLOAD_DIR/Microsoft.UI.Xaml_"$ARCH".appx
|
||||||
MAGISK_ZIP=magisk-$MAGISK_VER.zip
|
MAGISK_ZIP=magisk-$MAGISK_VER.zip
|
||||||
MAGISK_PATH=$DOWNLOAD_DIR/$MAGISK_ZIP
|
MAGISK_PATH=$DOWNLOAD_DIR/$MAGISK_ZIP
|
||||||
if [ "$CUSTOM_MAGISK" ]; then
|
KERNEL_VER="5.10.117.2" # TODO: Get from kernel
|
||||||
|
KERNELSU_ZIP_NAME=kernelsu-$ARCH-$KERNEL_VER.zip
|
||||||
|
KERNELSU_PATH=$DOWNLOAD_DIR/$KERNELSU_ZIP_NAME
|
||||||
|
KERNELSU_INFO="$KERNELSU_PATH".info
|
||||||
|
if [ "$CUSTOM_MAGISK" ] && [ "$ROOT_SOL" = "magisk" ]; then
|
||||||
if [ ! -f "$MAGISK_PATH" ]; then
|
if [ ! -f "$MAGISK_PATH" ]; then
|
||||||
echo "Custom Magisk $MAGISK_ZIP not found"
|
echo "Custom Magisk $MAGISK_ZIP not found"
|
||||||
MAGISK_ZIP=app-$MAGISK_VER.apk
|
MAGISK_ZIP=app-$MAGISK_VER.apk
|
||||||
|
@ -379,9 +388,18 @@ if [ -z "${OFFLINE+x}" ]; then
|
||||||
ANDROID_API=32
|
ANDROID_API=32
|
||||||
update_gapps_zip_name
|
update_gapps_zip_name
|
||||||
fi
|
fi
|
||||||
|
if [ "$ROOT_SOL" = "magisk" ] || [ "$GAPPS_BRAND" != "none" ]; then
|
||||||
if [ -z "${CUSTOM_MAGISK+x}" ]; then
|
if [ -z "${CUSTOM_MAGISK+x}" ]; then
|
||||||
python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort
|
python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
if [ "$ROOT_SOL" = "kernelsu" ]; then
|
||||||
|
python3 generateKernelSULink.py "$ARCH" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$KERNEL_VER" "$KERNELSU_ZIP_NAME" || abort
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
source "${WORK_DIR:?}/ENV" || abort
|
||||||
|
# shellcheck disable=SC2153
|
||||||
|
echo "KERNELSU_VER=$KERNELSU_VER" > "$KERNELSU_INFO"
|
||||||
|
fi
|
||||||
if [ "$GAPPS_BRAND" != "none" ]; then
|
if [ "$GAPPS_BRAND" != "none" ]; then
|
||||||
python3 generateGappsLink.py "$ARCH" "$GAPPS_BRAND" "$GAPPS_VARIANT" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_ZIP_NAME" || abort
|
python3 generateGappsLink.py "$ARCH" "$GAPPS_BRAND" "$GAPPS_VARIANT" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_ZIP_NAME" || abort
|
||||||
fi
|
fi
|
||||||
|
@ -397,19 +415,22 @@ else # Offline mode
|
||||||
ANDROID_API=32
|
ANDROID_API=32
|
||||||
update_gapps_zip_name
|
update_gapps_zip_name
|
||||||
fi
|
fi
|
||||||
declare -A FILES_CHECK_LIST=([WSA_ZIP_PATH]="$WSA_ZIP_PATH" [xaml_PATH]="$xaml_PATH" [vclibs_PATH]="$vclibs_PATH" [MAGISK_PATH]="$MAGISK_PATH")
|
declare -A FILES_CHECK_LIST=([WSA_ZIP_PATH]="$WSA_ZIP_PATH" [xaml_PATH]="$xaml_PATH" [vclibs_PATH]="$vclibs_PATH")
|
||||||
|
if [ "$GAPPS_BRAND" != "none" ] || [ "$ROOT_SOL" = "magisk" ]; then
|
||||||
|
FILES_CHECK_LIST+=(["MAGISK_PATH"]="$MAGISK_PATH")
|
||||||
|
fi
|
||||||
|
if [ "$ROOT_SOL" = "kernelsu" ]; then
|
||||||
|
FILES_CHECK_LIST+=(["KERNELSU_PATH"]="$KERNELSU_PATH")
|
||||||
|
fi
|
||||||
|
if [ "$GAPPS_BRAND" != 'none' ]; then
|
||||||
|
FILES_CHECK_LIST+=(["GAPPS_PATH"]="$GAPPS_PATH")
|
||||||
|
fi
|
||||||
for i in "${FILES_CHECK_LIST[@]}"; do
|
for i in "${FILES_CHECK_LIST[@]}"; do
|
||||||
if [ ! -f "$i" ]; then
|
if [ ! -f "$i" ]; then
|
||||||
echo "Offline mode: missing [$i]."
|
echo "Offline mode: missing [$i]."
|
||||||
OFFLINE_ERR="1"
|
OFFLINE_ERR="1"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
if [ "$GAPPS_BRAND" != 'none' ]; then
|
|
||||||
if [ ! -f "$GAPPS_PATH" ]; then
|
|
||||||
echo "Offline mode: missing [$GAPPS_PATH]."
|
|
||||||
OFFLINE_ERR="1"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [ "$OFFLINE_ERR" ]; then
|
if [ "$OFFLINE_ERR" ]; then
|
||||||
echo "Offline mode: Some files are missing, please disable offline mode."
|
echo "Offline mode: Some files are missing, please disable offline mode."
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -432,8 +453,9 @@ else
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Extract Magisk"
|
if [ "$GAPPS_BRAND" != "none" ] || [ "$ROOT_SOL" = "magisk" ]; then
|
||||||
if [ -f "$MAGISK_PATH" ]; then
|
echo "Extract Magisk"
|
||||||
|
if [ -f "$MAGISK_PATH" ]; then
|
||||||
MAGISK_VERSION_NAME=""
|
MAGISK_VERSION_NAME=""
|
||||||
MAGISK_VERSION_CODE=0
|
MAGISK_VERSION_CODE=0
|
||||||
if ! python3 extractMagisk.py "$ARCH" "$MAGISK_PATH" "$WORK_DIR"; then
|
if ! python3 extractMagisk.py "$ARCH" "$MAGISK_PATH" "$WORK_DIR"; then
|
||||||
|
@ -450,14 +472,32 @@ if [ -f "$MAGISK_PATH" ]; then
|
||||||
"$SUDO" chmod +x "../linker/$HOST_ARCH/linker64" || abort
|
"$SUDO" chmod +x "../linker/$HOST_ARCH/linker64" || abort
|
||||||
"$SUDO" patchelf --set-interpreter "../linker/$HOST_ARCH/linker64" "$WORK_DIR"/magisk/magiskpolicy || abort
|
"$SUDO" patchelf --set-interpreter "../linker/$HOST_ARCH/linker64" "$WORK_DIR"/magisk/magiskpolicy || abort
|
||||||
chmod +x "$WORK_DIR"/magisk/magiskpolicy || abort
|
chmod +x "$WORK_DIR"/magisk/magiskpolicy || abort
|
||||||
elif [ -z "${CUSTOM_MAGISK+x}" ]; then
|
elif [ -z "${CUSTOM_MAGISK+x}" ]; then
|
||||||
echo "The Magisk zip package does not exist, is the download incomplete?"
|
echo "The Magisk zip package does not exist, is the download incomplete?"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
echo "The Magisk zip package does not exist, rename it to magisk-debug.zip and put it in the download folder."
|
echo "The Magisk zip package does not exist, rename it to magisk-debug.zip and put it in the download folder."
|
||||||
exit 1
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "done\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$ROOT_SOL" = "kernelsu" ]; then
|
||||||
|
echo "Extract KernelSU"
|
||||||
|
# shellcheck disable=SC1090
|
||||||
|
source "${KERNELSU_INFO:?}" || abort
|
||||||
|
if ! unzip "$KERNELSU_PATH" -d "$WORK_DIR"/kernelsu; then
|
||||||
|
echo "Unzip KernelSU failed, package is corrupted?"
|
||||||
|
CLEAN_DOWNLOAD_KERNELSU=1
|
||||||
|
abort
|
||||||
|
fi
|
||||||
|
if [ "$ARCH" = "x64" ]; then
|
||||||
|
mv "$WORK_DIR"/kernelsu/bzImage "$WORK_DIR"/kernelsu/kernel
|
||||||
|
elif [ "$ARCH" = "arm64" ]; then
|
||||||
|
mv "$WORK_DIR"/kernelsu/Image "$WORK_DIR"/kernelsu/kernel
|
||||||
|
fi
|
||||||
|
echo -e "done\n"
|
||||||
fi
|
fi
|
||||||
echo -e "done\n"
|
|
||||||
|
|
||||||
if [ "$GAPPS_BRAND" != 'none' ]; then
|
if [ "$GAPPS_BRAND" != 'none' ]; then
|
||||||
echo "Extract $GAPPS_BRAND"
|
echo "Extract $GAPPS_BRAND"
|
||||||
|
@ -513,7 +553,7 @@ fi
|
||||||
if [ -d "$WORK_DIR"/magisk ]; then
|
if [ -d "$WORK_DIR"/magisk ]; then
|
||||||
SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "$WORK_DIR"/magisk/magisk | cut -f1) ))
|
SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "$WORK_DIR"/magisk/magisk | cut -f1) ))
|
||||||
fi
|
fi
|
||||||
if [ -f "$MAGISK_PATH" ]; then
|
if [ "$ROOT_SOL" = "magisk" ] && [ -f "$MAGISK_PATH" ]; then
|
||||||
SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "$MAGISK_PATH" | cut -f1) ))
|
SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "$MAGISK_PATH" | cut -f1) ))
|
||||||
fi
|
fi
|
||||||
if [ -d "../$ARCH/system" ]; then
|
if [ -d "../$ARCH/system" ]; then
|
||||||
|
@ -546,7 +586,7 @@ $SUDO sed -i -e '/cts/a \ \ \ \ <feature name="android.software.device_admin" />
|
||||||
$SUDO setfattr -n security.selinux -v "u:object_r:vendor_configs_file:s0" "$MOUNT_DIR"/vendor/etc/permissions/windows.permissions.xml || abort
|
$SUDO setfattr -n security.selinux -v "u:object_r:vendor_configs_file:s0" "$MOUNT_DIR"/vendor/etc/permissions/windows.permissions.xml || abort
|
||||||
echo -e "done\n"
|
echo -e "done\n"
|
||||||
|
|
||||||
if [ "$ROOT_SOL" = 'magisk' ] || [ "$ROOT_SOL" = '' ]; then
|
if [ "$ROOT_SOL" = 'magisk' ]; then
|
||||||
echo "Integrate Magisk"
|
echo "Integrate Magisk"
|
||||||
"$SUDO" mkdir "$MOUNT_DIR"/sbin
|
"$SUDO" mkdir "$MOUNT_DIR"/sbin
|
||||||
"$SUDO" setfattr -n security.selinux -v "u:object_r:rootfs:s0" "$MOUNT_DIR"/sbin || abort
|
"$SUDO" setfattr -n security.selinux -v "u:object_r:rootfs:s0" "$MOUNT_DIR"/sbin || abort
|
||||||
|
@ -639,6 +679,11 @@ on property:init.svc.zygote=stopped
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
echo -e "Integrate Magisk done\n"
|
echo -e "Integrate Magisk done\n"
|
||||||
|
elif [ "$ROOT_SOL" = "kernelsu" ]; then
|
||||||
|
echo "Integrate KernelSU"
|
||||||
|
mv "$WORK_DIR/wsa/$ARCH/Tools/kernel" "$WORK_DIR/wsa/$ARCH/Tools/kernel_origin"
|
||||||
|
cp "$WORK_DIR"/kernelsu/kernel "$WORK_DIR/wsa/$ARCH/Tools/kernel"
|
||||||
|
echo -e "Integrate KernelSU done\n"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cp "$WORK_DIR/wsa/$ARCH/resources.pri" "$WORK_DIR"/wsa/pri/en-us.pri \
|
cp "$WORK_DIR/wsa/$ARCH/resources.pri" "$WORK_DIR"/wsa/pri/en-us.pri \
|
||||||
|
@ -769,10 +814,10 @@ echo "Generate info"
|
||||||
|
|
||||||
if [[ "$ROOT_SOL" = "none" ]]; then
|
if [[ "$ROOT_SOL" = "none" ]]; then
|
||||||
name1=""
|
name1=""
|
||||||
elif [ "$ROOT_SOL" = "" ] || [ "$ROOT_SOL" = "magisk" ]; then
|
elif [ "$ROOT_SOL" = "magisk" ]; then
|
||||||
name1="-with-magisk-$MAGISK_VERSION_NAME($MAGISK_VERSION_CODE)-$MAGISK_VER"
|
name1="-with-magisk-$MAGISK_VERSION_NAME($MAGISK_VERSION_CODE)-$MAGISK_VER"
|
||||||
else
|
elif [ "$ROOT_SOL" = "kernelsu" ]; then
|
||||||
name1="-with-$ROOT_SOL-$MAGISK_VER"
|
name1="-with-$ROOT_SOL-$KERNELSU_VER"
|
||||||
fi
|
fi
|
||||||
if [ "$GAPPS_BRAND" = "none" ]; then
|
if [ "$GAPPS_BRAND" = "none" ]; then
|
||||||
name2="-NoGApps"
|
name2="-NoGApps"
|
||||||
|
|
|
@ -68,7 +68,7 @@ elif brand == "MindTheGapps":
|
||||||
if res.status_code == 200:
|
if res.status_code == 200:
|
||||||
assets = json_data["assets"]
|
assets = json_data["assets"]
|
||||||
for asset in assets:
|
for asset in assets:
|
||||||
if re.match(f'.*{release}.*{abi_map[arch]}.*\.zip$', asset["name"]) and asset["content_type"] == "application/x-zip-compressed":
|
if re.match(f'.*{release}.*{abi_map[arch]}.*\.zip$', asset["name"]) and asset["content_type"] == "application/zip":
|
||||||
link = asset["browser_download_url"]
|
link = asset["browser_download_url"]
|
||||||
break
|
break
|
||||||
elif res.status_code == 403 and x_ratelimit_remaining == '0':
|
elif res.status_code == 403 and x_ratelimit_remaining == '0':
|
||||||
|
|
64
scripts/generateKernelSULink.py
Normal file
64
scripts/generateKernelSULink.py
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#!/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
|
||||||
|
#
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
arch = sys.argv[1]
|
||||||
|
download_dir = Path.cwd().parent / \
|
||||||
|
"download" if sys.argv[2] == "" else Path(sys.argv[2]).resolve()
|
||||||
|
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")
|
||||||
|
json_data = json.loads(res.content)
|
||||||
|
headers = res.headers
|
||||||
|
x_ratelimit_remaining = headers["x-ratelimit-remaining"]
|
||||||
|
if res.status_code == 200:
|
||||||
|
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":
|
||||||
|
link = asset["browser_download_url"]
|
||||||
|
break
|
||||||
|
release_name = json_data["name"]
|
||||||
|
with open(os.environ['WSA_WORK_ENV'], 'a') as environ_file:
|
||||||
|
environ_file.write(f'KERNELSU_VER={release_name}\n')
|
||||||
|
elif res.status_code == 403 and x_ratelimit_remaining == '0':
|
||||||
|
message = json_data["message"]
|
||||||
|
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)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
print(f"download link: {link}", flush=True)
|
||||||
|
|
||||||
|
with open(download_dir/tempScript, 'a') as f:
|
||||||
|
f.writelines(f'{link}\n')
|
||||||
|
f.writelines(f' dir={download_dir}\n')
|
||||||
|
f.writelines(f' out={file_name}\n')
|
|
@ -32,8 +32,9 @@ with zipfile.ZipFile(wsa_zip_path) as zip:
|
||||||
for f in zip.filelist:
|
for f in zip.filelist:
|
||||||
if arch in f.filename.lower():
|
if arch in f.filename.lower():
|
||||||
zip_name = f.filename
|
zip_name = f.filename
|
||||||
ver_no = zip_name.split("_")
|
break
|
||||||
long_ver = ver_no[1]
|
ver_no = zip_name.split("_")
|
||||||
ver = long_ver.split(".")
|
long_ver = ver_no[1]
|
||||||
main_ver = ver[0]
|
ver = long_ver.split(".")
|
||||||
print(main_ver)
|
main_ver = ver[0]
|
||||||
|
print(main_ver)
|
||||||
|
|
|
@ -122,8 +122,9 @@ ROOT_SOL=$(
|
||||||
Radiolist '([title]="Root solution"
|
Radiolist '([title]="Root solution"
|
||||||
[default]="magisk")' \
|
[default]="magisk")' \
|
||||||
\
|
\
|
||||||
'magisk' "" 'on' \
|
'magisk' "Magisk" 'on' \
|
||||||
'none' "" 'off'
|
'kernelsu' "KernelSU" 'on' \
|
||||||
|
'none' "Without root" 'off'
|
||||||
)
|
)
|
||||||
|
|
||||||
if (YesNoBox '([title]="Compress output" [text]="Do you want to compress the output?")'); then
|
if (YesNoBox '([title]="Compress output" [text]="Do you want to compress the output?")'); then
|
||||||
|
|
Loading…
Add table
Reference in a new issue