mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-24 10:35:26 +00:00
ec8fffe61c
Distribute Magisk directly with Magisk Manager APK. The APK will contain all required binaries and scripts for installation and uninstallation. App versions will now align with Magisk releases. Extra effort is spent to make the APK itself also a flashable zip that can be used in custom recoveries, so those still prefer to install Magisk with recoveries will not be affected with this change. As a bonus, this makes the whole installation and uninstallation process 100% offline. The existing Magisk Manager was not really functional without an Internet connection, as the installation process was highly tied to zips hosted on the server. An additional bonus: since all binaries are now shipped as "native libraries" of the APK, we can finally bump the target SDK version higher than 28. The target SDK version was stuck at 28 for a long time because newer SELinux restricts running executables from internal storage. More details can be found here: https://github.com/termux/termux-app/issues/1072 The target SDK bump will be addressed in a future commit. Co-authored with @vvb2060
180 lines
4.6 KiB
Bash
180 lines
4.6 KiB
Bash
#MAGISK
|
|
############################################
|
|
# Magisk Uninstaller (updater-script)
|
|
############################################
|
|
|
|
##############
|
|
# Preparation
|
|
##############
|
|
|
|
# Default permissions
|
|
umask 022
|
|
|
|
OUTFD=$2
|
|
APK="$3"
|
|
COMMONDIR=$INSTALLER/assets
|
|
CHROMEDIR=$INSTALLER/assets/chromeos
|
|
|
|
if [ ! -f $COMMONDIR/util_functions.sh ]; then
|
|
echo "! Unable to extract zip file!"
|
|
exit 1
|
|
fi
|
|
|
|
# Load utility functions
|
|
. $COMMONDIR/util_functions.sh
|
|
|
|
setup_flashable
|
|
|
|
############
|
|
# Detection
|
|
############
|
|
|
|
if echo $MAGISK_VER | grep -q '\.'; then
|
|
PRETTY_VER=$MAGISK_VER
|
|
else
|
|
PRETTY_VER="$MAGISK_VER($MAGISK_VER_CODE)"
|
|
fi
|
|
print_title "Magisk $PRETTY_VER Uninstaller"
|
|
|
|
is_mounted /data || mount /data || abort "! Unable to mount /data, please uninstall with Magisk Manager"
|
|
mount_partitions
|
|
check_data
|
|
$DATA_DE || abort "! Cannot access /data, please uninstall with Magisk Manager"
|
|
if ! $BOOTMODE; then
|
|
# Mounting stuffs in recovery (best effort)
|
|
mount_name metadata /metadata
|
|
mount_name "cache cac" /cache
|
|
mount_name persist /persist
|
|
fi
|
|
get_flags
|
|
find_boot_image
|
|
|
|
[ -z $BOOTIMAGE ] && abort "! Unable to detect target image"
|
|
ui_print "- Target image: $BOOTIMAGE"
|
|
|
|
# Detect version and architecture
|
|
api_level_arch_detect
|
|
|
|
ui_print "- Device platform: $ARCH"
|
|
|
|
BINDIR=$INSTALLER/lib/$ARCH32
|
|
[ ! -d "$BINDIR" ] && BINDIR=$INSTALLER/lib/armeabi-v7a
|
|
cd $BINDIR
|
|
for file in lib*.so; do mv "$file" "${file:3:${#file}-6}"; done
|
|
cd /
|
|
chmod -R 755 $CHROMEDIR $BINDIR
|
|
cp -af $CHROMEDIR/. $BINDIR/chromeos
|
|
|
|
############
|
|
# Uninstall
|
|
############
|
|
|
|
cd $BINDIR
|
|
|
|
CHROMEOS=false
|
|
|
|
ui_print "- Unpacking boot image"
|
|
# Dump image for MTD/NAND character device boot partitions
|
|
if [ -c $BOOTIMAGE ]; then
|
|
nanddump -f boot.img $BOOTIMAGE
|
|
BOOTNAND=$BOOTIMAGE
|
|
BOOTIMAGE=boot.img
|
|
fi
|
|
./magiskboot unpack "$BOOTIMAGE"
|
|
|
|
case $? in
|
|
1 )
|
|
abort "! Unsupported/Unknown image format"
|
|
;;
|
|
2 )
|
|
ui_print "- ChromeOS boot image detected"
|
|
CHROMEOS=true
|
|
;;
|
|
esac
|
|
|
|
# Restore the original boot partition path
|
|
[ "$BOOTNAND" ] && BOOTIMAGE=$BOOTNAND
|
|
|
|
# Detect boot image state
|
|
ui_print "- Checking ramdisk status"
|
|
if [ -e ramdisk.cpio ]; then
|
|
./magiskboot cpio ramdisk.cpio test
|
|
STATUS=$?
|
|
else
|
|
# Stock A only system-as-root
|
|
STATUS=0
|
|
fi
|
|
case $((STATUS & 3)) in
|
|
0 ) # Stock boot
|
|
ui_print "- Stock boot image detected"
|
|
;;
|
|
1 ) # Magisk patched
|
|
ui_print "- Magisk patched image detected"
|
|
# Find SHA1 of stock boot image
|
|
SHA1=$(./magiskboot cpio ramdisk.cpio sha1 2>/dev/null)
|
|
BACKUPDIR=/data/magisk_backup_$SHA1
|
|
if [ -d $BACKUPDIR ]; then
|
|
ui_print "- Restoring stock boot image"
|
|
flash_image $BACKUPDIR/boot.img.gz $BOOTIMAGE
|
|
for name in dtb dtbo dtbs; do
|
|
[ -f $BACKUPDIR/${name}.img.gz ] || continue
|
|
IMAGE=$(find_block $name$SLOT)
|
|
[ -z $IMAGE ] && continue
|
|
ui_print "- Restoring stock $name image"
|
|
flash_image $BACKUPDIR/${name}.img.gz $IMAGE
|
|
done
|
|
else
|
|
ui_print "! Boot image backup unavailable"
|
|
ui_print "- Restoring ramdisk with internal backup"
|
|
./magiskboot cpio ramdisk.cpio restore
|
|
if ! ./magiskboot cpio ramdisk.cpio "exists init"; then
|
|
# A only system-as-root
|
|
rm -f ramdisk.cpio
|
|
fi
|
|
./magiskboot repack $BOOTIMAGE
|
|
# Sign chromeos boot
|
|
$CHROMEOS && sign_chromeos
|
|
ui_print "- Flashing restored boot image"
|
|
flash_image new-boot.img $BOOTIMAGE || abort "! Insufficient partition size"
|
|
fi
|
|
;;
|
|
2 ) # Unsupported
|
|
ui_print "! Boot image patched by unsupported programs"
|
|
abort "! Cannot uninstall"
|
|
;;
|
|
esac
|
|
|
|
ui_print "- Removing Magisk files"
|
|
rm -rf \
|
|
/cache/*magisk* /cache/unblock /data/*magisk* /data/cache/*magisk* /data/property/*magisk* \
|
|
/data/Magisk.apk /data/busybox /data/custom_ramdisk_patch.sh /data/adb/*magisk* \
|
|
/data/adb/post-fs-data.d /data/adb/service.d /data/adb/modules* \
|
|
/data/unencrypted/magisk /metadata/magisk /persist/magisk /mnt/vendor/persist/magisk
|
|
|
|
ADDOND=/system/addon.d/99-magisk.sh
|
|
if [ -f $ADDOND ]; then
|
|
blockdev --setrw /dev/block/mapper/system$SLOT 2>/dev/null
|
|
mount -o rw,remount /system || mount -o rw,remount /
|
|
rm -f $ADDOND
|
|
fi
|
|
|
|
cd /
|
|
|
|
if $BOOTMODE; then
|
|
ui_print "********************************************"
|
|
ui_print " Magisk Manager will uninstall itself, and"
|
|
ui_print " the device will reboot after a few seconds"
|
|
ui_print "********************************************"
|
|
(sleep 8; /system/bin/reboot)&
|
|
else
|
|
ui_print "********************************************"
|
|
ui_print " Magisk Manager will not be uninstalled"
|
|
ui_print " Please uninstall it manually after reboot"
|
|
ui_print "********************************************"
|
|
recovery_cleanup
|
|
ui_print "- Done"
|
|
fi
|
|
|
|
rm -rf $TMPDIR
|
|
exit 0
|