diff --git a/build.py b/build.py index 4b45311c5..826c804dd 100755 --- a/build.py +++ b/build.py @@ -238,6 +238,9 @@ def zip_main(args): source = os.path.join('libs', lib_dir, binary) target = os.path.join(zip_dir, binary) zip_with_msg(zipf, source, target) + source = os.path.join('libs', 'arm64-v8a', 'magiskinit') + target = os.path.join('arm64', 'magiskinit') + zip_with_msg(zipf, source, target) # APK source = os.path.join('MagiskManager', 'app', 'build', 'outputs', 'apk', diff --git a/scripts/boot_patch.sh b/scripts/boot_patch.sh index ce313bc28..f2c78e9d1 100644 --- a/scripts/boot_patch.sh +++ b/scripts/boot_patch.sh @@ -200,23 +200,54 @@ esac ui_print_wrap "- Patching ramdisk" -# Add magisk entrypoint -./magiskboot --cpio-patch ramdisk.cpio $KEEPVERITY $KEEPFORCEENCRYPT - -# sepolicy patches -cpio_extract sepolicy sepolicy -./magisk magiskpolicy --load sepolicy --save sepolicy --minimal -cpio_add 644 sepolicy sepolicy -rm -f sepolicy - -# Add new items if [ ! -z $SHA1 ]; then cp init.magisk.rc init.magisk.rc.bak echo "# STOCKSHA1=$SHA1" >> init.magisk.rc fi -cpio_add 750 init.magisk.rc init.magisk.rc + +if $SKIP_INITRAMFS; then + # First check precompiled ones + [ -f /system_root/sepolicy ] && cp /system_root/sepolicy sepolicy + if [ ! -f sepolicy -a -f /vendor/etc/selinux/precompiled_sepolicy ]; then + # Check SHA256 + SYSTEMSHA256=`find /system/etc/selinux -name '*.sha256' -exec cat {} \; 2>/dev/null` + VENDORSHA256=`find /vendor/etc/selinux -name '*.sha256' -exec cat {} \; 2>/dev/null` + [ "$SYSTEMSHA256" = "$VENDORSHA256" ] && cp /vendor/etc/selinux/precompiled_sepolicy sepolicy + fi + if [ ! -f sepolicy ]; then + ui_print_wrap "- Compiling split cil policies" + # Compile the split policies + POLICY_VER=`cat /sys/fs/selinux/policyvers` + PLAT_CIL=/system/etc/selinux/plat_sepolicy.cil + NONPLAT_CIL=`find /vendor/etc/selinux -name '*.cil' 2>/dev/null` + VENDOR_PLAT_VER=`cat /vendor/etc/selinux/plat_sepolicy_vers.txt` + MAPPING_CIL=/system/etc/selinux/mapping/${VENDOR_PLAT_VER}.cil + ./magisk magisksecilc -M true -c $POLICY_VER -o sepolicy -f /dev/null $PLAT_CIL $NONPLAT_CIL $MAPPING_CIL + fi + [ -f sepolicy ] || abort_wrap "! Cannot get sepolicy" + + # TODO: Patch dm-verity + + cpio_add 750 init ./magiskinit + cpio_mkdir 000 overlay + cpio_add 750 overlay/init.magisk.rc init.magisk.rc + cpio_mkdir 750 overlay/sbin + cpio_add 755 overlay/sbin/magisk magisk +else + ./magiskboot --cpio-patch ramdisk.cpio $KEEPVERITY $KEEPFORCEENCRYPT + + cpio_extract sepolicy sepolicy + + cpio_add 750 init.magisk.rc init.magisk.rc + cpio_add 755 sbin/magisk magisk +fi + mv init.magisk.rc.bak init.magisk.rc 2>/dev/null -cpio_add 755 sbin/magisk magisk + +# sepolicy patches +./magisk magiskpolicy --load sepolicy --save sepolicy --minimal +$SKIP_INITRAMFS && cpio_add 644 overlay/sepolicy sepolicy || cpio_add 644 sepolicy sepolicy +rm -f sepolicy # Create ramdisk backups ./magiskboot --cpio-backup ramdisk.cpio ramdisk.cpio.orig @@ -234,6 +265,11 @@ rm -f ramdisk.cpio.orig 49010054011440B93FA00F71E9000054010840B93FA00F7189000054001840B91FA00F7188010054 \ A1020054011440B93FA00F7140020054010840B93FA00F71E0010054001840B91FA00F7181010054 +# skip_initramfs -> want_initramfs +./magiskboot --hexpatch kernel \ +736B69705F696E697472616D6673 \ +77616E745F696E697472616D6673 + ui_print_wrap "- Repacking boot image" ./magiskboot --repack "$BOOTIMAGE" || abort_wrap "! Unable to repack boot image!" diff --git a/scripts/flash_script.sh b/scripts/flash_script.sh index 94fc0b764..60ad9926b 100644 --- a/scripts/flash_script.sh +++ b/scripts/flash_script.sh @@ -49,13 +49,8 @@ ui_print "************************" ui_print "* Magisk v$MAGISK_VER Installer" ui_print "************************" -ui_print "- Mounting /system, /vendor, /cache, /data" -mount -o ro /system 2>/dev/null -mount -o ro /vendor 2>/dev/null -mount /cache 2>/dev/null -mount /data 2>/dev/null - -[ -f /system/build.prop ] || abort "! /system could not be mounted!" +is_mounted /data || mount /data +mount_partitions # read override variables getvar KEEPVERITY diff --git a/scripts/util_functions.sh b/scripts/util_functions.sh index 0528f0bdc..8e0a88408 100644 --- a/scripts/util_functions.sh +++ b/scripts/util_functions.sh @@ -37,6 +37,36 @@ ui_print() { fi } +mount_partitions() { + # Check A/B slot + SLOT=`getprop ro.boot.slot_suffix` + [ -z $SLOT ] || ui_print "- A/B partition detected, current slot: $SLOT" + ui_print "- Mounting /system, /vendor" + is_mounted /system || [ -f /system/build.prop ] || mount -o ro /system 2>/dev/null + if ! is_mounted /system && ! [ -f /system/build.prop ]; then + SYSTEMBLOCK=`find /dev/block -iname system$SLOT | head -n 1` + mount -t ext4 -o ro $SYSTEMBLOCK /system + fi + is_mounted /system || [ -f /system/build.prop ] || abort "! Cannot mount /system" + cat /proc/mounts | grep /dev/root >/dev/null && SKIP_INITRAMFS=true || SKIP_INITRAMFS=false + if [ -f /system/init.rc ]; then + SKIP_INITRAMFS=true + mkdir /system_root 2>/dev/null + mount --move /system /system_root + mount -o bind /system_root/system /system + fi + $SKIP_INITRAMFS && ui_print "- Device skip_initramfs detected" + if [ -L /system/vendor ]; then + # Seperate /vendor partition + is_mounted /vendor || mount -o ro /vendor 2>/dev/null + if ! is_mounted /vendor; then + VENDORBLOCK=`find /dev/block -iname vendor$SLOT | head -n 1` + mount -t ext4 -o ro $VENDORBLOCK /vendor + fi + is_mounted /vendor || abort "! Cannot mount /vendor" + fi +} + grep_prop() { REGEX="s/^$1=//p" shift @@ -58,10 +88,14 @@ getvar() { find_boot_image() { if [ -z "$BOOTIMAGE" ]; then - for BLOCK in boot_a kern-a android_boot kernel boot lnx; do - BOOTIMAGE=`find /dev/block -iname $BLOCK | head -n 1` 2>/dev/null - [ ! -z $BOOTIMAGE ] && break - done + if [ ! -z $SLOT ]; then + BOOTIMAGE=`find /dev/block -iname boot$SLOT | head -n 1` 2>/dev/null + else + for BLOCK in boot_a kern-a android_boot kernel boot lnx; do + BOOTIMAGE=`find /dev/block -iname $BLOCK | head -n 1` 2>/dev/null + [ ! -z $BOOTIMAGE ] && break + done + fi fi # Recovery fallback if [ -z "$BOOTIMAGE" ]; then @@ -180,6 +214,7 @@ recovery_cleanup() { export LD_LIBRARY_PATH=$OLD_LD_PATH [ -z $OLD_PATH ] || export PATH=$OLD_PATH ui_print "- Unmounting partitions" + umount -l /system_root 2>/dev/null umount -l /system 2>/dev/null umount -l /vendor 2>/dev/null umount -l /dev/random 2>/dev/null