mirror of
https://github.com/LSPosed/MagiskOnWSALocal.git
synced 2025-05-06 06:46:35 +08:00
Support integrate KernelSU (#403)
* Support integrate KernelSU * Fix zip MIME type * Better print
This commit is contained in:
parent
4a04f98a08
commit
fa79cc8480
123
scripts/build.sh
123
scripts/build.sh
@ -80,6 +80,10 @@ clean_download() {
|
||||
if [ "$CLEAN_DOWNLOAD_GAPPS" ]; then
|
||||
rm -f "${GAPPS_PATH:?}"
|
||||
fi
|
||||
if [ "$CLEAN_DOWNLOAD_KERNELSU" ]; then
|
||||
rm -f "${KERNELSU_PATH:?}"
|
||||
rm -f "${KERNELSU_INFO:?}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
abort() {
|
||||
@ -152,6 +156,7 @@ GAPPS_VARIANT_MAP=(
|
||||
|
||||
ROOT_SOL_MAP=(
|
||||
"magisk"
|
||||
"kernelsu"
|
||||
"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
|
||||
MAGISK_ZIP=magisk-$MAGISK_VER.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
|
||||
echo "Custom Magisk $MAGISK_ZIP not found"
|
||||
MAGISK_ZIP=app-$MAGISK_VER.apk
|
||||
@ -379,8 +388,17 @@ if [ -z "${OFFLINE+x}" ]; then
|
||||
ANDROID_API=32
|
||||
update_gapps_zip_name
|
||||
fi
|
||||
if [ -z "${CUSTOM_MAGISK+x}" ]; then
|
||||
python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort
|
||||
if [ "$ROOT_SOL" = "magisk" ] || [ "$GAPPS_BRAND" != "none" ]; then
|
||||
if [ -z "${CUSTOM_MAGISK+x}" ]; then
|
||||
python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort
|
||||
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
|
||||
python3 generateGappsLink.py "$ARCH" "$GAPPS_BRAND" "$GAPPS_VARIANT" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_ZIP_NAME" || abort
|
||||
@ -397,19 +415,22 @@ else # Offline mode
|
||||
ANDROID_API=32
|
||||
update_gapps_zip_name
|
||||
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
|
||||
if [ ! -f "$i" ]; then
|
||||
echo "Offline mode: missing [$i]."
|
||||
OFFLINE_ERR="1"
|
||||
fi
|
||||
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
|
||||
echo "Offline mode: Some files are missing, please disable offline mode."
|
||||
exit 1
|
||||
@ -432,32 +453,51 @@ else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Extract Magisk"
|
||||
if [ -f "$MAGISK_PATH" ]; then
|
||||
MAGISK_VERSION_NAME=""
|
||||
MAGISK_VERSION_CODE=0
|
||||
if ! python3 extractMagisk.py "$ARCH" "$MAGISK_PATH" "$WORK_DIR"; then
|
||||
echo "Unzip Magisk failed, is the download incomplete?"
|
||||
CLEAN_DOWNLOAD_MAGISK=1
|
||||
abort
|
||||
if [ "$GAPPS_BRAND" != "none" ] || [ "$ROOT_SOL" = "magisk" ]; then
|
||||
echo "Extract Magisk"
|
||||
if [ -f "$MAGISK_PATH" ]; then
|
||||
MAGISK_VERSION_NAME=""
|
||||
MAGISK_VERSION_CODE=0
|
||||
if ! python3 extractMagisk.py "$ARCH" "$MAGISK_PATH" "$WORK_DIR"; then
|
||||
echo "Unzip Magisk failed, is the download incomplete?"
|
||||
CLEAN_DOWNLOAD_MAGISK=1
|
||||
abort
|
||||
fi
|
||||
# shellcheck disable=SC1091
|
||||
source "${WORK_DIR:?}/ENV" || abort
|
||||
if [ "$MAGISK_VERSION_CODE" -lt 24000 ]; then
|
||||
echo "Please install Magisk v24+"
|
||||
abort
|
||||
fi
|
||||
"$SUDO" chmod +x "../linker/$HOST_ARCH/linker64" || abort
|
||||
"$SUDO" patchelf --set-interpreter "../linker/$HOST_ARCH/linker64" "$WORK_DIR"/magisk/magiskpolicy || abort
|
||||
chmod +x "$WORK_DIR"/magisk/magiskpolicy || abort
|
||||
elif [ -z "${CUSTOM_MAGISK+x}" ]; then
|
||||
echo "The Magisk zip package does not exist, is the download incomplete?"
|
||||
exit 1
|
||||
else
|
||||
echo "The Magisk zip package does not exist, rename it to magisk-debug.zip and put it in the download folder."
|
||||
exit 1
|
||||
fi
|
||||
# shellcheck disable=SC1091
|
||||
source "${WORK_DIR:?}/ENV" || abort
|
||||
if [ "$MAGISK_VERSION_CODE" -lt 24000 ]; then
|
||||
echo "Please install Magisk v24+"
|
||||
abort
|
||||
fi
|
||||
"$SUDO" chmod +x "../linker/$HOST_ARCH/linker64" || abort
|
||||
"$SUDO" patchelf --set-interpreter "../linker/$HOST_ARCH/linker64" "$WORK_DIR"/magisk/magiskpolicy || abort
|
||||
chmod +x "$WORK_DIR"/magisk/magiskpolicy || abort
|
||||
elif [ -z "${CUSTOM_MAGISK+x}" ]; then
|
||||
echo "The Magisk zip package does not exist, is the download incomplete?"
|
||||
exit 1
|
||||
else
|
||||
echo "The Magisk zip package does not exist, rename it to magisk-debug.zip and put it in the download folder."
|
||||
exit 1
|
||||
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
|
||||
echo -e "done\n"
|
||||
|
||||
if [ "$GAPPS_BRAND" != 'none' ]; then
|
||||
echo "Extract $GAPPS_BRAND"
|
||||
@ -513,7 +553,7 @@ fi
|
||||
if [ -d "$WORK_DIR"/magisk ]; then
|
||||
SYSTEM_SIZE=$(( SYSTEM_SIZE + $(du --apparent-size -sB512 "$WORK_DIR"/magisk/magisk | cut -f1) ))
|
||||
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) ))
|
||||
fi
|
||||
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
|
||||
echo -e "done\n"
|
||||
|
||||
if [ "$ROOT_SOL" = 'magisk' ] || [ "$ROOT_SOL" = '' ]; then
|
||||
if [ "$ROOT_SOL" = 'magisk' ]; then
|
||||
echo "Integrate Magisk"
|
||||
"$SUDO" mkdir "$MOUNT_DIR"/sbin
|
||||
"$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
|
||||
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
|
||||
|
||||
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
|
||||
name1=""
|
||||
elif [ "$ROOT_SOL" = "" ] || [ "$ROOT_SOL" = "magisk" ]; then
|
||||
elif [ "$ROOT_SOL" = "magisk" ]; then
|
||||
name1="-with-magisk-$MAGISK_VERSION_NAME($MAGISK_VERSION_CODE)-$MAGISK_VER"
|
||||
else
|
||||
name1="-with-$ROOT_SOL-$MAGISK_VER"
|
||||
elif [ "$ROOT_SOL" = "kernelsu" ]; then
|
||||
name1="-with-$ROOT_SOL-$KERNELSU_VER"
|
||||
fi
|
||||
if [ "$GAPPS_BRAND" = "none" ]; then
|
||||
name2="-NoGApps"
|
||||
|
@ -68,7 +68,7 @@ elif brand == "MindTheGapps":
|
||||
if res.status_code == 200:
|
||||
assets = json_data["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"]
|
||||
break
|
||||
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:
|
||||
if arch in f.filename.lower():
|
||||
zip_name = f.filename
|
||||
ver_no = zip_name.split("_")
|
||||
long_ver = ver_no[1]
|
||||
ver = long_ver.split(".")
|
||||
main_ver = ver[0]
|
||||
print(main_ver)
|
||||
break
|
||||
ver_no = zip_name.split("_")
|
||||
long_ver = ver_no[1]
|
||||
ver = long_ver.split(".")
|
||||
main_ver = ver[0]
|
||||
print(main_ver)
|
||||
|
@ -122,8 +122,9 @@ ROOT_SOL=$(
|
||||
Radiolist '([title]="Root solution"
|
||||
[default]="magisk")' \
|
||||
\
|
||||
'magisk' "" 'on' \
|
||||
'none' "" 'off'
|
||||
'magisk' "Magisk" 'on' \
|
||||
'kernelsu' "KernelSU" 'on' \
|
||||
'none' "Without root" 'off'
|
||||
)
|
||||
|
||||
if (YesNoBox '([title]="Compress output" [text]="Do you want to compress the output?")'); then
|
||||
|
Loading…
x
Reference in New Issue
Block a user