Various updates, prepare for Multirom support

This commit is contained in:
topjohnwu 2016-10-30 06:49:29 +08:00
parent aa309087fd
commit 9ea028f5ab
3 changed files with 170 additions and 178 deletions

View File

@ -5,14 +5,12 @@ LOCAL_PATH := $(my_path)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := magiskhide LOCAL_MODULE := magiskhide
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_SRC_FILES := magiskhide.c LOCAL_SRC_FILES := magiskhide.c
include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := bootimgtools LOCAL_MODULE := bootimgtools
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_SRC_FILES := bootimgtools.c extract.c repack.c hexpatch.c LOCAL_SRC_FILES := bootimgtools.c extract.c repack.c hexpatch.c
LOCAL_CFLAGS += -std=gnu11 LOCAL_CFLAGS += -std=gnu11
include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE)

View File

@ -13,6 +13,9 @@ on post-fs-data
on property:magisk.hide=1 on property:magisk.hide=1
restart magisk_hide restart magisk_hide
on property:magisk.restart_pfsd=1
trigger post-fs-data
# Services # Services
# launch post-fs script # launch post-fs script

View File

@ -1,24 +1,24 @@
#!/system/bin/sh #!/system/bin/sh
LOGFILE=/cache/magisk.log LOGFILE=/cache/magisk.log
HIDELOG=/cache/magiskhide.log
IMG=/data/magisk.img IMG=/data/magisk.img
export MOUNTPOINT=/magisk MOUNTPOINT=/magisk
COREDIR=$MOUNTPOINT/.core COREDIR=$MOUNTPOINT/.core
DUMMDIR=$COREDIR/dummy TMPDIR=/dev/magisk
MIRRDIR=$COREDIR/mirror 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 # Legacy support for old phh, we don't change PATH now
# We also do so because we rely on the option "-c" for cp (reserve contexts)
# Reserve the original PATH
export OLDPATH=$PATH export OLDPATH=$PATH
export PATH="/data/busybox:$PATH"
log_print() { log_print() {
echo $1 echo $1
@ -42,17 +42,13 @@ unblock() {
run_scripts() { run_scripts() {
BASE=$MOUNTPOINT BASE=$MOUNTPOINT
if [ "$1" = "post-fs" ]; then
BASE=/cache/magisk
fi
for MOD in $BASE/* ; do for MOD in $BASE/* ; do
if [ ! -f "$MOD/disable" ]; then if [ ! -f "$MOD/disable" ]; then
if [ -f "$MOD/$1.sh" ]; then if [ -f "$MOD/$1.sh" ]; then
chmod 755 $MOD/$1.sh chmod 755 $MOD/$1.sh
chcon 'u:object_r:system_file:s0' $MOD/$1.sh chcon 'u:object_r:system_file:s0' $MOD/$1.sh
log_print "$1: $MOD/$1.sh" log_print "$1: $MOD/$1.sh"
$MOD/$1.sh sh $MOD/$1.sh
fi fi
fi fi
done done
@ -61,7 +57,7 @@ run_scripts() {
loopsetup() { loopsetup() {
LOOPDEVICE= LOOPDEVICE=
for DEV in $(ls /dev/block/loop*); do 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 LOOPDEVICE=$DEV
break break
fi fi
@ -79,8 +75,8 @@ target_size_check() {
travel() { travel() {
cd $1/$2 cd $1/$2
if [ -f ".replace" ]; then if [ -f ".replace" ]; then
rm -rf $TMPDIR/$2 rm -rf $MOUNTINFO/$2
mktouch $TMPDIR/$2 $1 mktouch $MOUNTINFO/$2 $1
else else
for ITEM in * ; do for ITEM in * ; do
if [ ! -e "/$2/$ITEM" ]; then if [ ! -e "/$2/$ITEM" ]; then
@ -89,12 +85,12 @@ travel() {
# We cannot add new items to /system root, delete it # We cannot add new items to /system root, delete it
rm -rf $ITEM rm -rf $ITEM
else else
if [ -d "$TMPDIR/dummy/$2" ]; then if [ -d "$MOUNTINFO/dummy/$2" ]; then
# We are in a higher level, delete the lower levels # We are in a higher level, delete the lower levels
rm -rf $TMPDIR/dummy/$2 rm -rf $MOUNTINFO/dummy/$2
fi fi
# Mount the dummy parent # Mount the dummy parent
mktouch $TMPDIR/dummy/$2 mktouch $MOUNTINFO/dummy/$2
mkdir -p $DUMMDIR/$2 2>/dev/null mkdir -p $DUMMDIR/$2 2>/dev/null
if [ -d "$ITEM" ]; then if [ -d "$ITEM" ]; then
@ -102,7 +98,7 @@ travel() {
mkdir -p $DUMMDIR/$2/$ITEM mkdir -p $DUMMDIR/$2/$ITEM
elif [ -L "$ITEM" ]; then elif [ -L "$ITEM" ]; then
# Symlinks are small, copy them # Symlinks are small, copy them
cp -afc $ITEM $DUMMDIR/$2/$ITEM $TOOLPATH/cp -afc $ITEM $DUMMDIR/$2/$ITEM
else else
# Create new dummy file # Create new dummy file
mktouch $DUMMDIR/$2/$ITEM mktouch $DUMMDIR/$2/$ITEM
@ -116,7 +112,7 @@ travel() {
mkdir -p $DUMMDIR$DUMMY mkdir -p $DUMMDIR$DUMMY
elif [ -L "$DUMMY" ]; then elif [ -L "$DUMMY" ]; then
# Symlinks are small, copy them # Symlinks are small, copy them
cp -afc $DUMMY $DUMMDIR$DUMMY $TOOLPATH/cp -afc $DUMMY $DUMMDIR$DUMMY
else else
# Create dummy file # Create dummy file
mktouch $DUMMDIR$DUMMY mktouch $DUMMDIR$DUMMY
@ -131,7 +127,7 @@ travel() {
(travel $1 $2/$ITEM) (travel $1 $2/$ITEM)
elif [ ! -L "$ITEM" ]; then elif [ ! -L "$ITEM" ]; then
# Mount this file # Mount this file
mktouch $TMPDIR/$2/$ITEM $1 mktouch $MOUNTINFO/$2/$ITEM $1
fi fi
done done
fi fi
@ -194,10 +190,13 @@ merge_image() {
# Merge (will reserve selinux contexts) # Merge (will reserve selinux contexts)
cd /cache/merge_img cd /cache/merge_img
for MOD in *; do for MOD in *; do
log_print "Merging: $MOD" if [ "$MOD" != "lost+found" ]; then
rm -rf /cache/data_img/$MOD log_print "Merging: $MOD"
cp -afc $MOD /cache/data_img/ rm -rf /cache/data_img/$MOD
$TOOLPATH/cp -afc $MOD /cache/data_img/
fi
done done
$TOOLPATH/cp -afc .core/. /cache/data_img/.core 2>/dev/null
log_print "Merge complete" log_print "Merge complete"
fi fi
@ -206,8 +205,8 @@ merge_image() {
fi fi
fi fi
losetup -d $LOOPDATA $TOOLPATH/losetup -d $LOOPDATA
losetup -d $LOOPMERGE $TOOLPATH/losetup -d $LOOPMERGE
rmdir /cache/data_img rmdir /cache/data_img
rmdir /cache/merge_img rmdir /cache/merge_img
@ -224,31 +223,12 @@ case $1 in
mv $LOGFILE /cache/last_magisk.log mv $LOGFILE /cache/last_magisk.log
touch $LOGFILE touch $LOGFILE
chmod 644 $LOGFILE chmod 644 $LOGFILE
log_print "Magisk post-fs mode running..." log_print "Magisk post-fs mode running..."
if [ -d "/cache/magisk_merge" ]; then # No more cache mods!
cd /cache/magisk_merge # Only for multirom!
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
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 unblock
;; ;;
@ -263,143 +243,154 @@ case $1 in
unblock unblock
fi fi
log_print "Magisk post-fs-data mode running..." # Don't run twice
if [ "$(getprop magisk.restart_pfsd)" != "1" ]; then
# Live patch sepolicy log_print "Magisk post-fs-data mode running..."
/data/magisk/sepolicy-inject --live -s su
[ ! -d "$MOUNTPOINT" ] && mkdir -p $MOUNTPOINT # Live patch sepolicy
/data/magisk/sepolicy-inject --live -s su
# Cache support # Cache support
if [ -d "/cache/data_bin" ]; then if [ -d "/cache/data_bin" ]; then
rm -rf /data/busybox /data/magisk rm -rf /data/busybox /data/magisk
mkdir -p /data/busybox mkdir -p /data/busybox
mv /cache/data_bin /data/magisk mv /cache/data_bin /data/magisk
chmod 755 /data/busybox /data/magisk /data/magisk/* chmod -R 755 /data/busybox /data/magisk
chcon 'u:object_r:system_file:s0' /data/busybox /data/magisk /data/magisk/* /data/magisk/busybox --install -s /data/busybox
/data/magisk/busybox --install -s /data/busybox ln -s /data/magisk/busybox /data/busybox/busybox
# Prevent issues # Prevent issues
rm -f /data/busybox/su /data/busybox/sh 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
fi fi
fi
if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then mv /cache/stock_boot.img /data 2>/dev/null
log_print "magisk.img mount failed, nothing to do :("
unblock
fi
log_print "Preparing modules" chcon -R 'u:object_r:system_file:s0' /data/busybox /data/magisk
# First do cleanups
rm -rf $DUMMDIR
rmdir $(find $MOUNTPOINT -type d -depth ! -path "*core*" ) 2>/dev/null
rm -rf $COREDIR/bin
mkdir -p $DUMMDIR # Image merging
mkdir -p $MIRRDIR/system 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 # Mount magisk.img
for MOD in $MOUNTPOINT/* ; do [ ! -d "$MOUNTPOINT" ] && mkdir -p $MOUNTPOINT
if [ -f "$MOD/remove" ]; then if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then
log_print "Remove module: $MOD" loopsetup $IMG
rm -rf $MOD if [ ! -z "$LOOPDEVICE" ]; then
elif [ -f "$MOD/auto_mount" -a -d "$MOD/system" -a ! -f "$MOD/disable" ]; then mount -t ext4 -o rw,noatime $LOOPDEVICE $MOUNTPOINT
(travel $MOD system) fi
fi fi
done
# Proper permissions for generated items if [ `cat /proc/mounts | grep $MOUNTPOINT >/dev/null 2>&1; echo $?` -ne 0 ]; then
chmod 755 $(find $COREDIR -type d) log_print "magisk.img mount failed, nothing to do :("
chmod 644 $(find $COREDIR -type f) unblock
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
fi fi
loopsetup $IMG
if [ ! -z "$LOOPDEVICE" ]; then # Remove empty directories and remove legacy paths and previous symlink
mount -t ext4 -o rw,noatime $LOOPDEVICE $MOUNTPOINT 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 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 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 unblock
;; ;;
@ -423,7 +414,7 @@ case $1 in
fi fi
chmod 755 $COREDIR/magiskhide $COREDIR/magiskhide/* chmod 755 $COREDIR/magiskhide $COREDIR/magiskhide/*
log_print "Starting Magisk Hide" log_print "Starting Magisk Hide"
exec /data/magisk/magiskhide $COREDIR/magiskhide/hidelist > $HIDELOG exec /data/magisk/magiskhide $COREDIR/magiskhide/hidelist
;; ;;
esac esac