From a2313d7f54e1caef82ed1bc7995def5ce1249c91 Mon Sep 17 00:00:00 2001 From: Howard Wu <40033067+Howard20181@users.noreply.github.com> Date: Wed, 7 Feb 2024 00:47:43 +0800 Subject: [PATCH] Use lspinit to integrate Magisk --- scripts/build.sh | 572 ++--------------------------------- scripts/extractMagisk.py | 47 +-- scripts/generateGappsLink.py | 71 ++--- 3 files changed, 71 insertions(+), 619 deletions(-) diff --git a/scripts/build.sh b/scripts/build.sh index f36e127..c3796a5 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -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 @@ -117,23 +80,17 @@ 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 } @@ -143,97 +100,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 +120,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" @@ -289,9 +137,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,17 +158,6 @@ 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. @@ -336,23 +171,19 @@ Usage: Possible values: $(ARR_TO_STR "${COMPRESS_FORMAT_MAP[@]}") 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 " } @@ -360,8 +191,6 @@ ARGUMENT_LIST=( "arch:" "release-type:" "magisk-ver:" - "gapps-brand:" - "gapps-variant:" "nofix-props" "root-sol:" "compress-format:" @@ -372,6 +201,7 @@ ARGUMENT_LIST=( "debug" "help" "skip-download-wsa" + "install-gapps" ) default @@ -389,12 +219,9 @@ 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 ;; + --install-gapps ) HAS_GAPPS=true; shift 2 ;; --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 ;; @@ -435,8 +262,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[@]}" @@ -479,14 +304,9 @@ 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_file_name() { + GAPPS_FILE_NAME=GApps-$ARCH-${ANDROID_API_MAP[$ANDROID_API]}.apex + GAPPS_PATH=$DOWNLOAD_DIR/$GAPPS_FILE_NAME } WSA_MAJOR_VER=0 update_ksu_zip_name() { @@ -518,7 +338,7 @@ if [ -z ${OFFLINE+x} ]; then if [[ "$WSA_MAJOR_VER" -lt 2211 ]]; then ANDROID_API=32 fi - if [ "$ROOT_SOL" = "magisk" ] || [ "$GAPPS_BRAND" != "none" ]; then + if [ "$ROOT_SOL" = "magisk" ]; then if [ -z ${CUSTOM_MAGISK+x} ]; then python3 generateMagiskLink.py "$MAGISK_VER" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" || abort fi @@ -531,9 +351,9 @@ 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_file_name + python3 generateGappsLink.py "$ARCH" "$DOWNLOAD_DIR" "$DOWNLOAD_CONF_NAME" "$ANDROID_API" "$GAPPS_FILE_NAME" || abort fi echo "Download Artifacts" @@ -547,15 +367,15 @@ else # Offline mode 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 + if [ "$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 + if [ "$HAS_GAPPS" ]; then + update_gapps_file_name FILES_CHECK_LIST+=(["GAPPS_PATH"]="$GAPPS_PATH") fi for i in "${FILES_CHECK_LIST[@]}"; do @@ -585,7 +405,7 @@ else exit 1 fi -if [ "$GAPPS_BRAND" != "none" ] || [ "$ROOT_SOL" = "magisk" ]; then +if [ "$ROOT_SOL" = "magisk" ]; then echo "Extract Magisk" if [ -f "$MAGISK_PATH" ]; then MAGISK_VERSION_NAME="" @@ -602,6 +422,7 @@ if [ "$GAPPS_BRAND" != "none" ] || [ "$ROOT_SOL" = "magisk" ]; then 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 @@ -629,216 +450,13 @@ if [ "$ROOT_SOL" = "kernelsu" ]; then 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 - + "$WORK_DIR/magisk/magiskboot" compress=xz "$WORK_DIR/magisk/magisk64" "$WORK_DIR/magisk/magisk64.xz" + "$WORK_DIR/magisk/magiskboot" compress=xz "$WORK_DIR/magisk/stub.apk" "$WORK_DIR/magisk/stub.xz" + echo "KEEPFORCEENCRYPT=true" >> "$WORK_DIR/magisk/config" + echo "PREINITDEVICE=sde" >> "$WORK_DIR/magisk/config" + "$WORK_DIR/magisk/magiskboot" cpio "$WORK_DIR/wsa/$ARCH/Tools/initrd.img" "mv /init /wsainit" "add 0777 /init ../bin/$ARCH/lspinit" "add 0777 /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/stub.xz $WORK_DIR/magisk/stub.xz" "mkdir 000 .backup" "add 000 .backup/.magisk $WORK_DIR/magisk/config" echo -e "Integrate Magisk done\n" elif [ "$ROOT_SOL" = "kernelsu" ]; then echo "Integrate KernelSU" @@ -847,116 +465,6 @@ elif [ "$ROOT_SOL" = "kernelsu" ]; then 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" - 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 cp "$vclibs_PATH" "$xaml_PATH" "$WORK_DIR/wsa/$ARCH" || abort @@ -978,27 +486,13 @@ 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 diff --git a/scripts/extractMagisk.py b/scripts/extractMagisk.py index 15ded6a..e6bb972 100644 --- a/scripts/extractMagisk.py +++ b/scripts/extractMagisk.py @@ -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,24 @@ 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") + 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") 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") + 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") + extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagiskinit.so", "magiskpolicy", "magisk") + extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagiskinit.so", "magiskinit", "magisk") + extract_as(zip, f"lib/{ abi_map[arch][0] }/libmagiskboot.so", "magiskboot", "magisk") + extract_as(zip, f"assets/stub.apk", "stub.apk", "magisk") diff --git a/scripts/generateGappsLink.py b/scripts/generateGappsLink.py index f07a2b1..3116ed3 100644 --- a/scripts/generateGappsLink.py +++ b/scripts/generateGappsLink.py @@ -27,57 +27,32 @@ import re from pathlib import Path 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) +res = requests.get(f"https://api.github.com/repos/LSPosed/WSA-Addon/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'gapps.*{release}.*{abi_map[arch]}.*\.apex$', asset["name"]): + 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)