Brand new module installer script

The new module installer script completely changes the way how module
installer zips are structured. More info will come later in docs.

The new installer script also supports installing sepolicy.rule to
persist partitions in order to make the module work on the next boot.
This commit is contained in:
topjohnwu 2019-12-27 17:53:27 +08:00
parent 3beffd84d6
commit b336655a79
2 changed files with 154 additions and 95 deletions

View File

@ -1,12 +1,15 @@
#!/sbin/sh #!/sbin/sh
TMPDIR=/dev/tmp #################
MOUNTPATH=/dev/magisk_img # Initialization
#################
# Default permissions
umask 022 umask 022
# Initial cleanup # Global vars
TMPDIR=/dev/tmp
PERSISTDIR=/sbin/.magisk/mirror/persist
rm -rf $TMPDIR 2>/dev/null rm -rf $TMPDIR 2>/dev/null
mkdir -p $TMPDIR mkdir -p $TMPDIR
@ -20,9 +23,27 @@ require_new_magisk() {
exit 1 exit 1
} }
########################################################################################## is_legacy_script() {
unzip -l "$ZIPFILE" install.sh | grep -q install.sh
return $?
}
print_modname() {
local len
len=`echo -n $MODNAME | wc -c`
len=$((len + 2))
local pounds=`printf "%${len}s" | tr ' ' '*'`
ui_print "$pounds"
ui_print " $MODNAME "
ui_print "$pounds"
ui_print "*******************"
ui_print " Powered by Magisk "
ui_print "*******************"
}
##############
# Environment # Environment
########################################################################################## ##############
OUTFD=$2 OUTFD=$2
ZIPFILE=$3 ZIPFILE=$3
@ -30,13 +51,9 @@ ZIPFILE=$3
mount /data 2>/dev/null mount /data 2>/dev/null
# Load utility functions # Load utility functions
if [ -f /data/adb/magisk/util_functions.sh ]; then [ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk
. /data/adb/magisk/util_functions.sh . /data/adb/magisk/util_functions.sh
NVBASE=/data/adb [ $MAGISK_VER_CODE -gt 18100 ] || require_new_magisk
[ $MAGISK_VER_CODE -gt 18100 ] || require_new_magisk
else
require_new_magisk
fi
# Preperation for flashable zips # Preperation for flashable zips
setup_flashable setup_flashable
@ -50,80 +67,104 @@ api_level_arch_detect
# Setup busybox and binaries # Setup busybox and binaries
$BOOTMODE && boot_actions || recovery_actions $BOOTMODE && boot_actions || recovery_actions
########################################################################################## ##############
# Preparation # Preparation
########################################################################################## ##############
# Extract common files # Extract prop file
unzip -oj "$ZIPFILE" module.prop install.sh uninstall.sh 'common/*' -d $TMPDIR >&2 unzip -o "$ZIPFILE" module.prop -d $TMPDIR >&2
[ ! -f $TMPDIR/module.prop ] && abort "! Unable to extract zip file!"
[ ! -f $TMPDIR/install.sh ] && abort "! Unable to extract zip file!"
# Load install script
. $TMPDIR/install.sh
$BOOTMODE && MODDIRNAME=modules_update || MODDIRNAME=modules $BOOTMODE && MODDIRNAME=modules_update || MODDIRNAME=modules
MODULEROOT=$NVBASE/$MODDIRNAME MODULEROOT=$NVBASE/$MODDIRNAME
MODID=`grep_prop id $TMPDIR/module.prop` MODID=`grep_prop id $TMPDIR/module.prop`
MODPATH=$MODULEROOT/$MODID MODPATH=$MODULEROOT/$MODID
MODNAME=`grep_prop name $TMPDIR/module.prop`
print_modname
ui_print "******************************"
ui_print "Powered by Magisk (@topjohnwu)"
ui_print "******************************"
##########################################################################################
# Install
##########################################################################################
# Create mod paths # Create mod paths
rm -rf $MODPATH 2>/dev/null rm -rf $MODPATH 2>/dev/null
mkdir -p $MODPATH mkdir -p $MODPATH
on_install ##########
# Install
##########
# Remove placeholder if is_legacy_script; then
rm -f $MODPATH/system/placeholder 2>/dev/null unzip -oj "$ZIPFILE" module.prop install.sh uninstall.sh 'common/*' -d $TMPDIR >&2
# Custom uninstaller # Load install script
[ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh . $TMPDIR/install.sh
# Auto Mount # Callbacks
$SKIPMOUNT && touch $MODPATH/skip_mount print_modname
on_install
# prop files # Custom uninstaller
$PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop [ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh
# Module info # Skip mount
cp -af $TMPDIR/module.prop $MODPATH/module.prop $SKIPMOUNT && touch $MODPATH/skip_mount
if $BOOTMODE; then
# Update info for Magisk Manager # prop file
mktouch $NVBASE/modules/$MODID/update $PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop
cp -af $TMPDIR/module.prop $NVBASE/modules/$MODID/module.prop
# Module info
cp -af $TMPDIR/module.prop $MODPATH/module.prop
# post-fs-data scripts
$POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh
# service scripts
$LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh
ui_print "- Setting permissions"
set_permissions
else
print_modname
ui_print "- Extracting module files"
unzip -o "$ZIPFILE" -d $MODPATH >&2
# Default permissions
set_perm_recursive $MODPATH 0 0 0755 0644
# Load customization script
[ -f $MODPATH/customize.sh ] && . $MODPATH/customize.sh
fi fi
# post-fs-data mode scripts
$POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh
# service mode scripts
$LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh
# Handle replace folders # Handle replace folders
for TARGET in $REPLACE; do for TARGET in $REPLACE; do
ui_print "- Replace target: $TARGET"
mktouch $MODPATH$TARGET/.replace mktouch $MODPATH$TARGET/.replace
done done
ui_print "- Setting permissions" if $BOOTMODE; then
set_permissions # Update info for Magisk Manager
mktouch $NVBASE/modules/$MODID/update
cp -af $MODPATH/module.prop $NVBASE/modules/$MODID/module.prop
fi
########################################################################################## # Copy over custom sepolicy rules
if [ -f $MODPATH/sepolicy.rule -a -e $PERSISTDIR ]; then
ui_print "- Installing custom sepolicy patch"
PERSISTMOD=$PERSISTDIR/magisk/$MODID
mkdir -p $PERSISTMOD
cp -af $MODPATH/sepolicy.rule $PERSISTMOD/sepolicy.rule
fi
# Remove stuffs that don't belong to modules
rm -rf \
$MODPATH/system/placeholder $MODPATH/customize.sh \
$MODPATH/META-INF $MODPATH/README.md $MODPATH/.git* \
2>/dev/null
##############
# Finalizing # Finalizing
########################################################################################## ##############
cd / cd /
$BOOTMODE || recovery_cleanup $BOOTMODE || recovery_cleanup
rm -rf $TMPDIR $MOUNTPATH rm -rf $TMPDIR
ui_print "- Done" ui_print "- Done"
exit 0 exit 0

View File

@ -5,27 +5,8 @@
# #
######################################### #########################################
##########
# Presets
##########
#MAGISK_VERSION_STUB #MAGISK_VERSION_STUB
# Detect whether in boot mode
[ -z $BOOTMODE ] && BOOTMODE=false
$BOOTMODE || ps | grep zygote | grep -qv grep && BOOTMODE=true
$BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -qv grep && BOOTMODE=true
# Presets
MAGISKTMP=/sbin/.magisk
NVBASE=/data/adb
[ -z $TMPDIR ] && TMPDIR=/dev/tmp
# Bootsigner related stuff
BOOTSIGNERCLASS=a.a
BOOTSIGNER="/system/bin/dalvikvm -Xnodex2oat -Xnoimage-dex2oat -cp \$APK \$BOOTSIGNERCLASS"
BOOTSIGNED=false
################### ###################
# Helper Functions # Helper Functions
################### ###################
@ -128,15 +109,15 @@ recovery_actions() {
} }
recovery_cleanup() { recovery_cleanup() {
export PATH=$OLD_PATH
[ -z $OLD_LD_LIB ] || export LD_LIBRARY_PATH=$OLD_LD_LIB
[ -z $OLD_LD_PRE ] || export LD_PRELOAD=$OLD_LD_PRE
[ -z $OLD_LD_CFG ] || export LD_CONFIG_FILE=$OLD_LD_CFG
ui_print "- Unmounting partitions" ui_print "- Unmounting partitions"
umount -l /system_root 2>/dev/null umount -l /system_root 2>/dev/null
umount -l /system 2>/dev/null umount -l /system 2>/dev/null
umount -l /vendor 2>/dev/null umount -l /vendor 2>/dev/null
umount -l /dev/random 2>/dev/null umount -l /dev/random 2>/dev/null
export PATH=$OLD_PATH
[ -z $OLD_LD_LIB ] || export LD_LIBRARY_PATH=$OLD_LD_LIB
[ -z $OLD_LD_PRE ] || export LD_PRELOAD=$OLD_LD_PRE
[ -z $OLD_LD_CFG ] || export LD_CONFIG_FILE=$OLD_LD_CFG
} }
####################### #######################
@ -165,19 +146,29 @@ find_block() {
return 1 return 1
} }
mount_part() { # mount_name <partname> <mountpoint> <flag>
$BOOTMODE && return mount_name() {
local PART=$1 local PART=$1
local POINT=/${PART} local POINT=$2
local FLAG=$3
[ -L $POINT ] && rm -f $POINT [ -L $POINT ] && rm -f $POINT
mkdir $POINT 2>/dev/null mkdir -p $POINT 2>/dev/null
is_mounted $POINT && return is_mounted $POINT && return
ui_print "- Mounting $PART" ui_print "- Mounting $POINT"
mount -o ro $POINT 2>/dev/null # First try mounting with fstab
mount $FLAG $POINT 2>/dev/null
if ! is_mounted $POINT; then if ! is_mounted $POINT; then
local BLOCK=`find_block $PART$SLOT` local BLOCK=`find_block $PART`
mount -o ro $BLOCK $POINT mount $FLAG $BLOCK $POINT
fi fi
}
mount_ro_ensure() {
# We handle ro partitions only in recovery
$BOOTMODE && return
local PART=$1$SLOT
local POINT=/$1
mount_name $PART $POINT '-o ro'
is_mounted $POINT || abort "! Cannot mount $POINT" is_mounted $POINT || abort "! Cannot mount $POINT"
} }
@ -190,7 +181,8 @@ mount_partitions() {
fi fi
[ -z $SLOT ] || ui_print "- Current boot slot: $SLOT" [ -z $SLOT ] || ui_print "- Current boot slot: $SLOT"
mount_part system # Mount ro partitions
mount_ro_ensure system
if [ -f /system/init.rc ]; then if [ -f /system/init.rc ]; then
SYSTEM_ROOT=true SYSTEM_ROOT=true
[ -L /system_root ] && rm -f /system_root [ -L /system_root ] && rm -f /system_root
@ -201,8 +193,20 @@ mount_partitions() {
grep ' / ' /proc/mounts | grep -qv 'rootfs' || grep -q ' /system_root ' /proc/mounts \ grep ' / ' /proc/mounts | grep -qv 'rootfs' || grep -q ' /system_root ' /proc/mounts \
&& SYSTEM_ROOT=true || SYSTEM_ROOT=false && SYSTEM_ROOT=true || SYSTEM_ROOT=false
fi fi
[ -L /system/vendor ] && mount_part vendor [ -L /system/vendor ] && mount_ro_ensure vendor
$SYSTEM_ROOT && ui_print "- Device is system-as-root" $SYSTEM_ROOT && ui_print "- Device is system-as-root"
# Persist partitions for module install in recovery
if ! $BOOTMODE && [ ! -z $PERSISTDIR ]; then
# Try to mount persist
PERSISTDIR=/persist
mount_name persist /persist
if ! is_mounted /persist; then
# Fallback to cache
mount_name cache /cache
is_mounted /cache && PERSISTDIR=/cache || PERSISTDIR=
fi
fi
} }
get_flags() { get_flags() {
@ -293,8 +297,8 @@ patch_dtbo_image() {
return 1 return 1
} }
# Common installation script for flash_script.sh and addon.d.sh
patch_boot_image() { patch_boot_image() {
# Common installation script for flash_script.sh (updater-script) and addon.d.sh
SOURCEDMODE=true SOURCEDMODE=true
cd $MAGISKBIN cd $MAGISKBIN
@ -448,8 +452,22 @@ request_zip_size_check() {
boot_actions() { return; } boot_actions() { return; }
######## ##########
# Setup # Presets
######## ##########
# Detect whether in boot mode
[ -z $BOOTMODE ] && ps | grep zygote | grep -qv grep && BOOTMODE=true
[ -z $BOOTMODE ] && ps -A 2>/dev/null | grep zygote | grep -qv grep && BOOTMODE=true
[ -z $BOOTMODE ] && BOOTMODE=false
MAGISKTMP=/sbin/.magisk
NVBASE=/data/adb
[ -z $TMPDIR ] && TMPDIR=/dev/tmp
# Bootsigner related stuff
BOOTSIGNERCLASS=a.a
BOOTSIGNER="/system/bin/dalvikvm -Xnodex2oat -Xnoimage-dex2oat -cp \$APK \$BOOTSIGNERCLASS"
BOOTSIGNED=false
resolve_vars resolve_vars