diff --git a/jni/Android.mk b/jni/Android.mk index 55cb65c00..63c185b75 100644 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -5,14 +5,12 @@ LOCAL_PATH := $(my_path) include $(CLEAR_VARS) LOCAL_MODULE := magiskhide LOCAL_MODULE_TAGS := optional -LOCAL_FORCE_STATIC_EXECUTABLE := true LOCAL_SRC_FILES := magiskhide.c include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_MODULE := bootimgtools LOCAL_MODULE_TAGS := optional -LOCAL_FORCE_STATIC_EXECUTABLE := true LOCAL_SRC_FILES := bootimgtools.c extract.c repack.c hexpatch.c LOCAL_CFLAGS += -std=gnu11 include $(BUILD_EXECUTABLE) diff --git a/zip_static/common/init.magisk.rc b/zip_static/common/init.magisk.rc index bc0b4e101..d5ba3c132 100644 --- a/zip_static/common/init.magisk.rc +++ b/zip_static/common/init.magisk.rc @@ -13,6 +13,9 @@ on post-fs-data on property:magisk.hide=1 restart magisk_hide +on property:magisk.restart_pfsd=1 + trigger post-fs-data + # Services # launch post-fs script diff --git a/zip_static/common/magic_mask.sh b/zip_static/common/magic_mask.sh index 0d8a904f5..506d92280 100644 --- a/zip_static/common/magic_mask.sh +++ b/zip_static/common/magic_mask.sh @@ -1,24 +1,24 @@ #!/system/bin/sh LOGFILE=/cache/magisk.log -HIDELOG=/cache/magiskhide.log IMG=/data/magisk.img -export MOUNTPOINT=/magisk +MOUNTPOINT=/magisk COREDIR=$MOUNTPOINT/.core -DUMMDIR=$COREDIR/dummy -MIRRDIR=$COREDIR/mirror +TMPDIR=/dev/magisk +DUMMDIR=$TMPDIR/dummy +MIRRDIR=$TMPDIR/mirror +MOUNTINFO=$TMPDIR/mnt -TMPDIR=/dev/tmp +# Use the included busybox for maximum compatibility and reliable results +# e.g. we rely on the option "-c" for cp (reserve contexts), and -exec for find +TOOLPATH=/data/busybox -# Use the included busybox to do everything for maximum compatibility -# We also do so because we rely on the option "-c" for cp (reserve contexts) - -# Reserve the original PATH +# Legacy support for old phh, we don't change PATH now export OLDPATH=$PATH -export PATH="/data/busybox:$PATH" + log_print() { echo $1 @@ -42,17 +42,13 @@ unblock() { run_scripts() { BASE=$MOUNTPOINT - if [ "$1" = "post-fs" ]; then - BASE=/cache/magisk - fi - for MOD in $BASE/* ; do if [ ! -f "$MOD/disable" ]; then if [ -f "$MOD/$1.sh" ]; then chmod 755 $MOD/$1.sh chcon 'u:object_r:system_file:s0' $MOD/$1.sh log_print "$1: $MOD/$1.sh" - $MOD/$1.sh + sh $MOD/$1.sh fi fi done @@ -61,7 +57,7 @@ run_scripts() { loopsetup() { LOOPDEVICE= for DEV in $(ls /dev/block/loop*); do - if [ `losetup $DEV $1 >/dev/null 2>&1; echo $?` -eq 0 ]; then + if [ `$TOOLPATH/losetup $DEV $1 >/dev/null 2>&1; echo $?` -eq 0 ]; then LOOPDEVICE=$DEV break fi @@ -79,8 +75,8 @@ target_size_check() { travel() { cd $1/$2 if [ -f ".replace" ]; then - rm -rf $TMPDIR/$2 - mktouch $TMPDIR/$2 $1 + rm -rf $MOUNTINFO/$2 + mktouch $MOUNTINFO/$2 $1 else for ITEM in * ; do if [ ! -e "/$2/$ITEM" ]; then @@ -89,12 +85,12 @@ travel() { # We cannot add new items to /system root, delete it rm -rf $ITEM else - if [ -d "$TMPDIR/dummy/$2" ]; then + if [ -d "$MOUNTINFO/dummy/$2" ]; then # We are in a higher level, delete the lower levels - rm -rf $TMPDIR/dummy/$2 + rm -rf $MOUNTINFO/dummy/$2 fi # Mount the dummy parent - mktouch $TMPDIR/dummy/$2 + mktouch $MOUNTINFO/dummy/$2 mkdir -p $DUMMDIR/$2 2>/dev/null if [ -d "$ITEM" ]; then @@ -102,7 +98,7 @@ travel() { mkdir -p $DUMMDIR/$2/$ITEM elif [ -L "$ITEM" ]; then # Symlinks are small, copy them - cp -afc $ITEM $DUMMDIR/$2/$ITEM + $TOOLPATH/cp -afc $ITEM $DUMMDIR/$2/$ITEM else # Create new dummy file mktouch $DUMMDIR/$2/$ITEM @@ -116,7 +112,7 @@ travel() { mkdir -p $DUMMDIR$DUMMY elif [ -L "$DUMMY" ]; then # Symlinks are small, copy them - cp -afc $DUMMY $DUMMDIR$DUMMY + $TOOLPATH/cp -afc $DUMMY $DUMMDIR$DUMMY else # Create dummy file mktouch $DUMMDIR$DUMMY @@ -131,7 +127,7 @@ travel() { (travel $1 $2/$ITEM) elif [ ! -L "$ITEM" ]; then # Mount this file - mktouch $TMPDIR/$2/$ITEM $1 + mktouch $MOUNTINFO/$2/$ITEM $1 fi done fi @@ -194,10 +190,13 @@ merge_image() { # Merge (will reserve selinux contexts) cd /cache/merge_img for MOD in *; do - log_print "Merging: $MOD" - rm -rf /cache/data_img/$MOD - cp -afc $MOD /cache/data_img/ + if [ "$MOD" != "lost+found" ]; then + log_print "Merging: $MOD" + rm -rf /cache/data_img/$MOD + $TOOLPATH/cp -afc $MOD /cache/data_img/ + fi done + $TOOLPATH/cp -afc .core/. /cache/data_img/.core 2>/dev/null log_print "Merge complete" fi @@ -206,8 +205,8 @@ merge_image() { fi fi - losetup -d $LOOPDATA - losetup -d $LOOPMERGE + $TOOLPATH/losetup -d $LOOPDATA + $TOOLPATH/losetup -d $LOOPMERGE rmdir /cache/data_img rmdir /cache/merge_img @@ -224,31 +223,12 @@ case $1 in mv $LOGFILE /cache/last_magisk.log touch $LOGFILE chmod 644 $LOGFILE + log_print "Magisk post-fs mode running..." - if [ -d "/cache/magisk_merge" ]; then - cd /cache/magisk_merge - for MOD in *; do - log_print "Merging: $MOD" - rm -rf /cache/magisk/$MOD - mv $MOD /cache/magisk/$MOD - done - rm -rf /cache/magisk_merge - fi + # No more cache mods! + # Only for multirom! - for MOD in /cache/magisk/* ; do - if [ -f "$MOD/remove" ]; then - log_print "Remove module: $MOD" - rm -rf $MOD - elif [ -f "$MOD/auto_mount" -a ! -f "$MOD/disable" ]; then - find $MOD/system -type f 2>/dev/null | while read ITEM ; do - TARGET=${ITEM#$MOD} - bind_mount $ITEM $TARGET - done - fi - done - - run_scripts post-fs unblock ;; @@ -263,143 +243,154 @@ case $1 in unblock fi - log_print "Magisk post-fs-data mode running..." + # Don't run twice + if [ "$(getprop magisk.restart_pfsd)" != "1" ]; then - # Live patch sepolicy - /data/magisk/sepolicy-inject --live -s su + log_print "Magisk post-fs-data mode running..." - [ ! -d "$MOUNTPOINT" ] && mkdir -p $MOUNTPOINT + # Live patch sepolicy + /data/magisk/sepolicy-inject --live -s su - # Cache support - if [ -d "/cache/data_bin" ]; then - rm -rf /data/busybox /data/magisk - mkdir -p /data/busybox - mv /cache/data_bin /data/magisk - chmod 755 /data/busybox /data/magisk /data/magisk/* - chcon 'u:object_r:system_file:s0' /data/busybox /data/magisk /data/magisk/* - /data/magisk/busybox --install -s /data/busybox - # Prevent issues - rm -f /data/busybox/su /data/busybox/sh - fi - mv /cache/stock_boot.img /data 2>/dev/null - - chmod 644 $IMG /cache/magisk.img /data/magisk_merge.img 2>/dev/null - - # Handle image merging - merge_image /cache/magisk.img - merge_image /data/magisk_merge.img - - # Mount magisk.img - if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then - loopsetup $IMG - if [ ! -z "$LOOPDEVICE" ]; then - mount -t ext4 -o rw,noatime $LOOPDEVICE $MOUNTPOINT + # Cache support + if [ -d "/cache/data_bin" ]; then + rm -rf /data/busybox /data/magisk + mkdir -p /data/busybox + mv /cache/data_bin /data/magisk + chmod -R 755 /data/busybox /data/magisk + /data/magisk/busybox --install -s /data/busybox + ln -s /data/magisk/busybox /data/busybox/busybox + # Prevent issues + rm -f /data/busybox/su /data/busybox/sh fi - fi - if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then - log_print "magisk.img mount failed, nothing to do :(" - unblock - fi + mv /cache/stock_boot.img /data 2>/dev/null - log_print "Preparing modules" - # First do cleanups - rm -rf $DUMMDIR - rmdir $(find $MOUNTPOINT -type d -depth ! -path "*core*" ) 2>/dev/null - rm -rf $COREDIR/bin + chcon -R 'u:object_r:system_file:s0' /data/busybox /data/magisk - mkdir -p $DUMMDIR - mkdir -p $MIRRDIR/system + # Image merging + chmod 644 $IMG /cache/magisk.img /data/magisk_merge.img 2>/dev/null + merge_image /cache/magisk.img + merge_image /data/magisk_merge.img - # Travel through all mods - for MOD in $MOUNTPOINT/* ; do - if [ -f "$MOD/remove" ]; then - log_print "Remove module: $MOD" - rm -rf $MOD - elif [ -f "$MOD/auto_mount" -a -d "$MOD/system" -a ! -f "$MOD/disable" ]; then - (travel $MOD system) + # Mount magisk.img + [ ! -d "$MOUNTPOINT" ] && mkdir -p $MOUNTPOINT + if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then + loopsetup $IMG + if [ ! -z "$LOOPDEVICE" ]; then + mount -t ext4 -o rw,noatime $LOOPDEVICE $MOUNTPOINT + fi fi - done - # Proper permissions for generated items - chmod 755 $(find $COREDIR -type d) - chmod 644 $(find $COREDIR -type f) - find $COREDIR -type d -exec chmod 755 {} \; - find $COREDIR -type f -exec chmod 644 {} \; - - # linker(64), t*box, and app_process* are required if we need to dummy mount bin folder - if [ -f "$TMPDIR/dummy/system/bin" ]; then - rm -f $DUMMDIR/system/bin/linker* $DUMMDIR/system/bin/t*box $DUMMDIR/system/bin/app_process* - cd /system/bin - cp -afc linker* t*box app_process* $DUMMDIR/system/bin/ - fi - - # Unmount, shrink, remount - if [ `umount $MOUNTPOINT >/dev/null 2>&1; echo $?` -eq 0 ]; then - losetup -d $LOOPDEVICE - target_size_check $IMG - NEWDATASIZE=$(((curUsedM / 32 + 2) * 32)) - if [ "$curSizeM" -gt "$NEWDATASIZE" ]; then - log_print "Shrinking $IMG to ${NEWDATASIZE}M..." - resize2fs $IMG ${NEWDATASIZE}M + if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then + log_print "magisk.img mount failed, nothing to do :(" + unblock fi - loopsetup $IMG - if [ ! -z "$LOOPDEVICE" ]; then - mount -t ext4 -o rw,noatime $LOOPDEVICE $MOUNTPOINT + + # Remove empty directories and remove legacy paths and previous symlink + rm -rf $COREDIR/bin $COREDIR/dummy $COREDIR/mirror + $TOOLPATH/find $MOUNTPOINT -type d -depth ! -path "*core*" -exec rmdir {} \; 2>/dev/null + + # Remove modules + for MOD in $MOUNTPOINT/* ; do + if [ -f "$MOD/remove" ]; then + log_print "Remove module: $MOD" + rm -rf $MOD + fi + done + + # Unmount, shrink, remount + if [ `umount $MOUNTPOINT >/dev/null 2>&1; echo $?` -eq 0 ]; then + $TOOLPATH/losetup -d $LOOPDEVICE + target_size_check $IMG + NEWDATASIZE=$(((curUsedM / 32 + 2) * 32)) + if [ "$curSizeM" -gt "$NEWDATASIZE" ]; then + log_print "Shrinking $IMG to ${NEWDATASIZE}M..." + resize2fs $IMG ${NEWDATASIZE}M + fi + loopsetup $IMG + if [ ! -z "$LOOPDEVICE" ]; then + mount -t ext4 -o rw,noatime $LOOPDEVICE $MOUNTPOINT + fi + if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then + log_print "magisk.img mount failed, nothing to do :(" + unblock + fi fi + + log_print "Preparing modules" + + mkdir -p $DUMMDIR + mkdir -p $MIRRDIR/system + + # Travel through all mods + for MOD in $MOUNTPOINT/* ; do + if [ -f "$MOD/auto_mount" -a -d "$MOD/system" -a ! -f "$MOD/disable" ]; then + (travel $MOD system) + fi + done + + # Proper permissions for generated items + $TOOLPATH/find $DUMMDIR -type d -exec chmod 755 {} \; + $TOOLPATH/find $DUMMDIR -type f -exec chmod 644 {} \; + $TOOLPATH/find $DUMMDIR -exec chcon 'u:object_r:system_file:s0' {} \; + + # linker(64), t*box, and app_process* are required if we need to dummy mount bin folder + if [ -f "$MOUNTINFO/dummy/system/bin" ]; then + rm -f $DUMMDIR/system/bin/linker* $DUMMDIR/system/bin/t*box $DUMMDIR/system/bin/app_process* + cd /system/bin + $TOOLPATH/cp -afc linker* t*box app_process* $DUMMDIR/system/bin/ + fi + + # Remove crap folder + rm -rf $MOUNTPOINT/lost+found + + # Start doing tasks + + # Stage 1 + log_print "Bind mount dummy system" + $TOOLPATH/find $MOUNTINFO/dummy -type f 2>/dev/null | while read ITEM ; do + TARGET=${ITEM#$MOUNTINFO/dummy} + ORIG=$DUMMDIR$TARGET + bind_mount $ORIG $TARGET + done + + # Stage 2 + log_print "Bind mount module items" + $TOOLPATH/find $MOUNTINFO/system -type f 2>/dev/null | while read ITEM ; do + TARGET=${ITEM#$MOUNTINFO} + ORIG=`cat $ITEM`$TARGET + bind_mount $ORIG $TARGET + rm -f $DUMMDIR${TARGET%/*}/.dummy 2>/dev/null + done + + # Run scripts + run_scripts post-fs-data + + # Bind hosts for Adblock apps + [ ! -f "$COREDIR/hosts" ] && $TOOLPATH/cp -afc /system/etc/hosts $COREDIR/hosts + log_print "Enabling systemless hosts file support" + bind_mount $COREDIR/hosts /system/etc/hosts + + # Stage 3 + log_print "Bind mount system mirror" + bind_mount /system $MIRRDIR/system + + # Stage 4 + log_print "Bind mount mirror items" + # Find all empty directores and dummy files, they should be mounted by original files in /system + TOOLPATH=/data/busybox $TOOLPATH/find $DUMMDIR -type d \ + -exec sh -c '[ -z "$($TOOLPATH/ls -A $1)" ] && echo $1' -- {} \; \ + -o \( -type f -size 0 -print \) | \ + while read ITEM ; do + ORIG=${ITEM/dummy/mirror} + TARGET=${ITEM#$DUMMDIR} + bind_mount $ORIG $TARGET + done + + # Restart post-fs-data, since data might be changed (multirom) + setprop magisk.restart_pfsd 1 + fi - - if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then - log_print "magisk.img mount failed, nothing to do :(" - unblock - fi - - # Remove crap folder - rm -rf $MOUNTPOINT/lost+found - - # Start doing tasks - - # Stage 1 - log_print "Bind mount dummy system" - find $TMPDIR/dummy -type f 2>/dev/null | while read ITEM ; do - TARGET=${ITEM#$TMPDIR/dummy} - ORIG=$DUMMDIR$TARGET - bind_mount $ORIG $TARGET - done - - # Stage 2 - log_print "Bind mount module items" - find $TMPDIR/system -type f 2>/dev/null | while read ITEM ; do - TARGET=${ITEM#$TMPDIR} - ORIG=`cat $ITEM`$TARGET - bind_mount $ORIG $TARGET - rm -f $DUMMDIR${TARGET%/*}/.dummy 2>/dev/null - done - - # Run scripts - run_scripts post-fs-data - - # Bind hosts for Adblock apps - [ ! -f "$COREDIR/hosts" ] && cp -afc /system/etc/hosts $COREDIR/hosts - log_print "Enabling systemless hosts file support" - bind_mount $COREDIR/hosts /system/etc/hosts - - # Stage 3 - log_print "Bind mount system mirror" - bind_mount /system $MIRRDIR/system - - # Stage 4 - log_print "Bind mount mirror items" - # Find all empty directores and dummy files, they should be mounted by original files in /system - find $DUMMDIR -type d -exec sh -c '[ -z "$(ls -A $1)" ] && echo $1' -- {} \; -o \( -type f -size 0 -print \) | while read ITEM ; do - ORIG=${ITEM/dummy/mirror} - TARGET=${ITEM#$DUMMDIR} - bind_mount $ORIG $TARGET - done - - # All done - rm -rf $TMPDIR - unblock ;; @@ -423,7 +414,7 @@ case $1 in fi chmod 755 $COREDIR/magiskhide $COREDIR/magiskhide/* log_print "Starting Magisk Hide" - exec /data/magisk/magiskhide $COREDIR/magiskhide/hidelist > $HIDELOG + exec /data/magisk/magiskhide $COREDIR/magiskhide/hidelist ;; esac