diff --git a/.gitignore b/.gitignore index 6baed8f..af38087 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ download output python3-env +token diff --git a/arm64/gapps/product/etc/sysconfig/component-overrides.xml b/arm64/gapps/product/etc/sysconfig/component-overrides.xml deleted file mode 100644 index 2720650..0000000 --- a/arm64/gapps/product/etc/sysconfig/component-overrides.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/arm64/gapps/product/overlay/GoogleWebViewOverlay.apk b/arm64/gapps/product/overlay/GoogleWebViewOverlay.apk deleted file mode 100644 index cb6f5a3..0000000 Binary files a/arm64/gapps/product/overlay/GoogleWebViewOverlay.apk and /dev/null differ diff --git a/arm64/system/priv-app/VpnDialogs/VpnDialogs.apk b/arm64/system/priv-app/VpnDialogs/VpnDialogs.apk deleted file mode 100644 index c345c99..0000000 Binary files a/arm64/system/priv-app/VpnDialogs/VpnDialogs.apk and /dev/null differ diff --git a/bin/aarch64/fuse.erofs b/bin/aarch64/fuse.erofs deleted file mode 100755 index 462f9b4..0000000 Binary files a/bin/aarch64/fuse.erofs and /dev/null differ diff --git a/bin/aarch64/mkfs.erofs b/bin/aarch64/mkfs.erofs deleted file mode 100755 index 7ac3170..0000000 Binary files a/bin/aarch64/mkfs.erofs and /dev/null differ diff --git a/bin/arm64/lspinit b/bin/arm64/lspinit new file mode 100644 index 0000000..f46512b Binary files /dev/null and b/bin/arm64/lspinit differ diff --git a/bin/x64/lspinit b/bin/x64/lspinit new file mode 100644 index 0000000..1775e81 Binary files /dev/null and b/bin/x64/lspinit differ diff --git a/bin/x86_64/fuse.erofs b/bin/x86_64/fuse.erofs deleted file mode 100755 index 472f926..0000000 Binary files a/bin/x86_64/fuse.erofs and /dev/null differ diff --git a/bin/x86_64/mkfs.erofs b/bin/x86_64/mkfs.erofs deleted file mode 100755 index e23b767..0000000 Binary files a/bin/x86_64/mkfs.erofs and /dev/null differ diff --git a/installer/Install.ps1 b/installer/Install.ps1 index 9815c83..afb8626 100644 --- a/installer/Install.ps1 +++ b/installer/Install.ps1 @@ -13,7 +13,7 @@ # You should have received a copy of the GNU Affero General Public License # along with MagiskOnWSALocal. If not, see . # -# Copyright (C) 2023 LSPosed Contributors +# Copyright (C) 2024 LSPosed Contributors # $Host.UI.RawUI.WindowTitle = "Installing MagiskOnWSA...." @@ -48,11 +48,6 @@ Function Test-CommandExist { } #end function Test-CommandExist Function Finish { - Clear-Host - If (Test-CommandExist Optimize-VHD) { - Write-Output "Optimizing VHDX size...." - Optimize-VHD ".\*.vhdx" -Mode Full - } Clear-Host Start-Process "wsa://com.topjohnwu.magisk" Start-Process "wsa://com.android.vending" diff --git a/linker/aarch64/libc.so b/linker/aarch64/libc.so deleted file mode 100644 index 6f4ec47..0000000 Binary files a/linker/aarch64/libc.so and /dev/null differ diff --git a/linker/aarch64/libdl.so b/linker/aarch64/libdl.so deleted file mode 100644 index 15cfd68..0000000 Binary files a/linker/aarch64/libdl.so and /dev/null differ diff --git a/linker/aarch64/libm.so b/linker/aarch64/libm.so deleted file mode 100644 index c129e26..0000000 Binary files a/linker/aarch64/libm.so and /dev/null differ diff --git a/linker/aarch64/linker64 b/linker/aarch64/linker64 deleted file mode 100755 index eeca0b8..0000000 Binary files a/linker/aarch64/linker64 and /dev/null differ diff --git a/linker/x86_64/libc.so b/linker/x86_64/libc.so deleted file mode 100644 index 748c48c..0000000 Binary files a/linker/x86_64/libc.so and /dev/null differ diff --git a/linker/x86_64/libdl.so b/linker/x86_64/libdl.so deleted file mode 100644 index 8b24897..0000000 Binary files a/linker/x86_64/libdl.so and /dev/null differ diff --git a/linker/x86_64/libm.so b/linker/x86_64/libm.so deleted file mode 100644 index 7bf99e8..0000000 Binary files a/linker/x86_64/libm.so and /dev/null differ diff --git a/linker/x86_64/linker64 b/linker/x86_64/linker64 deleted file mode 100755 index 894beae..0000000 Binary files a/linker/x86_64/linker64 and /dev/null differ diff --git a/scripts/build.sh b/scripts/build.sh index f36e127..2d72d6a 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Affero General Public License # along with MagiskOnWSALocal. If not, see . # -# Copyright (C) 2023 LSPosed Contributors +# Copyright (C) 2024 LSPosed Contributors # if [ ! "$BASH_VERSION" ]; then @@ -34,49 +34,12 @@ if [ "$TMPDIR" ] && [ ! -d "$TMPDIR" ]; then fi WORK_DIR=$(mktemp -d -t wsa-build-XXXXXXXXXX_) || exit 1 -# lowerdir -ROOT_MNT_RO="$WORK_DIR/erofs" -VENDOR_MNT_RO="$ROOT_MNT_RO/vendor" -PRODUCT_MNT_RO="$ROOT_MNT_RO/product" -SYSTEM_EXT_MNT_RO="$ROOT_MNT_RO/system_ext" - -# upperdir -ROOT_MNT_RW="$WORK_DIR/upper" -VENDOR_MNT_RW="$ROOT_MNT_RW/vendor" -PRODUCT_MNT_RW="$ROOT_MNT_RW/product" -SYSTEM_EXT_MNT_RW="$ROOT_MNT_RW/system_ext" -SYSTEM_MNT_RW="$ROOT_MNT_RW/system" - -# merged -ROOT_MNT="$WORK_DIR/system_root_merged" -SYSTEM_MNT="$ROOT_MNT/system" -VENDOR_MNT="$ROOT_MNT/vendor" -PRODUCT_MNT="$ROOT_MNT/product" -SYSTEM_EXT_MNT="$ROOT_MNT/system_ext" - -declare -A LOWER_PARTITION=(["zsystem"]="$ROOT_MNT_RO" ["vendor"]="$VENDOR_MNT_RO" ["product"]="$PRODUCT_MNT_RO" ["system_ext"]="$SYSTEM_EXT_MNT_RO") -declare -A UPPER_PARTITION=(["zsystem"]="$SYSTEM_MNT_RW" ["vendor"]="$VENDOR_MNT_RW" ["product"]="$PRODUCT_MNT_RW" ["system_ext"]="$SYSTEM_EXT_MNT_RW") -declare -A MERGED_PARTITION=(["zsystem"]="$ROOT_MNT" ["vendor"]="$VENDOR_MNT" ["product"]="$PRODUCT_MNT" ["system_ext"]="$SYSTEM_EXT_MNT") DOWNLOAD_DIR=../download DOWNLOAD_CONF_NAME=download.list PYTHON_VENV_DIR="$(dirname "$PWD")/python3-env" -EROFS_USE_FUSE=1 -umount_clean() { - if [ -d "$ROOT_MNT" ] || [ -d "$ROOT_MNT_RO" ]; then - echo "Cleanup Mount Directory" - for PART in "${LOWER_PARTITION[@]}"; do - sudo umount -v "$PART" - done - for PART in "${UPPER_PARTITION[@]}"; do - sudo rm -rf "${PART:?}" - done - for PART in "${MERGED_PARTITION[@]}"; do - sudo umount -v "$PART" - done - sudo rm -rf "${WORK_DIR:?}" - else - rm -rf "${WORK_DIR:?}" - fi + +dir_clean() { + rm -rf "${WORK_DIR:?}" if [ "$TMPDIR" ] && [ -d "$TMPDIR" ]; then echo "Cleanup Temp Directory" rm -rf "${TMPDIR:?}" @@ -88,7 +51,7 @@ umount_clean() { deactivate fi } -trap umount_clean EXIT +trap dir_clean EXIT OUTPUT_DIR=../output WSA_WORK_ENV="${WORK_DIR:?}/ENV" if [ -f "$WSA_WORK_ENV" ]; then rm -f "${WSA_WORK_ENV:?}"; fi @@ -104,7 +67,8 @@ clean_download() { rm -f "${MAGISK_PATH:?}" fi if [ "$CLEAN_DOWNLOAD_GAPPS" ]; then - rm -f "${GAPPS_PATH:?}" + rm -f "${GAPPS_IMAGE_PATH:?}" + rm -f "${GAPPS_RC_PATH:?}" fi if [ "$CLEAN_DOWNLOAD_KERNELSU" ]; then rm -f "${KERNELSU_PATH:?}" @@ -117,24 +81,19 @@ abort() { echo "Build: an error has occurred, exit" if [ -d "$WORK_DIR" ]; then echo -e "\nCleanup Work Directory" - umount_clean + dir_clean fi clean_download exit 1 } trap abort INT TERM -Gen_Rand_Str() { - head /dev/urandom | tr -dc '[:lower:]' | head -c"$1" -} - default() { ARCH=x64 RELEASE_TYPE=retail MAGISK_VER=stable - GAPPS_BRAND=MindTheGapps - GAPPS_VARIANT=pico ROOT_SOL=magisk + COMPRESS_FORMAT=none } exit_with_message() { @@ -143,97 +102,6 @@ exit_with_message() { exit 1 } -resize_img() { - sudo e2fsck -pf "$1" || return 1 - if [ "$2" ]; then - sudo resize2fs "$1" "$2" || return 1 - else - sudo resize2fs -M "$1" || return 1 - fi - return 0 -} - -vhdx_to_raw_img() { - qemu-img convert -q -f vhdx -O raw "$1" "$2" || return 1 - rm -f "$1" || return 1 -} - -check_image_type() { - local type - type=$(blkid -o value -s TYPE "$1") - echo "$type" -} - -mk_overlayfs() { # label lowerdir upperdir merged - local context own - local workdir="$WORK_DIR/worker/$1" - local lowerdir="$2" - local upperdir="$3" - local merged="$4" - - echo "mk_overlayfs: label $1 - lowerdir=$lowerdir - upperdir=$upperdir - workdir=$workdir - merged=$merged" - case "$1" in - vendor) - context="u:object_r:vendor_file:s0" - own="0:2000" - ;; - system) - context="u:object_r:rootfs:s0" - own="0:0" - ;; - *) - context="u:object_r:system_file:s0" - own="0:0" - ;; - esac - sudo mkdir -p -m 755 "$workdir" "$upperdir" "$merged" || return 1 - sudo chown -R "$own" "$upperdir" "$workdir" "$merged" || return 1 - sudo setfattr -n security.selinux -v "$context" "$upperdir" || return 1 - sudo setfattr -n security.selinux -v "$context" "$workdir" || return 1 - sudo setfattr -n security.selinux -v "$context" "$merged" || return 1 - sudo mount -vt overlay overlay -olowerdir="$lowerdir",upperdir="$upperdir",workdir="$workdir" "$merged" || return 1 -} - -mk_image_umount() { # dir imgpath upperdir imgtype - echo "mk_image_umount: $*" - if [ "$4" = "erofs" ]; then - sudo "../bin/$HOST_ARCH/mkfs.erofs" -zlz4hc -T1230768000 --chunksize=4096 --exclude-regex="lost+found" "$2"."$4" "$1" || abort "Failed to make image for $1" - elif [ "$4" = "ext4" ]; then - abort "Not yet implemented" - fi - sudo umount -v "$1" - sudo rm -f "$2" - sudo mv "$2"."$4" "$2" - if [ -d "$3" ]; then - sudo rm -rf "$3" - fi -} - -ro_ext4_img_to_rw() { - resize_img "$1" "$(($(du --apparent-size -sB512 "$1" | cut -f1) * 2))"s || return 1 - e2fsck -fp -E unshare_blocks "$1" || return 1 - resize_img "$1" || return 1 - return 0 -} - -mount_erofs() { - if [ "$EROFS_USE_FUSE" ]; then - sudo "../bin/$HOST_ARCH/fuse.erofs" "$1" "$2" || return 1 - else - sudo mount -v -t erofs -o ro,loop "$1" "$2" || return 1 - fi -} - -# workaround for Debian -# In Debian /usr/sbin is not in PATH and some utilities in there are in use -[ -d /usr/sbin ] && export PATH="/usr/sbin:$PATH" -# In Debian /etc/mtab is not exist -[ -f /etc/mtab ] || sudo ln -s /proc/self/mounts /etc/mtab - ARCH_MAP=( "x64" "arm64" @@ -254,24 +122,6 @@ MAGISK_VER_MAP=( "release" ) -GAPPS_BRAND_MAP=( - "OpenGApps" - "MindTheGapps" - "none" -) - -GAPPS_VARIANT_MAP=( - "super" - "stock" - "full" - "mini" - "micro" - "nano" - "pico" - "tvstock" - "tvmini" -) - ROOT_SOL_MAP=( "magisk" "kernelsu" @@ -281,6 +131,7 @@ ROOT_SOL_MAP=( COMPRESS_FORMAT_MAP=( "7z" "zip" + "none" ) ARR_TO_STR() { @@ -289,9 +140,7 @@ ARR_TO_STR() { printf -v joined "%s, " "${arr[@]}" echo "${joined%, }" } -GAPPS_PROPS_MSG1="\033[0;31mWARNING: Services such as the Play Store may stop working properly." -GAPPS_PROPS_MSG2="We are not responsible for any problems caused by this!\033[0m" -GAPPS_PROPS_MSG3="Info: https://support.google.com/android/answer/10248227" + usage() { default echo -e " @@ -312,66 +161,44 @@ Usage: Possible values: $(ARR_TO_STR "${MAGISK_VER_MAP[@]}") Default: $MAGISK_VER - --gapps-brand GApps brand. - \"none\" for no integration of GApps - - Possible values: $(ARR_TO_STR "${GAPPS_BRAND_MAP[@]}") - Default: $GAPPS_BRAND - - --gapps-variant GApps variant. - - Possible values: $(ARR_TO_STR "${GAPPS_VARIANT_MAP[@]}") - Default: $GAPPS_VARIANT - --root-sol Root solution. \"none\" means no root. Possible values: $(ARR_TO_STR "${ROOT_SOL_MAP[@]}") Default: $ROOT_SOL - --compress-format - Compress format of output file. - If this option is not specified and --compress is not specified, the generated file will not be compressed + --compress-format Compress format of output file. Possible values: $(ARR_TO_STR "${COMPRESS_FORMAT_MAP[@]}") + Default: $COMPRESS_FORMAT Additional Options: - --remove-amazon Remove Amazon Appstore from the system - --compress Compress the WSA, The default format is 7z, you can use the format specified by --compress-format --offline Build WSA offline --magisk-custom Install custom Magisk --skip-download-wsa Skip download WSA - --debug Debug build mode --help Show this help message and exit - --nofix-props No fix \"build.prop\" - $GAPPS_PROPS_MSG1 - $GAPPS_PROPS_MSG2 - $GAPPS_PROPS_MSG3 Example: - ./build.sh --release-type RP --magisk-ver beta --gapps-variant pico --remove-amazon - ./build.sh --arch arm64 --release-type WIF --gapps-brand OpenGApps --nofix-props - ./build.sh --release-type WIS --gapps-brand none - ./build.sh --offline --gapps-variant pico --magisk-custom + ./build.sh --release-type RP --magisk-ver beta + ./build.sh --arch arm64 --release-type WIF + ./build.sh --release-type WIS + ./build.sh --offline --magisk-custom + ./build.sh --release-type WIF --magisk-custom --magisk-ver release " } ARGUMENT_LIST=( + "compress-format:" "arch:" "release-type:" - "magisk-ver:" - "gapps-brand:" - "gapps-variant:" - "nofix-props" "root-sol:" - "compress-format:" - "remove-amazon" - "compress" - "offline" + "magisk-ver:" "magisk-custom" - "debug" - "help" + "install-gapps" + "offline" "skip-download-wsa" + "help" + "debug" ) default @@ -386,32 +213,58 @@ opts=$( eval set --"$opts" while [[ $# -gt 0 ]]; do - case "$1" in - --arch ) ARCH="$2"; shift 2 ;; - --release-type ) RELEASE_TYPE="$2"; shift 2 ;; - --gapps-brand ) GAPPS_BRAND="$2"; shift 2 ;; - --gapps-variant ) GAPPS_VARIANT="$2"; shift 2 ;; - --nofix-props ) NOFIX_PROPS="yes"; shift ;; - --root-sol ) ROOT_SOL="$2"; shift 2 ;; - --compress-format ) COMPRESS_FORMAT="$2"; shift 2 ;; - --remove-amazon ) REMOVE_AMAZON="yes"; shift ;; - --compress ) COMPRESS_OUTPUT="yes"; shift ;; - --offline ) OFFLINE="on"; shift ;; - --magisk-custom ) CUSTOM_MAGISK="debug"; shift ;; - --magisk-ver ) MAGISK_VER="$2"; shift 2 ;; - --debug ) DEBUG="on"; shift ;; - --skip-download-wsa ) DOWN_WSA="no"; shift ;; - --help ) usage; exit 0 ;; - -- ) shift; break;; - esac + case "$1" in + --compress-format) + COMPRESS_FORMAT="$2" + shift 2 + ;; + --arch) + ARCH="$2" + shift 2 + ;; + --release-type) + RELEASE_TYPE="$2" + shift 2 + ;; + --root-sol) + ROOT_SOL="$2" + shift 2 + ;; + --magisk-ver) + MAGISK_VER="$2" + shift 2 + ;; + --magisk-custom) + CUSTOM_MAGISK=1 + shift + ;; + --install-gapps) + HAS_GAPPS=1 + shift + ;; + --offline) + OFFLINE=1 + shift + ;; + --skip-download-wsa) + SKIP_DOWN_WSA=1 + shift + ;; + --help) + usage + exit 0 + ;; + --debug) + DEBUG=1 + shift + ;; + --) + shift + break + ;; + esac done -if [ "$CUSTOM_MAGISK" ]; then - if [ -z "$MAGISK_VER" ]; then - MAGISK_VER=$CUSTOM_MAGISK - fi -fi - check_list() { local input=$1 if [ -n "$input" ]; then @@ -435,8 +288,6 @@ check_list() { check_list "$ARCH" "Architecture" "${ARCH_MAP[@]}" check_list "$RELEASE_TYPE" "Release Type" "${RELEASE_TYPE_MAP[@]}" check_list "$MAGISK_VER" "Magisk Version" "${MAGISK_VER_MAP[@]}" -check_list "$GAPPS_BRAND" "GApps Brand" "${GAPPS_BRAND_MAP[@]}" -check_list "$GAPPS_VARIANT" "GApps Variant" "${GAPPS_VARIANT_MAP[@]}" check_list "$ROOT_SOL" "Root Solution" "${ROOT_SOL_MAP[@]}" check_list "$COMPRESS_FORMAT" "Compress Format" "${COMPRESS_FORMAT_MAP[@]}" @@ -444,34 +295,27 @@ if [ "$DEBUG" ]; then set -x fi -require_su() { - if test "$(id -u)" != "0"; then - if [ "$(sudo id -u)" != "0" ]; then - abort "sudo is required to run this script" - fi - fi -} # shellcheck disable=SC1091 [ -f "$PYTHON_VENV_DIR/bin/activate" ] && { source "$PYTHON_VENV_DIR/bin/activate" || abort "Failed to activate virtual environment, please re-run install_deps.sh" } declare -A RELEASE_NAME_MAP=(["retail"]="Retail" ["RP"]="Release Preview" ["WIS"]="Insider Slow" ["WIF"]="Insider Fast") declare -A ANDROID_API_MAP=(["30"]="11.0" ["32"]="12.1" ["33"]="13.0") +declare -A ARCH_NAME_MAP=(["x64"]="x86_64" ["arm64"]="arm64") RELEASE_NAME=${RELEASE_NAME_MAP[$RELEASE_TYPE]} || abort - -echo -e "Build: RELEASE_TYPE=$RELEASE_NAME" - +echo -e "INFO: Release Name: $RELEASE_NAME\n" WSA_ZIP_PATH=$DOWNLOAD_DIR/wsa-$RELEASE_TYPE.zip vclibs_PATH="$DOWNLOAD_DIR/Microsoft.VCLibs.140.00_$ARCH.appx" UWPVCLibs_PATH="$DOWNLOAD_DIR/Microsoft.VCLibs.140.00.UWPDesktop_$ARCH.appx" xaml_PATH="$DOWNLOAD_DIR/Microsoft.UI.Xaml.2.8_$ARCH.appx" MAGISK_ZIP=magisk-$MAGISK_VER.zip MAGISK_PATH=$DOWNLOAD_DIR/$MAGISK_ZIP +CUST_PATH="$DOWNLOAD_DIR/cust.img" if [ "$CUSTOM_MAGISK" ]; then if [ ! -f "$MAGISK_PATH" ]; then echo "Custom Magisk $MAGISK_ZIP not found" MAGISK_ZIP=app-$MAGISK_VER.apk - echo "Fallback to $MAGISK_ZIP" + echo -e "Fallback to $MAGISK_ZIP\n" MAGISK_PATH=$DOWNLOAD_DIR/$MAGISK_ZIP if [ ! -f "$MAGISK_PATH" ]; then abort "Custom Magisk $MAGISK_ZIP not found\nPlease put custom Magisk in $DOWNLOAD_DIR" @@ -479,46 +323,77 @@ if [ "$CUSTOM_MAGISK" ]; then fi fi ANDROID_API=33 -update_gapps_zip_name() { - if [ "$GAPPS_BRAND" = "OpenGApps" ]; then - ANDROID_API=30 - GAPPS_ZIP_NAME=$GAPPS_BRAND-$ARCH-${ANDROID_API_MAP[$ANDROID_API]}-$GAPPS_VARIANT.zip - else - GAPPS_ZIP_NAME=$GAPPS_BRAND-$ARCH-${ANDROID_API_MAP[$ANDROID_API]}.zip - fi - GAPPS_PATH=$DOWNLOAD_DIR/$GAPPS_ZIP_NAME +update_gapps_files_name() { + GAPPS_IMAGE_NAME=gapps-${ANDROID_API_MAP[$ANDROID_API]}-${ARCH_NAME_MAP[$ARCH]}.img + GAPPS_RC_NAME=gapps-${ANDROID_API_MAP[$ANDROID_API]}.rc + GAPPS_IMAGE_PATH=$DOWNLOAD_DIR/$GAPPS_IMAGE_NAME + GAPPS_RC_PATH=$DOWNLOAD_DIR/$GAPPS_RC_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 - require_su - if [ "$DOWN_WSA" != "no" ]; then - echo "Generate Download Links" + echo "Generating WSA Download Links" + if [ -z ${SKIP_DOWN_WSA+x} ]; then 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") + python3 generateWSALinks.py "$ARCH" "$RELEASE_TYPE" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$SKIP_DOWN_WSA" || abort + 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 + abort "We have encountered an error while downloading files." fi - if [ "$ROOT_SOL" = "magisk" ] || [ "$GAPPS_BRAND" != "none" ]; then + rm -f "${DOWNLOAD_DIR:?}/$DOWNLOAD_CONF_NAME" +fi + +echo "Extracting 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" + fi + echo -e "done\n" + # shellcheck disable=SC1090 + source "$WSA_WORK_ENV" || abort +else + abort "The WSA zip package does not exist" +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 @@ -531,62 +406,42 @@ if [ -z ${OFFLINE+x} ]; then # shellcheck disable=SC2153 echo "KERNELSU_VER=$KERNELSU_VER" >"$KERNELSU_INFO" fi - if [ "$GAPPS_BRAND" != "none" ]; then - update_gapps_zip_name - python3 generateGappsLink.py "$ARCH" "$GAPPS_BRAND" "$GAPPS_VARIANT" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_ZIP_NAME" || abort + if [ "$HAS_GAPPS" ]; then + update_gapps_files_name + python3 generateGappsLink.py "$ARCH" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_IMAGE_NAME" || abort fi - - echo "Download 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 [ "$GAPPS_BRAND" != "none" ] || [ "$ROOT_SOL" = "magisk" ]; then - FILES_CHECK_LIST+=(["MAGISK_PATH"]="$MAGISK_PATH") - fi - if [ "$ROOT_SOL" = "kernelsu" ]; then - update_ksu_zip_name - FILES_CHECK_LIST+=(["KERNELSU_PATH"]="$KERNELSU_PATH") - fi - if [ "$GAPPS_BRAND" != 'none' ]; then - update_gapps_zip_name - 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" + if [ -f "$DOWNLOAD_DIR/$DOWNLOAD_CONF_NAME" ]; then + 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 + abort "We have encountered an error while downloading files." fi - done - if [ "$OFFLINE_ERR" ]; then - echo "Offline mode: Some files are missing, please disable offline mode." - exit 1 fi - 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?" +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" ["CUST_PATH"]="$CUST_PATH") +fi +if [ "$ROOT_SOL" = "kernelsu" ]; then + update_ksu_zip_name + FILES_CHECK_LIST+=(["KERNELSU_PATH"]="$KERNELSU_PATH") +fi +if [ "$HAS_GAPPS" ]; then + update_gapps_files_name + FILES_CHECK_LIST+=(["GAPPS_IMAGE_PATH"]="$GAPPS_IMAGE_PATH" ["GAPPS_RC_PATH"]="$GAPPS_RC_PATH") +fi +for i in "${FILES_CHECK_LIST[@]}"; do + if [ ! -f "$i" ]; then + echo "Offline mode: missing [$i]" + FILE_MISSING="1" 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 +done +if [ "$FILE_MISSING" ]; then + abort "Some files are missing" fi - -if [ "$GAPPS_BRAND" != "none" ] || [ "$ROOT_SOL" = "magisk" ]; then - echo "Extract Magisk" +if [ "$HAS_GAPPS" ] || [ "$ROOT_SOL" = "magisk" ]; then + echo "Extracting Magisk" if [ -f "$MAGISK_PATH" ]; then MAGISK_VERSION_NAME="" MAGISK_VERSION_CODE=0 @@ -599,24 +454,41 @@ if [ "$GAPPS_BRAND" != "none" ] || [ "$ROOT_SOL" = "magisk" ]; then if [ "$MAGISK_VERSION_CODE" -lt 26000 ] && [ "$MAGISK_VER" != "stable" ] && [ -z ${CUSTOM_MAGISK+x} ]; then abort "Please install Magisk 26.0+" 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 + chmod +x "$WORK_DIR/magisk/magiskboot" || abort elif [ -z "${CUSTOM_MAGISK+x}" ]; then - echo "The Magisk zip package does not exist, is the download incomplete?" - exit 1 + abort "The Magisk zip package does not exist, is the download incomplete?" else - echo "The Magisk zip package does not exist, rename it to magisk-debug.zip and put it in the download folder." - exit 1 + abort "The Magisk zip package does not exist, rename it to magisk-debug.zip and put it in the download folder." fi echo -e "done\n" fi -if [ "$ROOT_SOL" = "kernelsu" ]; then - update_ksu_zip_name - echo "Extract KernelSU" +if [ "$HAS_GAPPS" ] || [ "$ROOT_SOL" = "magisk" ]; then + echo "Integrating Magisk" + "$WORK_DIR/magisk/magiskboot" compress=xz "$WORK_DIR/magisk/magisk64" "$WORK_DIR/magisk/magisk64.xz" + "$WORK_DIR/magisk/magiskboot" compress=xz "$WORK_DIR/magisk/magisk32" "$WORK_DIR/magisk/magisk32.xz" + "$WORK_DIR/magisk/magiskboot" compress=xz "$MAGISK_PATH" "$WORK_DIR/magisk/stub.xz" + "$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 overlay.d/init.lsp.magisk.rc init.lsp.magisk.rc" \ + "add 000 overlay.d/sbin/post-fs-data.sh post-fs-data.sh" \ + "add 000 overlay.d/sbin/lsp_cust.img $CUST_PATH" \ + || abort "Unable to patch initrd" +elif [ "$ROOT_SOL" = "kernelsu" ]; then + echo "Extracting 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?" @@ -626,339 +498,28 @@ if [ "$ROOT_SOL" = "kernelsu" ]; then elif [ "$ARCH" = "arm64" ]; then mv "$WORK_DIR/kernelsu/Image" "$WORK_DIR/kernelsu/kernel" fi - echo -e "done\n" -fi - -if [ "$GAPPS_BRAND" != 'none' ]; then - update_gapps_zip_name - echo "Extract $GAPPS_BRAND" - mkdir -p "$WORK_DIR/gapps" || abort - if [ -f "$GAPPS_PATH" ]; then - if [ "$GAPPS_BRAND" = "OpenGApps" ]; then - if ! unzip -p "$GAPPS_PATH" {Core,GApps}/'*.lz' | tar --lzip -C "$WORK_DIR/gapps" -xf - -i --strip-components=2 --exclude='setupwizardtablet-x86_64' --exclude='packageinstallergoogle-all' --exclude='speech-common' --exclude='markup-lib-arm' --exclude='markup-lib-arm64' --exclude='markup-all' --exclude='setupwizarddefault-x86_64' --exclude='pixellauncher-all' --exclude='pixellauncher-common'; then - CLEAN_DOWNLOAD_GAPPS=1 - abort "Unzip OpenGApps failed, is the download incomplete?" - fi - else - if ! unzip "$GAPPS_PATH" "system/*" -x "system/addon.d/*" "system/product/priv-app/VelvetTitan/*" "system/system_ext/priv-app/SetupWizard/*" -d "$WORK_DIR/gapps"; then - CLEAN_DOWNLOAD_GAPPS=1 - abort "Unzip MindTheGapps failed, package is corrupted?" - fi - mv "$WORK_DIR/gapps/system/"* "$WORK_DIR/gapps" || abort - rm -rf "${WORK_DIR:?}/gapps/system" || abort - fi - cp -r "../$ARCH/gapps/"* "$WORK_DIR/gapps" || abort - else - abort "The $GAPPS_BRAND zip package does not exist." - fi - echo -e "Extract done\n" -fi - -if [ -f "$WORK_DIR/wsa/$ARCH/system.vhdx" ]; then - VM_IMAGES_USE_VHDX=1 - echo "Convert vhdx to RAW image" - vhdx_to_raw_img "$WORK_DIR/wsa/$ARCH/system_ext.vhdx" "$WORK_DIR/wsa/$ARCH/system_ext.img" || abort - vhdx_to_raw_img "$WORK_DIR/wsa/$ARCH/product.vhdx" "$WORK_DIR/wsa/$ARCH/product.img" || abort - vhdx_to_raw_img "$WORK_DIR/wsa/$ARCH/system.vhdx" "$WORK_DIR/wsa/$ARCH/system.img" || abort - vhdx_to_raw_img "$WORK_DIR/wsa/$ARCH/vendor.vhdx" "$WORK_DIR/wsa/$ARCH/vendor.img" || abort - echo -e "Convert vhdx to RAW image done\n" - SYSTEMIMAGES_FILE_SYSTEM_TYPE=$(check_image_type "$WORK_DIR/wsa/$ARCH/system.img") - echo "Mount images" - sudo mkdir -p -m 755 "$ROOT_MNT_RO" || abort - sudo chown "0:0" "$ROOT_MNT_RO" || abort - sudo setfattr -n security.selinux -v "u:object_r:rootfs:s0" "$ROOT_MNT_RO" || abort - if [ "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" = "ext4" ]; then - sudo mount -vo loop,ro "$WORK_DIR/wsa/$ARCH/system.img" "$ROOT_MNT_RO" || abort - sudo mount -vo loop,ro "$WORK_DIR/wsa/$ARCH/vendor.img" "$VENDOR_MNT_RO" || abort - sudo mount -vo loop,ro "$WORK_DIR/wsa/$ARCH/product.img" "$PRODUCT_MNT_RO" || abort - sudo mount -vo loop,ro "$WORK_DIR/wsa/$ARCH/system_ext.img" "$SYSTEM_EXT_MNT_RO" || abort - elif [ "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" = "erofs" ]; then - mount_erofs "$WORK_DIR/wsa/$ARCH/system.img" "$ROOT_MNT_RO" || abort - mount_erofs "$WORK_DIR/wsa/$ARCH/vendor.img" "$VENDOR_MNT_RO" || abort - mount_erofs "$WORK_DIR/wsa/$ARCH/product.img" "$PRODUCT_MNT_RO" || abort - mount_erofs "$WORK_DIR/wsa/$ARCH/system_ext.img" "$SYSTEM_EXT_MNT_RO" || abort - else - abort "Unknown file system type: $SYSTEMIMAGES_FILE_SYSTEM_TYPE" - fi - echo -e "done\n" - echo "Create overlayfs" - mk_overlayfs system "$ROOT_MNT_RO" "$SYSTEM_MNT_RW" "$ROOT_MNT" || abort - mk_overlayfs vendor "$VENDOR_MNT_RO" "$VENDOR_MNT_RW" "$VENDOR_MNT" || abort - mk_overlayfs product "$PRODUCT_MNT_RO" "$PRODUCT_MNT_RW" "$PRODUCT_MNT" || abort - mk_overlayfs system_ext "$SYSTEM_EXT_MNT_RO" "$SYSTEM_EXT_MNT_RW" "$SYSTEM_EXT_MNT" || abort - echo -e "Create overlayfs done\n" -else - echo "Calculate the required space" - EXTRA_SIZE=10240 - - SYSTEM_EXT_NEED_SIZE=$EXTRA_SIZE - if [ -d "$WORK_DIR/gapps/system_ext" ]; then - SYSTEM_EXT_NEED_SIZE=$((SYSTEM_EXT_NEED_SIZE + $(du --apparent-size -sB512 "$WORK_DIR/gapps/system_ext" | cut -f1))) - fi - - PRODUCT_NEED_SIZE=$EXTRA_SIZE - if [ -d "$WORK_DIR/gapps/product" ]; then - PRODUCT_NEED_SIZE=$((PRODUCT_NEED_SIZE + $(du --apparent-size -sB512 "$WORK_DIR/gapps/product" | cut -f1))) - fi - - SYSTEM_NEED_SIZE=$EXTRA_SIZE - if [ -d "$WORK_DIR/gapps" ]; then - SYSTEM_NEED_SIZE=$((SYSTEM_NEED_SIZE + $(du --apparent-size -sB512 "$WORK_DIR/gapps" | cut -f1) - PRODUCT_NEED_SIZE - SYSTEM_EXT_NEED_SIZE)) - fi - if [ "$ROOT_SOL" = "magisk" ]; then - if [ -d "$WORK_DIR/magisk" ]; then - MAGISK_SIZE=$(du --apparent-size -sB512 "$WORK_DIR/magisk/magisk" | cut -f1) - SYSTEM_NEED_SIZE=$((SYSTEM_NEED_SIZE + MAGISK_SIZE)) - fi - if [ -f "$MAGISK_PATH" ]; then - MAGISK_APK_SIZE=$(du --apparent-size -sB512 "$MAGISK_PATH" | cut -f1) - SYSTEM_NEED_SIZE=$((SYSTEM_NEED_SIZE + MAGISK_APK_SIZE)) - fi - fi - if [ -d "../$ARCH/system" ]; then - SYSTEM_NEED_SIZE=$((SYSTEM_NEED_SIZE + $(du --apparent-size -sB512 "../$ARCH/system" | cut -f1))) - fi - VENDOR_NEED_SIZE=$EXTRA_SIZE - echo -e "done\n" - echo "Expand images" - SYSTEM_EXT_IMG_SIZE=$(du --apparent-size -sB512 "$WORK_DIR/wsa/$ARCH/system_ext.img" | cut -f1) - PRODUCT_IMG_SIZE=$(du --apparent-size -sB512 "$WORK_DIR/wsa/$ARCH/product.img" | cut -f1) - SYSTEM_IMG_SIZE=$(du --apparent-size -sB512 "$WORK_DIR/wsa/$ARCH/system.img" | cut -f1) - VENDOR_IMG_SIZE=$(du --apparent-size -sB512 "$WORK_DIR/wsa/$ARCH/vendor.img" | cut -f1) - SYSTEM_EXT_TARGET_SIZE=$((SYSTEM_EXT_NEED_SIZE * 2 + SYSTEM_EXT_IMG_SIZE)) - PRODUCT_TAGET_SIZE=$((PRODUCT_NEED_SIZE * 2 + PRODUCT_IMG_SIZE)) - SYSTEM_TAGET_SIZE=$((SYSTEM_IMG_SIZE * 2)) - VENDOR_TAGET_SIZE=$((VENDOR_NEED_SIZE * 2 + VENDOR_IMG_SIZE)) - - resize_img "$WORK_DIR/wsa/$ARCH/system_ext.img" "$SYSTEM_EXT_TARGET_SIZE"s || abort - resize_img "$WORK_DIR/wsa/$ARCH/product.img" "$PRODUCT_TAGET_SIZE"s || abort - resize_img "$WORK_DIR/wsa/$ARCH/system.img" "$SYSTEM_TAGET_SIZE"s || abort - resize_img "$WORK_DIR/wsa/$ARCH/vendor.img" "$VENDOR_TAGET_SIZE"s || abort - - echo -e "Expand images done\n" - - echo "Mount images" - sudo mkdir "$ROOT_MNT" || abort - sudo mount -vo loop "$WORK_DIR/wsa/$ARCH/system.img" "$ROOT_MNT" || abort - sudo mount -vo loop "$WORK_DIR/wsa/$ARCH/vendor.img" "$VENDOR_MNT" || abort - sudo mount -vo loop "$WORK_DIR/wsa/$ARCH/product.img" "$PRODUCT_MNT" || abort - sudo mount -vo loop "$WORK_DIR/wsa/$ARCH/system_ext.img" "$SYSTEM_EXT_MNT" || abort - echo -e "done\n" -fi -if [ "$REMOVE_AMAZON" ]; then - echo "Remove Amazon Appstore" - find "${PRODUCT_MNT:?}"/{etc/permissions,etc/sysconfig,framework,priv-app} 2>/dev/null | grep -e amazon -e venezia | sudo xargs rm -rf - find "${SYSTEM_EXT_MNT:?}"/{etc/*permissions,framework,priv-app} 2>/dev/null | grep -e amazon -e venezia | sudo xargs rm -rf - rm -f "$WORK_DIR/wsa/$ARCH/apex/mado_release.apex" - find "${PRODUCT_MNT:?}"/{apex,etc/*permissions} 2>/dev/null | grep -e mado | sudo xargs rm -rf - echo -e "done\n" -fi - -echo "Add device administration features" -sudo sed -ie '/cts/a \ ' -e '/print/i \ ' "$VENDOR_MNT/etc/permissions/windows.permissions.xml" -sudo setfattr -n security.selinux -v "u:object_r:vendor_configs_file:s0" "$VENDOR_MNT/etc/permissions/windows.permissions.xml" || abort -echo -e "done\n" - -if [ "$ROOT_SOL" = 'magisk' ]; then - echo "Integrate Magisk" - sudo cp "$WORK_DIR/magisk/magisk/"* "$ROOT_MNT/debug_ramdisk/" - sudo cp "$MAGISK_PATH" "$ROOT_MNT/debug_ramdisk/stub.apk" || abort - sudo tee -a "$ROOT_MNT/debug_ramdisk/loadpolicy.sh" </dev/null || abort -#!/system/bin/sh -MAGISKTMP=/debug_ramdisk -export MAGISKTMP -mkdir -p /data/adb/magisk -cp \$MAGISKTMP/* /data/adb/magisk/ -sync -chmod -R 755 /data/adb/magisk -restorecon -R /data/adb/magisk -MAKEDEV=1 \$MAGISKTMP/magisk --preinit-device 2>&1 -RULESCMD="" -for r in \$MAGISKTMP/.magisk/preinit/*/sepolicy.rule; do - [ -f "\$r" ] || continue - RULESCMD="\$RULESCMD --apply \$r" -done -\$MAGISKTMP/magiskpolicy --live \$RULESCMD 2>&1 -EOF - sudo find "$ROOT_MNT/debug_ramdisk" -type f -exec chmod 0711 {} \; - sudo find "$ROOT_MNT/debug_ramdisk" -type f -exec chown root:root {} \; - sudo find "$ROOT_MNT/debug_ramdisk" -type f -exec setfattr -n security.selinux -v "u:object_r:magisk_file:s0" {} \; || abort - echo "/debug_ramdisk(/.*)? u:object_r:magisk_file:s0" | sudo tee -a "$VENDOR_MNT/etc/selinux/vendor_file_contexts" - echo '/data/adb/magisk(/.*)? u:object_r:magisk_file:s0' | sudo tee -a "$VENDOR_MNT/etc/selinux/vendor_file_contexts" - sudo LD_LIBRARY_PATH="../linker/$HOST_ARCH" "$WORK_DIR/magisk/magiskpolicy" --load "$VENDOR_MNT/etc/selinux/precompiled_sepolicy" --save "$VENDOR_MNT/etc/selinux/precompiled_sepolicy" --magisk || abort - NEW_INITRC_DIR=$SYSTEM_MNT/etc/init/hw - sudo tee -a "$SYSTEM_MNT/etc/init/hw/init.rc" </dev/null -on post-fs-data - mkdir /dev/debug_ramdisk_mirror - mount none /debug_ramdisk /dev/debug_ramdisk_mirror bind - mount none none /dev/debug_ramdisk_mirror private - mount tmpfs magisk /debug_ramdisk mode=0755 - copy /dev/debug_ramdisk_mirror/magisk64 /debug_ramdisk/magisk64 - chmod 0755 /debug_ramdisk/magisk64 - symlink ./magisk64 /debug_ramdisk/magisk - symlink ./magisk64 /debug_ramdisk/su - symlink ./magisk64 /debug_ramdisk/resetprop - start adbd - copy /dev/debug_ramdisk_mirror/magisk32 /debug_ramdisk/magisk32 - chmod 0755 /debug_ramdisk/magisk32 - copy /dev/debug_ramdisk_mirror/magiskinit /debug_ramdisk/magiskinit - chmod 0750 /debug_ramdisk/magiskinit - copy /dev/debug_ramdisk_mirror/magiskpolicy /debug_ramdisk/magiskpolicy - chmod 0755 /debug_ramdisk/magiskpolicy - mkdir /debug_ramdisk/.magisk - mkdir /debug_ramdisk/.magisk/mirror 0 - mkdir /debug_ramdisk/.magisk/block 0 - mkdir /debug_ramdisk/.magisk/worker 0 - copy /dev/debug_ramdisk_mirror/stub.apk /debug_ramdisk/stub.apk - chmod 0644 /debug_ramdisk/stub.apk - copy /dev/debug_ramdisk_mirror/loadpolicy.sh /debug_ramdisk/loadpolicy.sh - chmod 0755 /debug_ramdisk/loadpolicy.sh - umount /dev/debug_ramdisk_mirror - rmdir /dev/debug_ramdisk_mirror - exec u:r:magisk:s0 0 0 -- /system/bin/sh /debug_ramdisk/loadpolicy.sh - exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --post-fs-data - -on property:vold.decrypt=trigger_restart_framework - exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --service - -on nonencrypted - exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --service - -on property:sys.boot_completed=1 - exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --boot-complete - -on property:init.svc.zygote=stopped - exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --zygote-restart -EOF - -for i in "$NEW_INITRC_DIR"/*; do - if [[ "$i" =~ init.zygote.+\.rc ]]; then - echo "Inject zygote restart $i" - sudo awk -i inplace '{if($0 ~ /service zygote /){print $0;print " exec u:r:magisk:s0 0 0 -- /debug_ramdisk/magisk --zygote-restart";a="";next}} 1' "$i" - sudo setfattr -n security.selinux -v "u:object_r:system_file:s0" "$i" || abort - fi -done - - 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 - -echo "Add extra packages" -sudo cp -r "../$ARCH/system/"* "$SYSTEM_MNT" || abort -find "../$ARCH/system/priv-app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/priv-app/placeholder" -type d -exec chmod 0755 {} \; -find "../$ARCH/system/priv-app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/priv-app/placeholder" -type f -exec chmod 0644 {} \; -find "../$ARCH/system/priv-app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/priv-app/placeholder" -exec chown root:root {} \; -find "../$ARCH/system/priv-app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/priv-app/placeholder" -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort -echo -e "Add extra packages done\n" - -if [ "$GAPPS_BRAND" != 'none' ]; then - echo "Integrate $GAPPS_BRAND" - find "$WORK_DIR/gapps/" -mindepth 1 -type d -exec sudo chmod 0755 {} \; - find "$WORK_DIR/gapps/" -mindepth 1 -type d -exec sudo chown root:root {} \; - file_list="$(find "$WORK_DIR/gapps/" -mindepth 1 -type f)" - for file in $file_list; do - sudo chown root:root "$file" - sudo chmod 0644 "$file" - done - - if [ "$GAPPS_BRAND" = "OpenGApps" ]; then - find "$WORK_DIR/gapps/" -maxdepth 1 -mindepth 1 -type d -exec sudo cp --preserve=all -r {} "$SYSTEM_MNT" \; || abort - elif [ "$GAPPS_BRAND" = "MindTheGapps" ]; then - sudo cp --preserve=all -r "$WORK_DIR/gapps/system_ext/"* "$SYSTEM_EXT_MNT/" || abort - if [ -e "$SYSTEM_EXT_MNT/priv-app/SetupWizard" ]; then - rm -rf "${SYSTEM_EXT_MNT:?}/priv-app/Provision" - fi - fi - sudo cp --preserve=all -r "$WORK_DIR/gapps/product/"* "$PRODUCT_MNT" || abort - - find "$WORK_DIR/gapps/product/overlay" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/overlay/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/product/etc/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/etc/placeholder" -type d -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/product/etc/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/etc/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - - if [ "$GAPPS_BRAND" = "OpenGApps" ]; then - find "$WORK_DIR/gapps/app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/app/placeholder" -type d -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/framework/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/framework/placeholder" -type d -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/priv-app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/priv-app/placeholder" -type d -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/app/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/framework/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/framework/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/priv-app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/priv-app/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/etc/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/etc/placeholder" -type d -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/etc/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_MNT/etc/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - else - sudo setfattr -n security.selinux -v "u:object_r:system_file:s0" "$PRODUCT_MNT/framework" || abort - find "$WORK_DIR/gapps/product/app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/app/placeholder" -type d -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/product/priv-app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/priv-app/placeholder" -type d -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/product/framework/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/framework/placeholder" -type d -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - - find "$WORK_DIR/gapps/product/app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/app/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/product/priv-app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/priv-app/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/product/framework/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/framework/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/system_ext/etc/permissions/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_EXT_MNT/etc/permissions/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - - sudo setfattr -n security.selinux -v "u:object_r:system_lib_file:s0" "$PRODUCT_MNT/lib" || abort - find "$WORK_DIR/gapps/product/lib/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/lib/placeholder" -exec setfattr -n security.selinux -v "u:object_r:system_lib_file:s0" {} \; || abort - find "$WORK_DIR/gapps/product/lib64/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$PRODUCT_MNT/lib64/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_lib_file:s0" {} \; || abort - find "$WORK_DIR/gapps/system_ext/priv-app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_EXT_MNT/priv-app/placeholder" -type d -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/system_ext/etc/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_EXT_MNT/etc/placeholder" -type d -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - find "$WORK_DIR/gapps/system_ext/priv-app/" -maxdepth 1 -mindepth 1 -printf '%P\n' | xargs -I placeholder sudo find "$SYSTEM_EXT_MNT/priv-app/placeholder" -type f -exec setfattr -n security.selinux -v "u:object_r:system_file:s0" {} \; || abort - fi - - sudo LD_LIBRARY_PATH="../linker/$HOST_ARCH" "$WORK_DIR/magisk/magiskpolicy" --load "$VENDOR_MNT/etc/selinux/precompiled_sepolicy" --save "$VENDOR_MNT/etc/selinux/precompiled_sepolicy" "allow gmscore_app gmscore_app vsock_socket { create connect write read }" "allow gmscore_app device_config_runtime_native_boot_prop file read" "allow gmscore_app system_server_tmpfs dir search" "allow gmscore_app system_server_tmpfs file open" "allow gmscore_app system_server_tmpfs filesystem getattr" "allow gmscore_app gpu_device dir search" "allow gmscore_app media_rw_data_file filesystem getattr" || abort - echo -e "Integrate $GAPPS_BRAND done\n" -fi - -if [ "$GAPPS_BRAND" != 'none' ]; then - if [ "$NOFIX_PROPS" ]; then - echo -e "Skip fix $GAPPS_BRAND prop!\n$GAPPS_PROPS_MSG1\n$GAPPS_PROPS_MSG2\n$GAPPS_PROPS_MSG3\n" - else - echo "Fix $GAPPS_BRAND prop" - sudo python3 fixGappsProp.py "$ROOT_MNT" || abort +echo -e "done\n" +if [ "$HAS_GAPPS" ]; then + update_gapps_files_name + if [ -f "$GAPPS_IMAGE_PATH" ] && [ -f "$GAPPS_RC_PATH" ]; then + echo "Integrating GApps" + "$WORK_DIR/magisk/magiskboot" cpio "$WORK_DIR/wsa/$ARCH/Tools/initrd.img" \ + "add 000 /lspolicy.rule sepolicy.rule" \ + "add 000 overlay.d/gapps.rc $GAPPS_RC_PATH" \ + "add 000 overlay.d/sbin/lsp_gapps.img $GAPPS_IMAGE_PATH" \ + || abort "Unable to patch initrd" echo -e "done\n" + else + abort "The GApps package does not exist." fi fi -if [ "$VM_IMAGES_USE_VHDX" ]; then - echo "Create system images" - mk_image_umount "$VENDOR_MNT" "$WORK_DIR/wsa/$ARCH/vendor.img" "$VENDOR_MNT_RW" "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" || abort - mk_image_umount "$PRODUCT_MNT" "$WORK_DIR/wsa/$ARCH/product.img" "$PRODUCT_MNT_RW" "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" || abort - mk_image_umount "$SYSTEM_EXT_MNT" "$WORK_DIR/wsa/$ARCH/system_ext.img" "$SYSTEM_EXT_MNT_RW" "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" || abort - mk_image_umount "$ROOT_MNT" "$WORK_DIR/wsa/$ARCH/system.img" "$SYSTEM_MNT_RW" "$SYSTEMIMAGES_FILE_SYSTEM_TYPE" || abort - echo -e "Create system images done\n" - echo "Umount images" - sudo umount -v "$VENDOR_MNT_RO" - sudo umount -v "$PRODUCT_MNT_RO" - sudo umount -v "$SYSTEM_EXT_MNT_RO" - sudo umount -v "$ROOT_MNT_RO" - echo -e "done\n" - echo "Convert images to vhdx" - qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/system_ext.img" "$WORK_DIR/wsa/$ARCH/system_ext.vhdx" || abort - qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/product.img" "$WORK_DIR/wsa/$ARCH/product.vhdx" || abort - qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/system.img" "$WORK_DIR/wsa/$ARCH/system.vhdx" || abort - qemu-img convert -q -f raw -o subformat=fixed -O vhdx "$WORK_DIR/wsa/$ARCH/vendor.img" "$WORK_DIR/wsa/$ARCH/vendor.vhdx" || abort - rm -f "$WORK_DIR/wsa/$ARCH/"*.img || abort - echo -e "Convert images to vhdx done\n" -else - echo "Umount images" - sudo find "$ROOT_MNT" -exec touch -ht 200901010000.00 {} \; - sudo umount -v "$VENDOR_MNT" - sudo umount -v "$PRODUCT_MNT" - sudo umount -v "$SYSTEM_EXT_MNT" - sudo umount -v "$ROOT_MNT" - echo -e "done\n" - echo "Shrink images" - resize_img "$WORK_DIR/wsa/$ARCH/system.img" || abort - resize_img "$WORK_DIR/wsa/$ARCH/vendor.img" || abort - resize_img "$WORK_DIR/wsa/$ARCH/product.img" || abort - resize_img "$WORK_DIR/wsa/$ARCH/system_ext.img" || abort - echo -e "Shrink images done\n" -fi - -echo "Remove signature and add scripts" -sudo rm -rf "${WORK_DIR:?}"/wsa/"$ARCH"/\[Content_Types\].xml "$WORK_DIR/wsa/$ARCH/AppxBlockMap.xml" "$WORK_DIR/wsa/$ARCH/AppxSignature.p7x" "$WORK_DIR/wsa/$ARCH/AppxMetadata" || abort +echo "Removing signature and add scripts" +rm -rf "${WORK_DIR:?}"/wsa/"$ARCH"/\[Content_Types\].xml "$WORK_DIR/wsa/$ARCH/AppxBlockMap.xml" "$WORK_DIR/wsa/$ARCH/AppxSignature.p7x" "$WORK_DIR/wsa/$ARCH/AppxMetadata" || abort cp "$vclibs_PATH" "$xaml_PATH" "$WORK_DIR/wsa/$ARCH" || abort cp "$UWPVCLibs_PATH" "$xaml_PATH" "$WORK_DIR/wsa/$ARCH" || abort cp "../bin/$ARCH/makepri.exe" "$WORK_DIR/wsa/$ARCH" || abort @@ -967,9 +528,7 @@ cp ../installer/MakePri.ps1 "$WORK_DIR/wsa/$ARCH" || abort cp ../installer/Install.ps1 "$WORK_DIR/wsa/$ARCH" || abort cp ../installer/Run.bat "$WORK_DIR/wsa/$ARCH" || abort find "$WORK_DIR/wsa/$ARCH" -maxdepth 1 -mindepth 1 -printf "%P\n" >"$WORK_DIR/wsa/$ARCH/filelist.txt" || abort -echo -e "Remove signature and add scripts done\n" - -echo "Generate info" +echo -e "done\n" if [[ "$ROOT_SOL" = "none" ]]; then name1="" @@ -978,59 +537,36 @@ elif [ "$ROOT_SOL" = "magisk" ]; then elif [ "$ROOT_SOL" = "kernelsu" ]; then name1="-with-$ROOT_SOL-$KERNELSU_VER" fi -if [ "$GAPPS_BRAND" = "none" ]; then +if [ -z "$HAS_GAPPS" ]; then name2="-NoGApps" else - if [ "$GAPPS_BRAND" = "OpenGApps" ]; then - name2=-$GAPPS_BRAND-${ANDROID_API_MAP[$ANDROID_API]}-${GAPPS_VARIANT} - else - name2=-$GAPPS_BRAND-${ANDROID_API_MAP[$ANDROID_API]} - fi - if [ "$GAPPS_BRAND" = "OpenGApps" ]; then - echo -e "\033[0;31m:warning: Since $GAPPS_BRAND doesn't officially support Android 12.1 and 13 yet, lock the variant to pico! - $GAPPS_BRAND may cause startup failure - \033[0m" - fi + name2=-GApps-${ANDROID_API_MAP[$ANDROID_API]} fi artifact_name=WSA_${WSA_VER}_${ARCH}_${WSA_REL}${name1}${name2} -if [ "$NOFIX_PROPS" = "yes" ]; then - artifact_name+="-NoFixProps" -fi -if [ "$REMOVE_AMAZON" = "yes" ]; then - artifact_name+="-RemovedAmazon" -fi -echo "$artifact_name" -echo -e "\nFinishing building...." + if [ -f "$OUTPUT_DIR" ]; then - sudo rm -rf ${OUTPUT_DIR:?} + rm -rf ${OUTPUT_DIR:?} fi if [ ! -d "$OUTPUT_DIR" ]; then mkdir -p "$OUTPUT_DIR" fi OUTPUT_PATH="${OUTPUT_DIR:?}/$artifact_name" -if [ "$COMPRESS_OUTPUT" ] || [ -n "$COMPRESS_FORMAT" ]; then +if [ "$COMPRESS_FORMAT" != "none" ]; then mv "$WORK_DIR/wsa/$ARCH" "$WORK_DIR/wsa/$artifact_name" - if [ -z "$COMPRESS_FORMAT" ]; then - COMPRESS_FORMAT="7z" - fi if [ -n "$COMPRESS_FORMAT" ]; then FILE_EXT=".$COMPRESS_FORMAT" OUTPUT_PATH="$OUTPUT_PATH$FILE_EXT" fi rm -f "${OUTPUT_PATH:?}" || abort if [ "$COMPRESS_FORMAT" = "7z" ]; then - echo "Compressing with 7z" + echo "Compressing with 7z to $OUTPUT_PATH" 7z a "${OUTPUT_PATH:?}" "$WORK_DIR/wsa/$artifact_name" || abort elif [ "$COMPRESS_FORMAT" = "zip" ]; then - echo "Compressing with zip" + echo "Compressing with zip to $OUTPUT_PATH" 7z -tzip a "$OUTPUT_PATH" "$WORK_DIR/wsa/$artifact_name" || abort fi else rm -rf "${OUTPUT_PATH:?}" || abort + echo "Copying to $OUTPUT_PATH" cp -r "$WORK_DIR/wsa/$ARCH" "$OUTPUT_PATH" || abort fi -echo -e "done\n" - -echo "Cleanup Work Directory" -sudo rm -rf "${WORK_DIR:?}" -echo "done" diff --git a/scripts/extractMagisk.py b/scripts/extractMagisk.py index 15ded6a..b5a80df 100644 --- a/scripts/extractMagisk.py +++ b/scripts/extractMagisk.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Affero General Public License # along with MagiskOnWSALocal. If not, see . # -# Copyright (C) 2023 LSPosed Contributors +# Copyright (C) 2024 LSPosed Contributors # import sys @@ -47,9 +47,8 @@ is_x86_64 = platform.machine() in ("AMD64", "x86_64") host_abi = "x64" if is_x86_64 else "arm64" arch = sys.argv[1] magisk_zip = sys.argv[2] -workdir = Path(sys.argv[3]) / "magisk" -if not Path(workdir).is_dir(): - workdir.mkdir() +workdir = Path(sys.argv[3]) +workdir.mkdir(parents=True, exist_ok=True) abi_map = {"x64": ["x86_64", "x86"], "arm64": ["arm64-v8a", "armeabi-v7a"]} @@ -65,40 +64,14 @@ with zipfile.ZipFile(magisk_zip) as zip: versionName = props.get("version") versionCode = props.get("versionCode") print(f"Magisk version: {versionName} ({versionCode})", flush=True) - with open(os.environ['WSA_WORK_ENV'], 'r') as environ_file: - env = Prop(environ_file.read()) - env.MAGISK_VERSION_NAME = versionName - env.MAGISK_VERSION_CODE = versionCode - with open(os.environ['WSA_WORK_ENV'], 'w') as environ_file: - environ_file.write(str(env)) - extract_as( - zip, f"lib/{ abi_map[arch][0] }/libmagisk64.so", "magisk64", "magisk") - extract_as( - zip, f"lib/{ abi_map[arch][1] }/libmagisk32.so", "magisk32", "magisk") - standalone_policy = False - try: - zip.getinfo(f"lib/{ abi_map[arch][0] }/libmagiskpolicy.so") - standalone_policy = True - except: - pass - extract_as( - zip, f"lib/{ abi_map[arch][0] }/libmagiskinit.so", "magiskinit", "magisk") - if standalone_policy: - extract_as( - zip, f"lib/{ abi_map[arch][0] }/libmagiskpolicy.so", "magiskpolicy", "magisk") - else: - extract_as( - zip, f"lib/{ abi_map[arch][0] }/libmagiskinit.so", "magiskpolicy", "magisk") - extract_as( - zip, f"lib/{ abi_map[arch][0] }/libmagiskboot.so", "magiskboot", "magisk") - extract_as( - zip, f"lib/{ abi_map[arch][0] }/libbusybox.so", "busybox", "magisk") - if standalone_policy: - extract_as( - zip, f"lib/{ abi_map[host_abi][0] }/libmagiskpolicy.so", "magiskpolicy", ".") - else: - extract_as( - zip, f"lib/{ abi_map[host_abi][0] }/libmagiskinit.so", "magiskpolicy", ".") - extract_as(zip, f"assets/boot_patch.sh", "boot_patch.sh", "magisk") - extract_as(zip, f"assets/util_functions.sh", - "util_functions.sh", "magisk") + if 'WSA_WORK_ENV' in os.environ and Path(os.environ['WSA_WORK_ENV']).is_file(): + with open(os.environ['WSA_WORK_ENV'], 'r') as environ_file: + env = Prop(environ_file.read()) + env.MAGISK_VERSION_NAME = versionName + env.MAGISK_VERSION_CODE = versionCode + with open(os.environ['WSA_WORK_ENV'], 'w') as environ_file: + environ_file.write(str(env)) + extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagisk64.so", "magisk64", "magisk") + extract_as(zip, f"lib/{ abi_map[arch][1] }/libmagisk32.so", "magisk32", "magisk") + extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagiskinit.so", "magiskinit", "magisk") + extract_as(zip, f"lib/{ abi_map[host_abi][0] }/libmagiskboot.so", "magiskboot", "magisk") diff --git a/scripts/extractWSA.py b/scripts/extractWSA.py index e933383..e564042 100644 --- a/scripts/extractWSA.py +++ b/scripts/extractWSA.py @@ -79,6 +79,10 @@ with zipfile.ZipFile(wsa_zip_path) as zip: if not Path(workdir / zip_name).is_file(): print(f"unzipping {zip_name} to {workdir}", flush=True) zip_path = zip.extract(f, workdir) + with zipfile.ZipFile(zip_path) as zip: + stat = Path(zip_path).stat() + print(f"unzipping from {zip_path}", flush=True) + zip.extractall(archdir) ver_no = zip_name.split("_") long_ver = ver_no[1] ver = long_ver.split(".") @@ -106,7 +110,3 @@ with zipfile.ZipFile(wsa_zip_path) as zip: l.extract(g, xmldir) elif re.search(u'Images/.+\.png', g.filename): l.extract(g, archdir) -with zipfile.ZipFile(zip_path) as zip: - stat = Path(zip_path).stat() - print(f"unzipping from {zip_path}", flush=True) - zip.extractall(archdir) diff --git a/scripts/fixGappsProp.py b/scripts/fixGappsProp.py deleted file mode 100644 index 300b7e2..0000000 --- a/scripts/fixGappsProp.py +++ /dev/null @@ -1,93 +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 . -# -# Copyright (C) 2023 LSPosed Contributors -# - -from __future__ import annotations -from io import TextIOWrapper -from typing import OrderedDict -from pathlib import Path -import sys -class Prop(OrderedDict): - def __init__(self, file: TextIOWrapper) -> None: - super().__init__() - for i, line in enumerate(file.read().splitlines(False)): - if '=' in line: - k, v = line.split('=', 1) - self[k] = v - else: - self[f".{i}"] = line - - def __str__(self) -> str: - return '\n'.join([v if k.startswith('.') else f"{k}={v}" for k, v in self.items()]) - - def __iadd__(self, other: str) -> Prop: - self[f".{len(self)}"] = other - return self - - -new_props = { - ("product", "brand"): "google", - ("product", "manufacturer"): "Google", - ("build", "product"): "redfin", - ("product", "name"): "redfin", - ("product", "device"): "redfin", - ("product", "model"): "Pixel 5", - ("build", "flavor"): "redfin-user" -} - - -def description(sec: str, p: Prop) -> str: - return f"{p[f'ro.{sec}.build.flavor']} {p[f'ro.{sec}.build.version.release_or_codename']} {p[f'ro.{sec}.build.id']} {p[f'ro.{sec}.build.version.incremental']} {p[f'ro.{sec}.build.tags']}" - - -def fingerprint(sec: str, p: Prop) -> str: - return f"""{p[f"ro.product.{sec}.brand"]}/{p[f"ro.product.{sec}.name"]}/{p[f"ro.product.{sec}.device"]}:{p[f"ro.{sec}.build.version.release"]}/{p[f"ro.{sec}.build.id"]}/{p[f"ro.{sec}.build.version.incremental"]}:{p[f"ro.{sec}.build.type"]}/{p[f"ro.{sec}.build.tags"]}""" - - -def fix_prop(sec, prop): - if not Path(prop).is_file(): - return - - print(f"fixing {prop}", flush=True) - with open(prop, 'r') as f: - p = Prop(f) - - p += "# extra prop added by MagiskOnWSA" - - for k, v in new_props.items(): - p[f"ro.{k[0]}.{k[1]}"] = v - - if k[0] == "build": - p[f"ro.{sec}.{k[0]}.{k[1]}"] = v - elif k[0] == "product": - p[f"ro.{k[0]}.{sec}.{k[1]}"] = v - - p["ro.build.description"] = description(sec, p) - p[f"ro.build.fingerprint"] = fingerprint(sec, p) - p[f"ro.{sec}.build.description"] = description(sec, p) - p[f"ro.{sec}.build.fingerprint"] = fingerprint(sec, p) - p[f"ro.bootimage.build.fingerprint"] = fingerprint(sec, p) - - with open(prop, 'w') as f: - f.write(str(p)) - - -sys_path = sys.argv[1] -for sec, prop in {"system": sys_path+"/system/build.prop", "product": sys_path+"/product/build.prop", "system_ext": sys_path+"/system_ext/build.prop", "vendor": sys_path+"/vendor/build.prop", "odm": sys_path+"/vendor/odm/etc/build.prop"}.items(): - fix_prop(sec, prop) diff --git a/scripts/generateGappsLink.py b/scripts/generateGappsLink.py index f07a2b1..addaa36 100644 --- a/scripts/generateGappsLink.py +++ b/scripts/generateGappsLink.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Affero General Public License # along with MagiskOnWSALocal. If not, see . # -# Copyright (C) 2023 LSPosed Contributors +# Copyright (C) 2024 LSPosed Contributors # from datetime import datetime @@ -26,62 +26,54 @@ import json import re from pathlib import Path + +class BearerAuth(requests.auth.AuthBase): + def __init__(self, token): + self.token = token + + def __call__(self, r): + r.headers["authorization"] = "Bearer " + self.token + return r + + +github_auth = None +if Path.cwd().joinpath('token').exists(): + with open(Path.cwd().joinpath('token'), 'r') as token_file: + github_auth = BearerAuth(token_file.read()) + print("Using token file for authentication", flush=True) arch = sys.argv[1] -brand = sys.argv[2] -variant = sys.argv[3] -arg4 = sys.argv[4] -download_dir = Path.cwd().parent / "download" if arg4 == "" else Path(arg4) -tempScript = sys.argv[5] -android_api = sys.argv[6] -file_name = sys.argv[7] -print(f"Generating {brand} download link: arch={arch} variant={variant}", flush=True) +arg2 = sys.argv[2] +download_dir = Path.cwd().parent / "download" if arg2 == "" else Path(arg2) +tempScript = sys.argv[3] +android_api = sys.argv[4] +file_name = sys.argv[5] +print(f"Generating GApps download link: arch={arch}", flush=True) abi_map = {"x64": "x86_64", "arm64": "arm64"} android_api_map = {"30": "11.0", "32": "12.1", "33": "13.0"} release = android_api_map[android_api] -if brand == "OpenGApps": - try: - res = requests.get(f"https://api.opengapps.org/list") - j = json.loads(res.content) - link = {i["name"]: i for i in j["archs"][abi_map[arch]] - ["apis"][release]["variants"]}[variant]["zip"] - DATE = j["archs"][abi_map[arch]]["date"] - print(f"DATE={DATE}", flush=True) - except Exception: - print("Failed to fetch from OpenGApps API, fallbacking to SourceForge RSS...") - res = requests.get( - f'https://sourceforge.net/projects/opengapps/rss?path=/{abi_map[arch]}&limit=100') - link = re.search(f'https://.*{abi_map[arch]}/.*{release}.*{variant}.*\.zip/download', res.text).group().replace( - '.zip/download', '.zip').replace('sourceforge.net/projects/opengapps/files', 'downloads.sourceforge.net/project/opengapps') -elif brand == "MindTheGapps": - res = requests.get( - f'https://sourceforge.net/projects/wsa-mtg/rss?path=/{abi_map[arch]}&limit=100') - matched = re.search(f'https://.*{release}.*{abi_map[arch]}.*\.zip/download', res.text) - if matched: - link = matched.group().replace( - '.zip/download', '.zip').replace('sourceforge.net/projects/wsa-mtg/files', 'downloads.sourceforge.net/project/wsa-mtg') - else: - print(f"Failed to fetch from SourceForge RSS, fallbacking to Github API...", flush=True) - res = requests.get(f"https://api.github.com/repos/MindTheGapps/{release}.0-{abi_map[arch]}/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'.*{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': - 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') +res = requests.get(f"https://api.github.com/repos/LSPosed/WSA-Addon/releases/latest", auth=github_auth) +json_data = json.loads(res.content) +headers = res.headers +x_ratelimit_remaining = headers["x-ratelimit-remaining"] +if res.status_code == 200: + download_files = {} + assets = json_data["assets"] + for asset in assets: + if re.match(f'gapps.*{release}.*\.rc$', asset["name"]): + download_files[asset["name"]] = asset["browser_download_url"] + elif re.match(f'gapps.*{release}.*{abi_map[arch]}.*\.img$', asset["name"]): + download_files[asset["name"]] = asset["browser_download_url"] + with open(download_dir/tempScript, 'a') as f: + for key, value in download_files.items(): + print(f"download link: {value}\npath: {download_dir / key}\n", flush=True) + f.writelines(value + '\n') + f.writelines(f' dir={download_dir}\n') + f.writelines(f' out={key}\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) diff --git a/scripts/generateKernelSULink.py b/scripts/generateKernelSULink.py index 3c36bd9..2650d7f 100644 --- a/scripts/generateKernelSULink.py +++ b/scripts/generateKernelSULink.py @@ -15,7 +15,7 @@ # You should have received a copy of the GNU Affero General Public License # along with MagiskOnWSALocal. If not, see . # -# Copyright (C) 2023 LSPosed Contributors +# Copyright (C) 2024 LSPosed Contributors # from datetime import datetime @@ -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/generateMagiskLink.py b/scripts/generateMagiskLink.py index 1fbffba..2dcf14e 100644 --- a/scripts/generateMagiskLink.py +++ b/scripts/generateMagiskLink.py @@ -18,29 +18,73 @@ # Copyright (C) 2023 LSPosed Contributors # +from datetime import datetime +import re import sys import json import requests from pathlib import Path + +class BearerAuth(requests.auth.AuthBase): + def __init__(self, token): + self.token = token + + def __call__(self, r): + r.headers["authorization"] = "Bearer " + self.token + return r + + +github_auth = None +if Path.cwd().joinpath('token').exists(): + with open(Path.cwd().joinpath('token'), 'r') as token_file: + github_auth = BearerAuth(token_file.read()) + print("Using token file for authentication", flush=True) + magisk_ver = sys.argv[1] -download_dir = Path.cwd().parent / "download" if sys.argv[2] == "" else Path(sys.argv[2]) +download_dir = Path.cwd().parent / \ + "download" if sys.argv[2] == "" else Path(sys.argv[2]) tempScript = sys.argv[3] -print(f"Generating Magisk download link: release type={magisk_ver}", flush=True) +download_files = {} +print( + f"Generating Magisk download link: release type={magisk_ver}", flush=True) if not magisk_ver: magisk_ver = "stable" if magisk_ver == "stable" or magisk_ver == "beta" or magisk_ver == "canary" or magisk_ver == "debug": try: magisk_link = json.loads(requests.get( f"https://github.com/topjohnwu/magisk-files/raw/master/{magisk_ver}.json").content)['magisk']['link'] + download_files[f"magisk-{magisk_ver}.zip"] = magisk_link except Exception: print("Failed to fetch from GitHub API, fallbacking to jsdelivr...") magisk_link = json.loads(requests.get( f"https://fastly.jsdelivr.net/gh/topjohnwu/magisk-files@master/{magisk_ver}.json").content)['magisk']['link'] -print(f"download link: {magisk_link}", flush=True) + download_files[f"magisk-{magisk_ver}.zip"] = magisk_link +res = requests.get( + f"https://api.github.com/repos/LSPosed/WSA-Addon/releases/latest", auth=github_auth) +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'cust.img$', asset["name"]): + download_files[asset["name"]] = asset["browser_download_url"] + break +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) with open(download_dir/tempScript, 'a') as f: - f.writelines(f'{magisk_link}\n') - f.writelines(f' dir={download_dir}\n') - f.writelines(f' out=magisk-{magisk_ver}.zip\n') + for key, value in download_files.items(): + print( + f"download link: {value}\npath: {download_dir / key}\n", flush=True) + f.writelines(value + '\n') + f.writelines(f' dir={download_dir}\n') + f.writelines(f' out={key}\n') diff --git a/scripts/generateWSALinks.py b/scripts/generateWSALinks.py index 5286b5e..66db1bc 100644 --- a/scripts/generateWSALinks.py +++ b/scripts/generateWSALinks.py @@ -15,12 +15,11 @@ # You should have received a copy of the GNU Affero General Public License # along with MagiskOnWSALocal. If not, see . # -# Copyright (C) 2023 LSPosed Contributors +# Copyright (C) 2024 LSPosed Contributors # import html import logging -import os import re import sys @@ -61,7 +60,7 @@ download_dir = Path.cwd().parent / \ "download" if sys.argv[3] == "" else Path(sys.argv[3]) ms_account_conf = download_dir/".ms_account" tempScript = sys.argv[4] -skip_wsa_download = sys.argv[5] == "no" if len(sys.argv) >= 6 else False +skip_wsa_download = sys.argv[5] == "1" if len(sys.argv) >= 6 else False cat_id = '858014f3-3934-4abe-8078-4aa193e74ca8' user = '' session = Session() @@ -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 . -# -# 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) diff --git a/scripts/init.lsp.magisk.rc b/scripts/init.lsp.magisk.rc new file mode 100644 index 0000000..444331e --- /dev/null +++ b/scripts/init.lsp.magisk.rc @@ -0,0 +1,2 @@ +on post-fs-data + exec u:r:magisk:s0 0 0 -- /system/bin/sh ${MAGISKTMP}/post-fs-data.sh diff --git a/scripts/post-fs-data.sh b/scripts/post-fs-data.sh new file mode 100644 index 0000000..6607569 --- /dev/null +++ b/scripts/post-fs-data.sh @@ -0,0 +1,44 @@ +#!/bin/sh +MAGISKTMP=/sbin +[ -d /sbin ] || MAGISKTMP=/debug_ramdisk +MAGISKBIN=/data/adb/magisk +if [ ! -d /data/adb ]; then + mkdir -m 700 /data/adb + chcon u:object_r:adb_data_file:s0 /data/adb +fi +if [ ! -d $MAGISKBIN ]; then + # shellcheck disable=SC2174 + mkdir -p -m 755 $MAGISKBIN + chcon u:object_r:system_file:s0 $MAGISKBIN +fi +ABI=$(getprop ro.product.cpu.abi) +for file in busybox magiskpolicy magiskboot magiskinit; do + [ -x "$MAGISKBIN/$file" ] || { + unzip -d $MAGISKBIN -oj $MAGISKTMP/stub.apk "lib/$ABI/lib$file.so" + mv $MAGISKBIN/lib$file.so $MAGISKBIN/$file + chmod 755 "$MAGISKBIN/$file" + } +done +for file in util_functions.sh boot_patch.sh; do + [ -x "$MAGISKBIN/$file" ] || { + unzip -d $MAGISKBIN -oj $MAGISKTMP/stub.apk "assets/$file" + chmod 755 "$MAGISKBIN/$file" + } +done +for file in "$MAGISKTMP"/*; do + if echo "$file" | grep -Eq "lsp_.+\.img"; then + foldername=$(basename "$file" .img) + mkdir -p "$MAGISKTMP/$foldername" + mount -t auto -o ro,loop "$file" "$MAGISKTMP/$foldername" + "$MAGISKTMP/$foldername/post-fs-data.sh" & + fi +done +wait +for file in "$MAGISKTMP"/*; do + if echo "$file" | grep -Eq "lsp_.+\.img"; then + foldername=$(basename "$file" .img) + umount "$MAGISKTMP/$foldername" + rm -rf "${MAGISKTMP:?}/${foldername:?}" + rm -f "$file" + fi +done diff --git a/scripts/sepolicy.rule b/scripts/sepolicy.rule new file mode 100644 index 0000000..265b4de --- /dev/null +++ b/scripts/sepolicy.rule @@ -0,0 +1,5 @@ +allow gmscore_app gmscore_app vsock_socket { create connect write read } +allow gmscore_app device_config_runtime_native_boot_prop file read +allow gmscore_app system_server_tmpfs dir search +allow gmscore_app system_server_tmpfs file open +allow gmscore_app { system_server_tmpfs media_rw_data_file } filesystem getattr diff --git a/x64/gapps/product/etc/sysconfig/component-overrides.xml b/x64/gapps/product/etc/sysconfig/component-overrides.xml deleted file mode 100644 index 2720650..0000000 --- a/x64/gapps/product/etc/sysconfig/component-overrides.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/x64/gapps/product/overlay/GoogleWebViewOverlay.apk b/x64/gapps/product/overlay/GoogleWebViewOverlay.apk deleted file mode 100644 index cb6f5a3..0000000 Binary files a/x64/gapps/product/overlay/GoogleWebViewOverlay.apk and /dev/null differ diff --git a/x64/system/priv-app/VpnDialogs/VpnDialogs.apk b/x64/system/priv-app/VpnDialogs/VpnDialogs.apk deleted file mode 100644 index c345c99..0000000 Binary files a/x64/system/priv-app/VpnDialogs/VpnDialogs.apk and /dev/null differ