From b4cfe6e9c081c939bbcd0d235ab3c8de763d6762 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 2 Jan 2017 17:48:34 +0800 Subject: [PATCH] Proper vendor support --- jni/magiskhide/hide.c | 2 +- scripts/magic_mask.sh | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/jni/magiskhide/hide.c b/jni/magiskhide/hide.c index f7e789f60..eb2bc16e2 100644 --- a/jni/magiskhide/hide.c +++ b/jni/magiskhide/hide.c @@ -42,7 +42,7 @@ int hideMagisk() { // First unmount the dummy skeletons and the cache mounts for(i = mount_size - 1; i >= 0; --i) { - if (strstr(mount_list[i], "tmpfs /system") || strstr(mount_list[i], "tmpfs /vendor/") + if (strstr(mount_list[i], "tmpfs /system") || strstr(mount_list[i], "tmpfs /vendor") || (strstr(mount_list[i], cache_block) && strstr(mount_list[i], "/system")) ) { sscanf(mount_list[i], "%*s %512s", buffer); lazy_unmount(buffer); diff --git a/scripts/magic_mask.sh b/scripts/magic_mask.sh index 227a816d3..4741b5f38 100644 --- a/scripts/magic_mask.sh +++ b/scripts/magic_mask.sh @@ -2,7 +2,8 @@ LOGFILE=/cache/magisk.log IMG=/data/magisk.img -BLACKLIST="/system/lib /system/lib64 /system/etc /vendor/lib /vendor/lib64" +# BLACKLIST="/system/lib /system/lib64 /system/etc /system/framework /vendor/lib /vendor/lib64" +WHITELIST="/system/app /system/priv-app /system/bin" MOUNTPOINT=/magisk @@ -81,6 +82,9 @@ target_size_check() { } travel() { + # Ignore /system/vendor, we will handle it differently + [ "$1" = "system/vendor" ] && return + cd $TRAVEL_ROOT/$1 if [ -f .replace ]; then rm -rf $MOUNTINFO/$1 @@ -121,8 +125,8 @@ travel() { } clone_dummy() { - LINK=true - in_list $1 "$BLACKLIST" && LINK=false + LINK=false + in_list $1 "$WHITELIST" && LINK=true for ITEM in $MIRRDIR$1/* ; do REAL=${ITEM#$MIRRDIR} @@ -353,11 +357,23 @@ case $1 in # Remove crap folder rm -rf $MOUNTPOINT/lost+found + # Link vendor if not exist + if [ ! -e /vendor ]; then + mount -o rw,remount rootfs / + ln -s /system/vendor /vendor + mount -o ro,remount rootfs / + fi + # Travel through all mods for MOD in $MOUNTPOINT/* ; do if [ -f $MOD/auto_mount -a -d $MOD/system -a ! -f $MOD/disable ]; then TRAVEL_ROOT=$MOD (travel system) + rm -f $MOD/vendor 2>/dev/null + if [ -d $MOD/system/vendor ]; then + ln -s $MOD/system/vendor $MOD/vendor + (travel vendor) + fi fi done @@ -384,13 +400,13 @@ case $1 in ln -s $MIRRDIR/system/vendor $MIRRDIR/vendor fi - # Since mirrors always exist, we load libraries from mirrors + # Since mirrors always exist, we load libraries and binaries from mirrors export LD_LIBRARY_PATH=$MIRRDIR/system/lib:$MIRRDIR/vendor/lib - [ -d /system/lib64 ] && export LD_LIBRARY_PATH=$MIRRDIR/system/lib64:$MIRRDIR/vendor/lib64 + [ -d $MIRRDIR/system/lib64 ] && export LD_LIBRARY_PATH=$MIRRDIR/system/lib64:$MIRRDIR/vendor/lib64 # Stage 2 log_print "* Stage 2: Mount dummy skeletons" - # Move dummy /system/vendor to /vendor for consistency + # Move /system/vendor to /vendor for consistency mv -f $MOUNTINFO/dummy/system/vendor $MOUNTINFO/dummy/vendor 2>/dev/null mv -f $DUMMDIR/system/vendor $DUMMDIR/vendor 2>/dev/null find $MOUNTINFO/dummy -type f 2>/dev/null | while read ITEM ; do @@ -400,6 +416,9 @@ case $1 in bind_mount $ORIG $TARGET done + # Check if the dummy /system/bin is empty, it shouldn't + [ ! -e $DUMMDIR/system/bin/sh ] && clone_dummy /system/bin + # Stage 3 log_print "* Stage 3: Mount module items" find $MOUNTINFO/system -type f 2>/dev/null | while read ITEM ; do @@ -407,6 +426,11 @@ case $1 in ORIG=`cat $ITEM`$TARGET bind_mount $ORIG $TARGET done + find $MOUNTINFO/vendor -type f 2>/dev/null | while read ITEM ; do + TARGET=${ITEM#$MOUNTINFO} + ORIG=`cat $ITEM`$TARGET + bind_mount $ORIG $TARGET + done # Stage 4 log_print "* Stage 4: Execute module scripts"