16e4c67992
Previously, Magisk uses persist or cache for storing modules' custom sepolicy rules. In this commit, we significantly broaden its compatibility and also prevent mounting errors. The persist partition is non-standard and also critical for Snapdragon devices, so we prefer not to use it by default. We will go through the following logic to find the best suitable non-volatile, writable location to store and load sepolicy.rule files: Unencrypted data -> FBE data unencrypted dir -> cache -> metadata -> persist This should cover almost all possible cases: very old devices have cache partitions; newer devices will use FBE; latest devices will use metadata FBE (which guarantees a metadata parition); and finally, all Snapdragon devices have the persist partition (as a last resort). Fix #3179
173 lines
4.3 KiB
Bash
173 lines
4.3 KiB
Bash
#MAGISK
|
|
############################################
|
|
#
|
|
# Magisk Uninstaller
|
|
# by topjohnwu
|
|
#
|
|
############################################
|
|
|
|
##############
|
|
# Preparation
|
|
##############
|
|
|
|
# This path should work in any cases
|
|
TMPDIR=/dev/tmp
|
|
|
|
INSTALLER=$TMPDIR/install
|
|
CHROMEDIR=$INSTALLER/chromeos
|
|
|
|
# Default permissions
|
|
umask 022
|
|
|
|
OUTFD=$2
|
|
ZIP=$3
|
|
|
|
if [ ! -f $INSTALLER/util_functions.sh ]; then
|
|
echo "! Unable to extract zip file!"
|
|
exit 1
|
|
fi
|
|
|
|
# Load utility functions
|
|
. $INSTALLER/util_functions.sh
|
|
|
|
setup_flashable
|
|
|
|
print_title "Magisk Uninstaller"
|
|
|
|
is_mounted /data || mount /data || abort "! Unable to mount /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
|
|
mount_partitions
|
|
|
|
api_level_arch_detect
|
|
|
|
ui_print "- Device platform: $ARCH"
|
|
MAGISKBIN=$INSTALLER/$ARCH32
|
|
mv $CHROMEDIR $MAGISKBIN
|
|
chmod -R 755 $MAGISKBIN
|
|
|
|
check_data
|
|
$DATA_DE || abort "! Cannot access /data, please uninstall with Magisk Manager"
|
|
$BOOTMODE || recovery_actions
|
|
run_migrations
|
|
|
|
############
|
|
# Uninstall
|
|
############
|
|
|
|
get_flags
|
|
find_boot_image
|
|
|
|
[ -e $BOOTIMAGE ] || abort "! Unable to detect boot image"
|
|
ui_print "- Found target image: $BOOTIMAGE"
|
|
[ -z $DTBOIMAGE ] || ui_print "- Found dtbo image: $DTBOIMAGE"
|
|
|
|
cd $MAGISKBIN
|
|
|
|
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.rc"; 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
|
|
|
|
if [ -f /system/addon.d/99-magisk.sh ]; then
|
|
blockdev --setrw /dev/block/mapper/system$SLOT 2>/dev/null
|
|
mount -o rw,remount /system || mount -o rw,remount /
|
|
rm -f /system/addon.d/99-magisk.sh
|
|
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
|
|
rm -rf /data/data/*magisk* /data/user*/*/*magisk* /data/app/*magisk* /data/app/*/*magisk*
|
|
recovery_cleanup
|
|
ui_print "- Done"
|
|
fi
|
|
|
|
rm -rf $TMPDIR
|
|
exit 0
|