mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-24 10:35:26 +00:00
ec8fffe61c
Distribute Magisk directly with Magisk Manager APK. The APK will contain all required binaries and scripts for installation and uninstallation. App versions will now align with Magisk releases. Extra effort is spent to make the APK itself also a flashable zip that can be used in custom recoveries, so those still prefer to install Magisk with recoveries will not be affected with this change. As a bonus, this makes the whole installation and uninstallation process 100% offline. The existing Magisk Manager was not really functional without an Internet connection, as the installation process was highly tied to zips hosted on the server. An additional bonus: since all binaries are now shipped as "native libraries" of the APK, we can finally bump the target SDK version higher than 28. The target SDK version was stuck at 28 for a long time because newer SELinux restricts running executables from internal storage. More details can be found here: https://github.com/termux/termux-app/issues/1072 The target SDK bump will be addressed in a future commit. Co-authored with @vvb2060
193 lines
5.0 KiB
Bash
193 lines
5.0 KiB
Bash
#!/system/bin/sh
|
|
#######################################################################################
|
|
# Magisk Boot Image Patcher
|
|
#######################################################################################
|
|
#
|
|
# Usage: boot_patch.sh <bootimage>
|
|
#
|
|
# The following flags can be set in environment variables:
|
|
# KEEPVERITY, KEEPFORCEENCRYPT, RECOVERYMODE
|
|
#
|
|
# This script should be placed in a directory with the following files:
|
|
#
|
|
# File name Type Description
|
|
#
|
|
# boot_patch.sh script A script to patch boot image for Magisk.
|
|
# (this file) The script will use files in its same
|
|
# directory to complete the patching process
|
|
# util_functions.sh script A script which hosts all functions required
|
|
# for this script to work properly
|
|
# magiskinit binary The binary to replace /init
|
|
# magisk(32/64) binary The magisk binaries
|
|
# magiskboot binary A tool to manipulate boot images
|
|
# chromeos folder This folder includes the utility and keys to sign
|
|
# (optional) chromeos boot images. Only used for Pixel C.
|
|
#
|
|
#######################################################################################
|
|
|
|
############
|
|
# Functions
|
|
############
|
|
|
|
# Pure bash dirname implementation
|
|
getdir() {
|
|
case "$1" in
|
|
*/*)
|
|
dir=${1%/*}
|
|
if [ -z $dir ]; then
|
|
echo "/"
|
|
else
|
|
echo $dir
|
|
fi
|
|
;;
|
|
*) echo "." ;;
|
|
esac
|
|
}
|
|
|
|
#################
|
|
# Initialization
|
|
#################
|
|
|
|
if [ -z $SOURCEDMODE ]; then
|
|
# Switch to the location of the script file
|
|
cd "$(getdir "${BASH_SOURCE:-$0}")"
|
|
# Load utility functions
|
|
. ./util_functions.sh
|
|
# Check if 64-bit
|
|
[ -d /system/lib64 ] && IS64BIT=true || IS64BIT=false
|
|
fi
|
|
|
|
BOOTIMAGE="$1"
|
|
[ -e "$BOOTIMAGE" ] || abort "$BOOTIMAGE does not exist!"
|
|
|
|
# Flags
|
|
[ -z $KEEPVERITY ] && KEEPVERITY=false
|
|
[ -z $KEEPFORCEENCRYPT ] && KEEPFORCEENCRYPT=false
|
|
[ -z $RECOVERYMODE ] && RECOVERYMODE=false
|
|
export KEEPVERITY
|
|
export KEEPFORCEENCRYPT
|
|
|
|
chmod -R 755 .
|
|
|
|
#########
|
|
# Unpack
|
|
#########
|
|
|
|
CHROMEOS=false
|
|
|
|
ui_print "- Unpacking boot image"
|
|
./magiskboot unpack "$BOOTIMAGE"
|
|
|
|
case $? in
|
|
1 )
|
|
abort "! Unsupported/Unknown image format"
|
|
;;
|
|
2 )
|
|
ui_print "- ChromeOS boot image detected"
|
|
CHROMEOS=true
|
|
;;
|
|
esac
|
|
|
|
[ -f recovery_dtbo ] && RECOVERYMODE=true
|
|
|
|
###################
|
|
# Ramdisk Restores
|
|
###################
|
|
|
|
# Test patch status and do restore
|
|
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"
|
|
SHA1=$(./magiskboot sha1 "$BOOTIMAGE" 2>/dev/null)
|
|
cat $BOOTIMAGE > stock_boot.img
|
|
cp -af ramdisk.cpio ramdisk.cpio.orig 2>/dev/null
|
|
;;
|
|
1 ) # Magisk patched
|
|
ui_print "- Magisk patched boot image detected"
|
|
# Find SHA1 of stock boot image
|
|
[ -z $SHA1 ] && SHA1=$(./magiskboot cpio ramdisk.cpio sha1 2>/dev/null)
|
|
./magiskboot cpio ramdisk.cpio restore
|
|
cp -af ramdisk.cpio ramdisk.cpio.orig
|
|
;;
|
|
2 ) # Unsupported
|
|
ui_print "! Boot image patched by unsupported programs"
|
|
abort "! Please restore back to stock boot image"
|
|
;;
|
|
esac
|
|
|
|
##################
|
|
# Ramdisk Patches
|
|
##################
|
|
|
|
ui_print "- Patching ramdisk"
|
|
|
|
echo "KEEPVERITY=$KEEPVERITY" > config
|
|
echo "KEEPFORCEENCRYPT=$KEEPFORCEENCRYPT" >> config
|
|
echo "RECOVERYMODE=$RECOVERYMODE" >> config
|
|
[ ! -z $SHA1 ] && echo "SHA1=$SHA1" >> config
|
|
|
|
# Compress to save precious ramdisk space
|
|
./magiskboot compress=xz magisk32 magisk32.xz
|
|
./magiskboot compress=xz magisk64 magisk64.xz
|
|
$IS64BIT && SKIP64="" || SKIP64="#"
|
|
|
|
./magiskboot cpio ramdisk.cpio \
|
|
"add 0750 init magiskinit" \
|
|
"mkdir 0750 overlay.d" \
|
|
"mkdir 0750 overlay.d/sbin" \
|
|
"add 0644 overlay.d/sbin/magisk32.xz magisk32.xz" \
|
|
"$SKIP64 add 0644 overlay.d/sbin/magisk64.xz magisk64.xz" \
|
|
"patch" \
|
|
"backup ramdisk.cpio.orig" \
|
|
"mkdir 000 .backup" \
|
|
"add 000 .backup/.magisk config"
|
|
|
|
rm -f ramdisk.cpio.orig config magisk*.xz
|
|
|
|
#################
|
|
# Binary Patches
|
|
#################
|
|
|
|
for dt in dtb kernel_dtb extra; do
|
|
[ -f $dt ] && ./magiskboot dtb $dt patch && ui_print "- Patch fstab in $dt"
|
|
done
|
|
|
|
if [ -f kernel ]; then
|
|
# Remove Samsung RKP
|
|
./magiskboot hexpatch kernel \
|
|
49010054011440B93FA00F71E9000054010840B93FA00F7189000054001840B91FA00F7188010054 \
|
|
A1020054011440B93FA00F7140020054010840B93FA00F71E0010054001840B91FA00F7181010054
|
|
|
|
# Remove Samsung defex
|
|
# Before: [mov w2, #-221] (-__NR_execve)
|
|
# After: [mov w2, #-32768]
|
|
./magiskboot hexpatch kernel 821B8012 E2FF8F12
|
|
|
|
# Force kernel to load rootfs
|
|
# skip_initramfs -> want_initramfs
|
|
./magiskboot hexpatch kernel \
|
|
736B69705F696E697472616D667300 \
|
|
77616E745F696E697472616D667300
|
|
fi
|
|
|
|
#################
|
|
# Repack & Flash
|
|
#################
|
|
|
|
ui_print "- Repacking boot image"
|
|
./magiskboot repack "$BOOTIMAGE" || abort "! Unable to repack boot image!"
|
|
|
|
# Sign chromeos boot
|
|
$CHROMEOS && sign_chromeos
|
|
|
|
# Reset any error code
|
|
true
|