├── META-INF └── com │ └── google │ └── android │ ├── updater-script │ └── update-binary ├── common ├── file_contexts_image ├── system.prop ├── post-fs-data.sh └── service.sh ├── module.prop ├── README.md ├── config.sh └── system └── bin └── debloat_magisk /META-INF/com/google/android/updater-script: -------------------------------------------------------------------------------- 1 | #MAGISK 2 | -------------------------------------------------------------------------------- /common/file_contexts_image: -------------------------------------------------------------------------------- 1 | /magisk(/.*)? u:object_r:system_file:s0 2 | -------------------------------------------------------------------------------- /common/system.prop: -------------------------------------------------------------------------------- 1 | # This file will be read by resetprop 2 | # Example: Change dpi 3 | # ro.sf.lcd_density=320 4 | -------------------------------------------------------------------------------- /module.prop: -------------------------------------------------------------------------------- 1 | id=terminal_debloater 2 | name=Terminal Emulator Debloater 3 | version=v3.5 4 | versionCode=4 5 | author=veez21 6 | description=Debloat your device Systemless-ly! With choices for debloating in Terminal Emulator for every device! 7 | template=3 8 | -------------------------------------------------------------------------------- /common/post-fs-data.sh: -------------------------------------------------------------------------------- 1 | #!/system/bin/sh 2 | # Please don't hardcode /magisk/modname/... ; instead, please use $MODDIR/... 3 | # This will make your scripts compatible even if Magisk change its mount point in the future 4 | MODDIR=${0%/*} 5 | 6 | # This script will be executed in post-fs-data mode 7 | # More info in the main Magisk thread 8 | -------------------------------------------------------------------------------- /common/service.sh: -------------------------------------------------------------------------------- 1 | #!/system/bin/sh 2 | # Please don't hardcode /magisk/modname/... ; instead, please use $MODDIR/... 3 | # This will make your scripts compatible even if Magisk change its mount point in the future 4 | MODDIR=${0%/*} 5 | 6 | # This script will be executed in late_start service mode 7 | # More info in the main Magisk thread 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Terminal Debloater 2 | 3 | Debloat your phone with style! 4 | With your own choices in Terminal Emulator menu. 5 | Just enter this command in Terminal Emulator: 6 | 7 | debloat_magisk 8 | 9 | And you will be presented with a list of app names (might be not accurate, depending on folder name) inside /system. 10 | Just reboot and you will have it removed, systemless-ly :D 11 | -------------------------------------------------------------------------------- /config.sh: -------------------------------------------------------------------------------- 1 | ########################################################################################## 2 | # 3 | # Magisk 4 | # by topjohnwu 5 | # 6 | # This is a template zip for developers 7 | # 8 | ########################################################################################## 9 | ########################################################################################## 10 | # 11 | # Instructions: 12 | # 13 | # 1. Place your files into system folder (delete the placeholder file) 14 | # 2. Fill in your module's info into module.prop 15 | # 3. Configure the settings in this file (common/config.sh) 16 | # 4. For advanced features, add shell commands into the script files under common: 17 | # post-fs-data.sh, service.sh 18 | # 5. For changing props, add your additional/modified props into common/system.prop 19 | # 20 | ########################################################################################## 21 | 22 | ########################################################################################## 23 | # Defines 24 | ########################################################################################## 25 | 26 | # NOTE: This part has to be adjusted to fit your own needs 27 | 28 | # This will be the folder name under /magisk 29 | # This should also be the same as the id in your module.prop to prevent confusion 30 | MODID=terminal_debloater 31 | 32 | # Set to true if you need to enable Magic Mount 33 | # Most mods would like it to be enabled 34 | AUTOMOUNT=true 35 | 36 | # Set to true if you need to load system.prop 37 | PROPFILE=false 38 | 39 | # Set to true if you need post-fs-data script 40 | POSTFSDATA=false 41 | 42 | # Set to true if you need late_start service script 43 | LATESTARTSERVICE=false 44 | 45 | ########################################################################################## 46 | # Installation Message 47 | ########################################################################################## 48 | 49 | # Set what you want to show when installing your mod 50 | 51 | print_modname() { 52 | ui_print "******************************" 53 | ui_print " Terminal Debloater" 54 | ui_print " by veez21 @ xda-developers" 55 | ui_print "******************************" 56 | } 57 | 58 | ########################################################################################## 59 | # Replace list 60 | ########################################################################################## 61 | 62 | # List all directories you want to directly replace in the system 63 | # By default Magisk will merge your files with the original system 64 | # Directories listed here however, will be directly mounted to the correspond directory in the system 65 | 66 | # You don't need to remove the example below, these values will be overwritten by your own list 67 | # This is an example 68 | REPLACE=" 69 | /system/app/Youtube 70 | /system/priv-app/SystemUI 71 | /system/priv-app/Settings 72 | /system/framework 73 | " 74 | 75 | # Construct your own list here, it will overwrite the example 76 | # !DO NOT! remove this if you don't need to replace anything, leave it empty as it is now 77 | REPLACE=" 78 | " 79 | 80 | ########################################################################################## 81 | # Permissions 82 | ########################################################################################## 83 | 84 | # NOTE: This part has to be adjusted to fit your own needs 85 | 86 | set_permissions() { 87 | # Default permissions, don't remove them 88 | set_perm_recursive $MODPATH 0 0 0755 0644 89 | 90 | # Only some special files require specific permissions 91 | # The default permissions should be good enough for most cases 92 | 93 | # Some templates if you have no idea what to do: 94 | 95 | # set_perm_recursive (default: u:object_r:system_file:s0) 96 | # set_perm_recursive $MODPATH/system/lib 0 0 0755 0644 97 | 98 | # set_perm (default: u:object_r:system_file:s0) 99 | # set_perm $MODPATH/system/bin/app_process32 0 2000 0755 u:object_r:zygote_exec:s0 100 | # set_perm $MODPATH/system/bin/dex2oat 0 2000 0755 u:object_r:dex2oat_exec:s0 101 | # set_perm $MODPATH/system/lib/libart.so 0 0 0644 102 | set_perm $MODPATH/system/bin/debloat_magisk 0 0 0777 103 | } 104 | 105 | detect_unin() { 106 | if [ -d /magisk/$MODID ]; then 107 | c=1 108 | for i in $(find /magisk/$MODID -name '.replace'); do 109 | export unin_app_$c=$i 110 | c=$((c+1)) 111 | done 112 | fi 113 | } 114 | 115 | reuninstall() { 116 | for i in $(set | grep 'unin_app_'); do 117 | app=${i#*=} 118 | app=$(echo $app | tr -d "'") 119 | mktouch $app 120 | done 121 | } 122 | -------------------------------------------------------------------------------- /system/bin/debloat_magisk: -------------------------------------------------------------------------------- 1 | #!/system/bin/sh 2 | # Terminal Debloater (Magisk) 3 | # by veez21 @ xda-developers 4 | 5 | # Default Variables 6 | div="===========================" 7 | MODDIR=/magisk/terminal_debloater 8 | prop=$MODDIR/system.prop 9 | G='\e[01;32m' # GREEN 10 | R='\e[01;31m' # RED 11 | Y='\e[01;33m' # YELLOW 12 | B='\e[01;34m' # BLUE 13 | V='\e[01;35m' # VIOLET 14 | Bl='\e[01;30m' # BLACK 15 | C='\e[01;36m' # CYAN 16 | W='\e[01;37m' # WHITE 17 | N='\e[00;37;40m' # 18 | 19 | #=========================== Functions 20 | get_file_prop() { 21 | _prop=$2 22 | _prop=$(grep "$1=" $_prop) 23 | val=${_prop#*=} 24 | echo $val 25 | unset _prop 26 | } 27 | 28 | set_file_prop() { 29 | _prop=$3 30 | sed -i "s/${1}=.*/${1}=${2}/g" $_prop 31 | unset _prop 32 | } 33 | 34 | mktouch() { 35 | mkdir -p ${1%/*} 36 | if [ -z "$2" ]; then 37 | touch $1 38 | else 39 | echo $2 > $1 40 | fi 41 | chmod 644 $1 42 | } 43 | 44 | #=========================== Extra Variables 45 | VER=$(get_file_prop version $MODDIR/module.prop) 46 | REL=$(get_file_prop versionCode $MODDIR/module.prop) 47 | 48 | #=========================== Main 49 | clear 50 | 51 | show_rein=0 52 | 53 | get_app_name() { 54 | if [ -x /system/bin/aapt ]; then 55 | app_name=$(aapt dump badging $1/${name[$2]}.apk | grep 'application-label:' 2>/dev/null) 56 | if [ $? -gt 0 ]; then 57 | app_name[$2]=${name[$2]} 58 | return 59 | fi 60 | app_name=${app_name#*:} 61 | app_name[$2]=$(echo $app_name | tr ' ' '_' | tr -d "'") 62 | else 63 | app_name[$2]=${name[$2]} 64 | fi 65 | } 66 | 67 | list_system_app() { 68 | c=1 69 | x=1 70 | for i in $(ls /system/app); do 71 | app[$x]=/system/app/$i 72 | if [ ! -d $MODDIR${app[$x]} ]; then 73 | name[$x]=${i%/*} 74 | get_app_name ${app[$x]} $x 75 | c=$((c+1));x=$((x+1)) 76 | fi 77 | done 78 | } 79 | 80 | list_system_priv-app() { 81 | c=1 82 | x=1 83 | for i in $(ls /system/priv-app); do 84 | privapp[$x]=/system/priv-app/$i 85 | if [ ! -d $MODDIR${privapp[$x]} ]; then 86 | name[$x]=${i%/*} 87 | get_app_name ${privapp[$x]} $x 88 | c=$((c+1));x=$((x+1)) 89 | fi 90 | done 91 | } 92 | 93 | list_unin_app() { 94 | c=1 95 | if [ -d /system/app ] && [ -d $MODDIR/system/app ]; then 96 | for i in $(ls $MODDIR/system/app); do 97 | unin_app[$c]=$MODDIR/system/app/$i 98 | name_unin[$c]=$(cat $MODDIR/system/app/$i/.replace) 99 | if [ $? -gt 0 ] || [ -z ${name_unin[$c]} ] || [[ ! $(cat $MODDIR/system/app/$i/.replace) ]]; then 100 | name_unin[$c]=$i 101 | fi 102 | echo " $c - ${W}${name_unin[$c]}${N}" | tr '_' ' ' 103 | c=$((c+1)) 104 | done 105 | fi 106 | if [ -d /system/priv-app ] && [ -d $MODDIR/system/priv-app ]; then 107 | for i in $(ls $MODDIR/system/priv-app); do 108 | unin_app[$c]=$MODDIR/system/priv-app/$i 109 | name_unin[$c]=$(cat $MODDIR/system/priv-app/$i/.replace) 110 | if [ $? -gt 0 ] || [ -z ${name_unin[$c]} ] || [[ ! $(cat $MODDIR/system/priv-app/$i/.replace) ]]; then 111 | name_unin[$c]=$i 112 | fi 113 | echo " $c - ${W}${name_unin[$c]}${N}" | tr '_' ' ' 114 | c=$((c+1)) 115 | done 116 | fi 117 | } 118 | 119 | if [ -d $MODDIR/system/app ]; then 120 | for i in $MODDIR/system/app/*; do 121 | if [ -f $i/.replace ]; then 122 | show_rein=1 123 | break 124 | fi 125 | done 126 | elif [ -d $MODDIR/system/priv-app ]; then 127 | for i in $MODDIR/system/priv-app/*; do 128 | if [ -f $i/.replace ]; then 129 | show_rein=1 130 | break 131 | fi 132 | done 133 | fi 134 | 135 | echo "$div" 136 | echo "${R}Terminal Debloater${N} ${W}$VER${N}(${Bl}${REL}${N})" 137 | echo "by veez21 @ xda-developers" 138 | echo "$div" 139 | echo "" 140 | if [ -d /system/app ]; then 141 | echo " 1 - ${W}System Apps${N}" 142 | fi 143 | if [ -d /system/priv-app ]; then 144 | echo " 2 - ${W}System Priv-Apps${N}" 145 | fi 146 | if [ $show_rein == 1 ]; then 147 | echo " 3 - ${W}Reinstall Uninstalled Apps${N}" 148 | fi 149 | echo " 0 - ${Bl}Exit${N}" 150 | echo "" 151 | echo -n "[CHOICE]: " 152 | read choice 153 | if [ "$choice" == "1" ]; then 154 | if [ -d /system/app ]; then 155 | clear 156 | echo "$div" 157 | echo "${R}System Apps${N}" 158 | echo "$div" 159 | echo "" 160 | echo "${G}Loading Apps...${N}" 161 | list_system_app 2>/dev/null 162 | c=1 163 | for i in $(seq 1 $((${#app_name[@]}-1))); do 164 | echo " $c - ${W}${app_name[$i]}${N}" | tr '_' ' ' 165 | c=$((c+1)) 166 | done 167 | echo "" 168 | echo " m - ${G}Uninstall Multiple${N}" 169 | echo " 0 - ${Bl}Exit${N}" 170 | echo "$div" 171 | echo -n "[CHOICE]: " 172 | read app 173 | if [ "$app" == m ]; then 174 | echo "Choose numbers listed above." 175 | echo "Do not repeat the same number." 176 | echo " 0 - Proceed to Uninstall choices" 177 | echo -n " > " 178 | c=1 179 | while read app; do 180 | if [ "$app" == 0 ]; then 181 | break 182 | fi 183 | echo "Add to Queue: ${R}${app_name[$app]}${N}" | tr '_' ' ' 184 | multiple[$c]=$MODDIR${app[$app]} 185 | choice[$c]=$app 186 | c=$((c+1)) 187 | busybox printf " > " 188 | done 189 | if [ "${#multiple[@]}" == 0 ]; then 190 | echo "No app chosen" 191 | exit 1 192 | else 193 | c=1 194 | for i in ${multiple[@]}; do 195 | echo "Uninstalling ${R}${app_name[${choice[$c]}]}${N}" | tr '_' ' ' 196 | mktouch $i/.replace ${app_name[${choice[$c]}]} 197 | sleep 0.5 198 | c=$((c+1)) 199 | done 200 | exit 201 | fi 202 | elif [ "$app" -gt ${#app[@]} ] || [ "$app" -lt 0 ] || [ "$app" == "" ] || [ -n "$(echo $app | tr -d '0-9')" ] ; then 203 | echo "Invalid" 204 | exit 1 205 | elif [ "$app" == "0" ]; then 206 | exit 207 | else 208 | echo "Uninstalling ${R}${app_name[$app]}${N}" | tr '_' ' ' 209 | sleep 1 210 | mktouch $MODDIR${app[$app]}/.replace ${app_name[$app]} 211 | echo "Reboot to apply changes" 212 | exit 213 | fi 214 | else 215 | echo Invalid 216 | exit 1 217 | fi 218 | elif [ "$choice" == 2 ]; then 219 | if [ -d /system/priv-app ]; then 220 | clear 221 | echo "$div" 222 | echo "${R}System Priv-Apps${N}" 223 | echo "$div" 224 | echo "" 225 | echo "${G}Loading Apps...${N}" 226 | list_system_priv-app 2>/dev/null 227 | c=1 228 | for i in $(seq 1 $((${#app_name[@]}-1))); do 229 | echo " $c - ${W}${app_name[$i]}${N}" | tr '_' ' ' 230 | c=$((c+1)) 231 | done 232 | echo "" 233 | echo " m - ${G}Uninstall Multiple${N}" 234 | echo " 0 - ${Bl}Exit${N}" 235 | echo "$div" 236 | echo -n "[CHOICE]: " 237 | read privapp 238 | if [ "$privapp" == m ]; then 239 | echo "Choose numbers listed above." 240 | echo "Do not repeat the same number." 241 | echo " 0 - Proceed to Uninstall choices" 242 | echo -n " > " 243 | c=1 244 | while read app; do 245 | if [ "$app" == 0 ]; then 246 | break 247 | fi 248 | echo "Add to Queue: ${R}${app_name[$app]}${N}" | tr '_' ' ' 249 | multiple[$c]=$MODDIR${privapp[$app]} 250 | choice[$c]=$app 251 | c=$((c+1)) 252 | busybox printf " > " 253 | done 254 | if [ "${#multiple[@]}" == 0 ]; then 255 | echo "No app chosen" 256 | exit 1 257 | else 258 | c=1 259 | for i in ${multiple[@]}; do 260 | echo "Uninstalling ${R}${app_name[${choice[$c]}]}${N}" | tr '_' ' ' 261 | mktouch $i/.replace ${app_name[${choice[$c]}]} 262 | sleep 0.5 263 | c=$((c+1)) 264 | done 265 | exit 266 | fi 267 | elif [ "$privapp" -gt ${#privapp[@]} ] || [ "$privapp" -lt 0 ] || [ "$privapp" == "" ] || [ -n "$(echo $privapp | tr -d '0-9')" ] ; then 268 | echo "Invalid" 269 | exit 1 270 | elif [ "$privapp" == "0" ]; then 271 | exit 272 | else 273 | echo "Uninstalling ${R}${app_name[$privapp]}${N}" | tr '_' ' ' 274 | sleep 1 275 | mktouch $MODDIR${privapp[$privapp]}/.replace ${app_name[$privapp]} 276 | echo "Reboot to apply changes" 277 | exit 278 | fi 279 | else 280 | echo Invalid 281 | exit 1 282 | fi 283 | elif [ "$choice" == 3 ]; then 284 | if [ $show_rein == 1 ]; then 285 | clear 286 | echo "$div" 287 | echo "${R}Reinstall${N}" 288 | echo "$div" 289 | echo "" 290 | list_unin_app 291 | echo " 0 - ${Bl}Exit${N}" 292 | echo "" 293 | echo -n "[CHOICE]: " 294 | read rein 295 | if [ "$rein" -gt ${#name_unin[@]} ] || [ "$rein" -lt 0 ] || [ "$rein" == "" ] || [ -n "$(echo $rein | tr -d '0-9')" ] ; then 296 | echo "Invalid" 297 | exit 1 298 | elif [ "$rein" == "0" ]; then 299 | exit 300 | else 301 | echo "Reinstalling ${G}${name_unin[$rein]}${N}" | tr '_' ' ' 302 | sleep 1 303 | rm -rf ${unin_app[$rein]} 304 | echo "Reboot to apply changes" 305 | exit 306 | fi 307 | else 308 | echo "Invalid" 309 | exit 1 310 | fi 311 | 312 | #====================================================================== 313 | elif [ "$app" == "0" ]; then 314 | exit 315 | else echo Invalid 316 | exit 1 317 | fi 318 | 319 | exit $? -------------------------------------------------------------------------------- /META-INF/com/google/android/update-binary: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | 3 | # Detect whether in boot mode 4 | ps | grep zygote | grep -v grep >/dev/null && BOOTMODE=true || BOOTMODE=false 5 | 6 | # Default permissions 7 | umask 022 8 | 9 | ########################################################################################## 10 | # Functions 11 | ########################################################################################## 12 | 13 | ui_print() { 14 | if $BOOTMODE; then 15 | echo "$1" 16 | else 17 | echo -n -e "ui_print $1\n" >> /proc/self/fd/$OUTFD 18 | echo -n -e "ui_print\n" >> /proc/self/fd/$OUTFD 19 | fi 20 | } 21 | 22 | grep_prop() { 23 | REGEX="s/^$1=//p" 24 | shift 25 | FILES=$@ 26 | if [ -z "$FILES" ]; then 27 | FILES='/system/build.prop' 28 | fi 29 | cat $FILES 2>/dev/null | sed -n "$REGEX" | head -n 1 30 | } 31 | 32 | is_mounted() { 33 | if [ ! -z "$2" ]; then 34 | cat /proc/mounts | grep $1 | grep $2, >/dev/null 35 | else 36 | cat /proc/mounts | grep $1 >/dev/null 37 | fi 38 | return $? 39 | } 40 | 41 | mount_image() { 42 | if [ ! -d "$2" ]; then 43 | mount -o rw,remount rootfs / 44 | mkdir -p $2 2>/dev/null 45 | ($BOOTMODE) && mount -o ro,remount rootfs / 46 | [ ! -d "$2" ] && return 1 47 | fi 48 | if (! is_mounted $2); then 49 | LOOPDEVICE= 50 | for LOOP in 0 1 2 3 4 5 6 7; do 51 | if (! is_mounted $2); then 52 | LOOPDEVICE=/dev/block/loop$LOOP 53 | if [ ! -f "$LOOPDEVICE" ]; then 54 | mknod $LOOPDEVICE b 7 $LOOP 2>/dev/null 55 | fi 56 | losetup $LOOPDEVICE $1 57 | if [ "$?" -eq "0" ]; then 58 | mount -t ext4 -o loop $LOOPDEVICE $2 59 | if (! is_mounted $2); then 60 | /system/bin/toolbox mount -t ext4 -o loop $LOOPDEVICE $2 61 | fi 62 | if (! is_mounted $2); then 63 | /system/bin/toybox mount -t ext4 -o loop $LOOPDEVICE $2 64 | fi 65 | fi 66 | if (is_mounted $2); then 67 | ui_print "- Mounting $1 to $2" 68 | break; 69 | fi 70 | fi 71 | done 72 | fi 73 | } 74 | 75 | set_perm() { 76 | chown $2:$3 $1 || exit 1 77 | chmod $4 $1 || exit 1 78 | if [ ! -z "$5" ]; then 79 | chcon $5 $1 2>/dev/null 80 | else 81 | chcon 'u:object_r:system_file:s0' $1 2>/dev/null 82 | fi 83 | } 84 | 85 | set_perm_recursive() { 86 | find $1 -type d 2>/dev/null | while read dir; do 87 | set_perm $dir $2 $3 $4 $6 88 | done 89 | find $1 -type f 2>/dev/null | while read file; do 90 | set_perm $file $2 $3 $5 $6 91 | done 92 | } 93 | 94 | mktouch() { 95 | mkdir -p ${1%/*} 96 | if [ -z "$2" ]; then 97 | touch $1 98 | else 99 | echo $2 > $1 100 | fi 101 | chmod 644 $1 102 | } 103 | 104 | request_size_check() { 105 | reqSizeM=`unzip -l "$1" 2>/dev/null | tail -n 1 | awk '{ print $1 }'` 106 | reqSizeM=$((reqSizeM / 1048576 + 1)) 107 | } 108 | 109 | image_size_check() { 110 | e2fsck -yf $1 111 | curBlocks=`e2fsck -n $1 2>/dev/null | grep $1 | cut -d, -f3 | cut -d\ -f2`; 112 | curUsedM=`echo "$curBlocks" | cut -d/ -f1` 113 | curSizeM=`echo "$curBlocks" | cut -d/ -f1` 114 | curFreeM=$(((curSizeM - curUsedM) * 4 / 1024)) 115 | curUsedM=$((curUsedM * 4 / 1024 + 1)) 116 | curSizeM=$((curSizeM * 4 / 1024)) 117 | } 118 | 119 | ########################################################################################## 120 | # Flashable update-binary preparation 121 | ########################################################################################## 122 | 123 | OUTFD=$2 124 | ZIP=$3 125 | 126 | readlink /proc/$$/fd/$OUTFD 2>/dev/null | grep /tmp >/dev/null 127 | if [ "$?" -eq "0" ]; then 128 | OUTFD=0 129 | 130 | for FD in `ls /proc/$$/fd`; do 131 | readlink /proc/$$/fd/$FD 2>/dev/null | grep pipe >/dev/null 132 | if [ "$?" -eq "0" ]; then 133 | ps | grep " 3 $FD " | grep -v grep >/dev/null 134 | if [ "$?" -eq "0" ]; then 135 | OUTFD=$FD 136 | break 137 | fi 138 | fi 139 | done 140 | fi 141 | 142 | if $BOOTMODE && ! is_mounted /magisk; then 143 | ui_print "! Magisk is not activated!... abort" 144 | exit 1 145 | fi 146 | 147 | # Fix SuperSU..... 148 | $BOOTMODE && $BINDIR/sepolicy-inject --live "allow fsck * * *" 149 | 150 | # This path should work in any cases 151 | TMPDIR=/dev/tmp 152 | 153 | MOUNTPATH=/magisk 154 | IMGNAME=magisk.img 155 | 156 | if $BOOTMODE; then 157 | MOUNTPATH=/dev/magisk_merge 158 | IMGNAME=magisk_merge.img 159 | fi 160 | 161 | mkdir -p $TMPDIR 2>/dev/null 162 | cd $TMPDIR 163 | unzip -o "$ZIP" config.sh 164 | 165 | if [ ! -f "config.sh" ]; then 166 | ui_print "! Failed: Unable to extract zip file!" 167 | exit 1 168 | fi 169 | 170 | source config.sh 171 | 172 | INSTALLER=$TMPDIR/$MODID 173 | MODPATH=$MOUNTPATH/$MODID 174 | 175 | mkdir -p $INSTALLER 176 | cd $INSTALLER 177 | unzip -o "$ZIP" "common/*" module.prop 178 | 179 | ########################################################################################## 180 | # Main 181 | ########################################################################################## 182 | 183 | # Print mod name 184 | print_modname 185 | 186 | # Please leave this message in your flashable zip for credits :) 187 | ui_print "******************************" 188 | ui_print "Powered by Magisk (@topjohnwu)" 189 | ui_print "******************************" 190 | 191 | ui_print "- Mounting /system(ro), /vendor(ro), /data, /cache" 192 | mount -o ro /system 2>/dev/null 193 | mount -o ro /vendor 2>/dev/null 194 | mount /data 2>/dev/null 195 | mount /cache 2>/dev/null 196 | 197 | if [ ! -f '/system/build.prop' ]; then 198 | ui_print "! Failed: /system could not be mounted!" 199 | exit 1 200 | fi 201 | 202 | API=`grep_prop ro.build.version.sdk` 203 | ABI=`grep_prop ro.product.cpu.abi | cut -c-3` 204 | ABI2=`grep_prop ro.product.cpu.abi2 | cut -c-3` 205 | ABILONG=`grep_prop ro.product.cpu.abi` 206 | 207 | ARCH=arm 208 | IS64BIT=false 209 | if [ "$ABI" = "x86" ]; then ARCH=x86; fi; 210 | if [ "$ABI2" = "x86" ]; then ARCH=x86; fi; 211 | if [ "$ABILONG" = "arm64-v8a" ]; then ARCH=arm64; IS64BIT=true; fi; 212 | if [ "$ABILONG" = "x86_64" ]; then ARCH=x64; IS64BIT=true; fi; 213 | 214 | # You can get the Android API version from $API, the CPU architecture from $ARCH 215 | # Useful if you are creating Android version / platform dependent mods 216 | 217 | if is_mounted /data; then 218 | IMG=/data/$IMGNAME 219 | if [ ! -f "/data/magisk.img" ]; then 220 | ui_print "! Magisk is not installed!" 221 | ui_print "! Magisk is required for this mod!" 222 | exit 1 223 | fi 224 | else 225 | IMG=/cache/magisk.img 226 | ui_print " " 227 | ui_print "***********************************" 228 | ui_print "* !! Data unavailible !! *" 229 | ui_print "* Magisk detection is impossible *" 230 | ui_print "* Installation will still proceed *" 231 | ui_print "* But please make sure you have *" 232 | ui_print "* Magisk installed!! *" 233 | ui_print "***********************************" 234 | ui_print " " 235 | fi 236 | 237 | request_size_check "$ZIP" 238 | 239 | if [ -f "$IMG" ]; then 240 | ui_print "- $IMG detected!" 241 | image_size_check $IMG 242 | if [ "$reqSizeM" -gt "$curFreeM" ]; then 243 | SIZE=$(((reqSizeM + curUsedM) / 32 * 32 + 64)) 244 | ui_print "- Resizing $IMG to ${SIZE}M..." 245 | resize2fs $IMG ${SIZE}M 246 | fi 247 | else 248 | SIZE=$((reqSizeM / 32 * 32 + 64)); 249 | ui_print "- Creating $IMG with size ${SIZE}M" 250 | make_ext4fs -l ${SIZE}M -a /magisk -S $INSTALLER/common/file_contexts_image $IMG 251 | fi 252 | 253 | mount_image $IMG $MOUNTPATH 254 | if ! is_mounted $MOUNTPATH; then 255 | ui_print "! $IMG mount failed... abort" 256 | exit 1 257 | fi 258 | 259 | # CUSTOM - Detect Uninstalled Apps 260 | detect_unin 261 | 262 | # Create mod paths 263 | rm -rf $MODPATH 2>/dev/null 264 | mkdir -p $MODPATH 265 | 266 | # Copy files 267 | ui_print "- Copying files" 268 | unzip -o "$ZIP" "system/*" -d $MODPATH 269 | 270 | # Handle replace folders 271 | for TARGET in $REPLACE; do 272 | mktouch $MODPATH$TARGET/.replace 273 | done 274 | 275 | # Auto Mount 276 | if $AUTOMOUNT; then 277 | mktouch $MODPATH/auto_mount 278 | fi 279 | 280 | # prop files 281 | if $PROPFILE; then 282 | cp -af $INSTALLER/common/system.prop $MODPATH/system.prop 283 | fi 284 | 285 | # Module info 286 | cp -af $INSTALLER/module.prop $MODPATH/module.prop 287 | if $BOOTMODE; then 288 | # Update info for Magisk Manager 289 | mktouch /magisk/$MODID/update 290 | cp -af $INSTALLER/module.prop /magisk/$MODID/module.prop 291 | fi 292 | 293 | # post-fs-data mode scripts 294 | if $POSTFSDATA; then 295 | cp -af $INSTALLER/common/post-fs-data.sh $MODPATH/post-fs-data.sh 296 | fi 297 | 298 | # service mode scripts 299 | if $LATESTARTSERVICE; then 300 | cp -af $INSTALLER/common/service.sh $MODPATH/service.sh 301 | fi 302 | 303 | # CUSTOM - Re-uninstall apps 304 | reuninstall 305 | 306 | ui_print "- Setting permissions" 307 | set_permissions 308 | 309 | ui_print "- Unmounting partitions" 310 | 311 | umount $MOUNTPATH 312 | losetup -d $LOOPDEVICE 313 | rmdir $MOUNTPATH 314 | 315 | # Shrink the image if possible 316 | image_size_check $IMG 317 | NEWDATASIZE=$((curUsedM / 32 * 32 + 32)) 318 | if [ "$curSizeM" -gt "$NEWDATASIZE" ]; then 319 | ui_print "- Shrinking $IMG to ${NEWDATASIZE}M..." 320 | resize2fs $IMG ${NEWDATASIZE}M 321 | fi 322 | 323 | if ! $BOOTMODE; then 324 | umount /system 325 | umount /vendor 2>/dev/null 326 | fi 327 | 328 | ui_print "- Done" 329 | exit 0 330 | --------------------------------------------------------------------------------