mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-25 04:37:39 +00:00
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:
parent
3beffd84d6
commit
b336655a79
@ -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
|
||||||
|
|
||||||
|
# Load install script
|
||||||
|
. $TMPDIR/install.sh
|
||||||
|
|
||||||
|
# Callbacks
|
||||||
|
print_modname
|
||||||
|
on_install
|
||||||
|
|
||||||
# Custom uninstaller
|
# Custom uninstaller
|
||||||
[ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh
|
[ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh
|
||||||
|
|
||||||
# Auto Mount
|
# Skip mount
|
||||||
$SKIPMOUNT && touch $MODPATH/skip_mount
|
$SKIPMOUNT && touch $MODPATH/skip_mount
|
||||||
|
|
||||||
# prop files
|
# prop file
|
||||||
$PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop
|
$PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop
|
||||||
|
|
||||||
# Module info
|
# Module info
|
||||||
cp -af $TMPDIR/module.prop $MODPATH/module.prop
|
cp -af $TMPDIR/module.prop $MODPATH/module.prop
|
||||||
if $BOOTMODE; then
|
|
||||||
# Update info for Magisk Manager
|
|
||||||
mktouch $NVBASE/modules/$MODID/update
|
|
||||||
cp -af $TMPDIR/module.prop $NVBASE/modules/$MODID/module.prop
|
|
||||||
fi
|
|
||||||
|
|
||||||
# post-fs-data mode scripts
|
# post-fs-data scripts
|
||||||
$POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh
|
$POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh
|
||||||
|
|
||||||
# service mode scripts
|
# service scripts
|
||||||
$LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh
|
$LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh
|
||||||
|
|
||||||
# Handle replace folders
|
|
||||||
for TARGET in $REPLACE; do
|
|
||||||
mktouch $MODPATH$TARGET/.replace
|
|
||||||
done
|
|
||||||
|
|
||||||
ui_print "- Setting permissions"
|
ui_print "- Setting permissions"
|
||||||
set_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
|
||||||
|
|
||||||
|
# Handle replace folders
|
||||||
|
for TARGET in $REPLACE; do
|
||||||
|
ui_print "- Replace target: $TARGET"
|
||||||
|
mktouch $MODPATH$TARGET/.replace
|
||||||
|
done
|
||||||
|
|
||||||
|
if $BOOTMODE; then
|
||||||
|
# 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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user