├── .gitattributes ├── .gitmodules ├── META-INF └── com │ └── google │ └── android │ ├── update-binary │ └── updater-script ├── README.md ├── common ├── file_contexts_image ├── post-fs-data.sh ├── service.sh └── system.prop ├── config.sh ├── module.prop └── system ├── app └── AppSystemizer │ └── com.loserskater.appsystemizer.apk └── placeholder /.gitattributes: -------------------------------------------------------------------------------- 1 | # Declare files that will always have LF line endings on checkout. 2 | META-INF/** text eol=lf 3 | common/** text eol=lf 4 | module.prop text eol=lf 5 | changelog.txt text eol=lf 6 | 7 | # Denote all files that are truly binary and should not be modified. 8 | system/** binary 9 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [system] 2 | latest-apk = latest-apk 3 | [submodule "system"] 4 | path = system 5 | url = git@github.com:loserskater/AppSystemizer-companion.git 6 | -------------------------------------------------------------------------------- /META-INF/com/google/android/update-binary: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | ########################################################################################## 3 | # 4 | # Magisk Module Template Install Script 5 | # by topjohnwu 6 | # 7 | ########################################################################################## 8 | 9 | # Detect whether in boot mode 10 | ps | grep zygote | grep -v grep >/dev/null && BOOTMODE=true || BOOTMODE=false 11 | $BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -v grep >/dev/null && BOOTMODE=true 12 | 13 | # This path should work in any cases 14 | TMPDIR=/dev/tmp 15 | MOUNTPATH=/magisk 16 | IMG=/data/magisk.img 17 | if $BOOTMODE; then 18 | MOUNTPATH=/dev/magisk_merge 19 | IMG=/data/magisk_merge.img 20 | fi 21 | INSTALLER=$TMPDIR/install 22 | MAGISKBIN=/data/magisk 23 | 24 | # Default permissions 25 | umask 022 26 | 27 | # Initial cleanup 28 | rm -rf $TMPDIR 2>/dev/null 29 | mkdir -p $INSTALLER 30 | 31 | ########################################################################################## 32 | # Environment 33 | ########################################################################################## 34 | 35 | OUTFD=$2 36 | ZIP=$3 37 | 38 | ui_print() { 39 | if $BOOTMODE; then 40 | echo "$1" 41 | else 42 | echo -n -e "ui_print $1\n" >> /proc/self/fd/$OUTFD 43 | echo -n -e "ui_print\n" >> /proc/self/fd/$OUTFD 44 | fi 45 | } 46 | 47 | require_new_magisk() { 48 | ui_print "***********************************" 49 | ui_print "! $MAGISKBIN isn't setup properly!" 50 | ui_print "! Please install Magisk v14.0+!" 51 | ui_print "***********************************" 52 | exit 1 53 | } 54 | 55 | ui_print "- Mounting /system, /vendor, /data, /cache" 56 | mount -o ro /system 2>/dev/null 57 | mount -o ro /vendor 2>/dev/null 58 | mount /data 2>/dev/null 59 | mount /cache 2>/dev/null 60 | 61 | # Utility functions must exist 62 | [ -f $MAGISKBIN/util_functions.sh ] || require_new_magisk 63 | # Load utility fuctions 64 | . $MAGISKBIN/util_functions.sh 65 | get_outfd 66 | 67 | $BOOTMODE && ! is_mounted /magisk && abort "! Magisk is not activated!" 68 | [ ! -f /system/build.prop ] && abort "! /system could not be mounted!" 69 | 70 | # Detect version and architecture 71 | api_level_arch_detect 72 | 73 | # You can get the Android API version from $API, the CPU architecture from $ARCH 74 | # Useful if you are creating Android version / platform dependent mods 75 | 76 | # We need busybox/binaries to be setup 77 | $BOOTMODE && boot_actions || recovery_actions 78 | 79 | ########################################################################################## 80 | # Preparation 81 | ########################################################################################## 82 | 83 | # Extract common files 84 | unzip -o "$ZIP" module.prop config.sh 'common/*' -d $INSTALLER 2>/dev/null 85 | 86 | [ ! -f $INSTALLER/config.sh ] && abort "! Unable to extract zip file!" 87 | # Load configurations 88 | . $INSTALLER/config.sh 89 | 90 | # Check the min magisk version 91 | MIN_VER=`grep_prop template $INSTALLER/module.prop` 92 | [ ! -z $MAGISK_VER_CODE -a $MAGISK_VER_CODE -ge $MIN_VER ] || require_new_magisk 93 | MODID=`grep_prop id $INSTALLER/module.prop` 94 | MODPATH=$MOUNTPATH/$MODID 95 | 96 | # Print mod name 97 | print_modname 98 | 99 | # Please leave this message in your flashable zip for credits :) 100 | ui_print "******************************" 101 | ui_print "Powered by Magisk (@topjohnwu)" 102 | ui_print "******************************" 103 | 104 | ########################################################################################## 105 | # Install 106 | ########################################################################################## 107 | 108 | request_zip_size_check "$ZIP" 109 | 110 | if [ -f "$IMG" ]; then 111 | ui_print "- Found $IMG" 112 | image_size_check $IMG 113 | if [ "$reqSizeM" -gt "$curFreeM" ]; then 114 | newSizeM=$(((reqSizeM + curUsedM) / 32 * 32 + 64)) 115 | ui_print "- Resizing $IMG to ${newSizeM}M" 116 | $MAGISKBIN/magisk --resizeimg $IMG $newSizeM 117 | fi 118 | else 119 | newSizeM=$((reqSizeM / 32 * 32 + 64)); 120 | ui_print "- Creating $IMG with size ${newSizeM}M" 121 | $MAGISKBIN/magisk --createimg $IMG $newSizeM 122 | fi 123 | 124 | ui_print "- Mounting $IMG to $MOUNTPATH" 125 | MAGISKLOOP=`$MAGISKBIN/magisk --mountimg $IMG $MOUNTPATH` 126 | is_mounted $MOUNTPATH || abort "! $IMG mount failed..." 127 | 128 | # Create mod paths 129 | rm -rf $MODPATH 2>/dev/null 130 | mkdir -p $MODPATH 131 | 132 | ui_print "- Extracting module files" 133 | unzip -o "$ZIP" 'system/*' -d $MODPATH 2>/dev/null 134 | 135 | # Handle replace folders 136 | for TARGET in $REPLACE; do 137 | mktouch $MODPATH$TARGET/.replace 138 | done 139 | 140 | # Auto Mount 141 | $AUTOMOUNT && touch $MODPATH/auto_mount 142 | 143 | # prop files 144 | $PROPFILE && cp -af $INSTALLER/common/system.prop $MODPATH/system.prop 145 | 146 | # Module info 147 | cp -af $INSTALLER/module.prop $MODPATH/module.prop 148 | if $BOOTMODE; then 149 | # Update info for Magisk Manager 150 | mktouch /magisk/$MODID/update 151 | cp -af $INSTALLER/module.prop /magisk/$MODID/module.prop 152 | fi 153 | 154 | # post-fs-data mode scripts 155 | $POSTFSDATA && cp -af $INSTALLER/common/post-fs-data.sh $MODPATH/post-fs-data.sh 156 | 157 | # service mode scripts 158 | $LATESTARTSERVICE && cp -af $INSTALLER/common/service.sh $MODPATH/service.sh 159 | 160 | # Run AppSystemizer script 161 | ui_print "- Running AppSystemizer" 162 | sh $MODPATH/post-fs-data.sh "upgrade" "$currentVer" "$currentVersionCode" 163 | 164 | ui_print "- Setting permissions" 165 | set_permissions 166 | 167 | ########################################################################################## 168 | # Finalizing 169 | ########################################################################################## 170 | 171 | $MAGISKBIN/magisk --umountimg $MOUNTPATH $MAGISKLOOP 172 | rmdir $MOUNTPATH 173 | 174 | # Shrink the image if possible 175 | image_size_check $IMG 176 | newSizeM=$((curUsedM / 32 * 32 + 64)) 177 | if [ $curSizeM -gt $newSizeM ]; then 178 | ui_print "- Shrinking $IMG to ${newSizeM}M" 179 | $MAGISKBIN/magisk --resizeimg $IMG $newSizeM 180 | fi 181 | 182 | $BOOTMODE || recovery_cleanup 183 | rm -rf $TMPDIR 184 | 185 | ui_print "- Done" 186 | exit 0 187 | -------------------------------------------------------------------------------- /META-INF/com/google/android/updater-script: -------------------------------------------------------------------------------- 1 | #MAGISK 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AppSystemizer 2 | This module converts user-installed apps to system apps (systemlessly thru magisk, without modifying your /system partition). Now comes with companion App Systemizer application written by [@loserskater](https://github.com/loserskater), which lets you pick any user-installed app to be converted to a system app (reboot is required after you select apps to be systemized). THIS MODULE CANNOT BE INSTALLED FROM RECOVERY! Install from Magisk Manager only. Check [Support thread](https://forum.xda-developers.com/showthread.php?t=3477512) for additional information. 3 | 4 | ## Supported Apps 5 | Only the launchers listed below are systemized by default. If you need to systemize any other user-installed apps, use the included companion AppSystemizer application written by [@loserskater](https://github.com/loserskater). 6 | * Action Launcher 3 (for Google Now integration) 7 | * Nexus/Pixel C Launcher (for Google Now integration) 8 | 9 | 10 | ## Change Log 11 | 14.0.0 12 | - Version 1400 template, REQUIRES magisk v14. 13 | 14 | 12.0.5 15 | - New Marshmallow-compatible companion app from [@loserskater](https://github.com/loserskater). 16 | 17 | 12.0.4 18 | - Installation from recovery is not supported. 19 | 20 | 12.0.3 21 | - Companion app update. 22 | - Script bugfix when magisk_merge was created too small. 23 | 24 | 12.0.2 25 | - Companion app bugfix update. 26 | - Log messages update. 27 | 28 | 12.0.1 29 | - Internal code re-organization. 30 | - A bit more verbose logging (in magisk log). 31 | - Companion app update to fix FCs. 32 | 33 | 12.0.0 34 | - Better integration with companion app. 35 | - Companion app update. 36 | - Change log trimmed of no longer relevant entries. 37 | -------------------------------------------------------------------------------- /common/file_contexts_image: -------------------------------------------------------------------------------- 1 | /magisk(/.*)? u:object_r:system_file:s0 2 | -------------------------------------------------------------------------------- /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 | 9 | # copied from update-binary 10 | ps | grep zygote | grep -v grep >/dev/null && BOOTMODE=true || BOOTMODE=false 11 | $BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -v grep >/dev/null && BOOTMODE=true 12 | 13 | is_mounted() { 14 | if [ ! -z "$2" ]; then 15 | cat /proc/mounts | grep $1 | grep $2, >/dev/null 16 | else 17 | cat /proc/mounts | grep $1 >/dev/null 18 | fi 19 | return $? 20 | } 21 | 22 | # Mount /data and /cache to access MAGISKBIN 23 | mount /data 2>/dev/null 24 | mount /cache 2>/dev/null 25 | 26 | # This path should work in any cases 27 | TMPDIR=/dev/tmp 28 | MOUNTPATH=/magisk 29 | INSTALLER=$TMPDIR/install 30 | if is_mounted /data; then 31 | IMG=/data/magisk.img 32 | MAGISKBIN=/data/magisk 33 | if $BOOTMODE; then 34 | MOUNTPATH=/dev/magisk_merge 35 | IMG=/data/magisk_merge.img 36 | fi 37 | else 38 | IMG=/cache/magisk.img 39 | MAGISKBIN=/cache/data_bin 40 | ui_print "- Data unavailable, using cache workaround" 41 | fi 42 | 43 | # Default permissions 44 | umask 022 45 | 46 | # Mount /data to access MAGISKBIN 47 | mount /data 2>/dev/null 48 | 49 | # Load utility fuctions 50 | . $MAGISKBIN/util_functions.sh 51 | get_outfd 52 | 53 | log_print() { 54 | if $BOOTMODE; then 55 | echo "$1" 56 | else 57 | echo -n -e "ui_print AppSystemizer${ver}: $*\n" >> /proc/self/fd/$OUTFD 58 | echo -n -e "ui_print\n" >> /proc/self/fd/$OUTFD 59 | fi 60 | log -p i -t "AppSystemizer${ver}" "$*" 61 | } 62 | 63 | # set +f 64 | STOREDLIST='/data/data/com.loserskater.appsystemizer/files/appslist.conf' 65 | [ -s "${MODDIR}/module.prop" ] && { ver="$(sed -n 's/version=//p' ${MODDIR}/module.prop)"; ver=${ver:+ $ver}; } 66 | apps=("com.google.android.apps.nexuslauncher,NexusLauncherPrebuilt" "com.google.android.apps.pixelclauncher,PixelCLauncherPrebuilt" "com.actionlauncher.playstore,ActionLauncher") 67 | 68 | appsys_request_size_check() { 69 | local i apps line pkg_name pkg_label appsys_reqSizeM=$((reqSizeM + 2)) 70 | [ -s "$STOREDLIST" ] && eval apps="($(<${STOREDLIST}))" 71 | for line in "${apps[@]}"; do 72 | IFS=',' read pkg_name pkg_label <<< $line 73 | [[ "$pkg_name" = "android" || "$pkg_label" = "AndroidSystem" ]] && continue 74 | [[ -z "$pkg_name" || -z "$pkg_label" ]] && continue 75 | for i in /data/app/${pkg_name}-*/base.apk; do 76 | if [ "$i" != "/data/app/${pkg_name}-*/base.apk" ]; then 77 | request_size_check $i 78 | appsys_reqSizeM=$((appsys_reqSizeM + reqSizeM)) 79 | fi 80 | done 81 | done 82 | reqSizeM=$appsys_reqSizeM 83 | } 84 | 85 | update() { 86 | log_print "Updating systemized apps" 87 | MODID=AppSystemizer 88 | TMPDIR=/dev/tmp 89 | INSTALLER=$TMPDIR/$MODID 90 | MODPATH=$MOUNTPATH/$MODID 91 | FCI='/magisk(/.*)? u:object_r:system_file:s0' 92 | 93 | appsys_request_size_check 94 | SIZE=$((reqSizeM / 32 * 32 + 64)); 95 | mkdir -p $INSTALLER 96 | echo "$FCI" > ${INSTALLER}/file_contexts_image 97 | if [ -e "$IMG" ]; then 98 | log_print "Existing $IMG found, resizing to ${SIZE}M" 99 | resize2fs "$IMG" ${SIZE}M 100 | else 101 | log_print "Creating $IMG with size ${SIZE}M" 102 | make_ext4fs -l ${SIZE}M -a /magisk -S $INSTALLER/file_contexts_image $IMG 103 | fi 104 | 105 | mount_image $IMG $MOUNTPATH 106 | if ! is_mounted $MOUNTPATH; then 107 | log_print "! $IMG mount failed... abort" 108 | exit 1 109 | fi 110 | 111 | cp -af $MODDIR/. $MODPATH 112 | MODDIR=$MODPATH 113 | run 114 | } 115 | 116 | upgrade() { 117 | log_print "Installing/Upgrading AppSystemizer" 118 | OLDSYSPRIVAPPDIR="/magisk/AppSystemizer/system/priv-app" 119 | local oldVer="${1:-0}" oldVersionCode="${2:-0}" 120 | if [ -d "${OLDSYSPRIVAPPDIR}" ]; then 121 | log_print "Existing AppSystemizer $oldVer module found." 122 | if [ $((oldVersionCode)) -ge 50 ]; then 123 | cp -rf "${OLDSYSPRIVAPPDIR}" "${MODDIR}/system/" && log_print "Migrated systemized apps from AppSystemizer $oldVer." 124 | else 125 | for line in "${apps[@]}"; do 126 | IFS=',' read pkg_name pkg_label <<< $line 127 | if [ -e "${OLDSYSPRIVAPPDIR}/${pkg_label}" ]; then 128 | mkdir -p "${MODDIR}/system/priv-app/${pkg_label}" 2>/dev/null 129 | cp -rf "${OLDSYSPRIVAPPDIR}/${pkg_label}/${pkg_label}.apk" "${MODDIR}/system/priv-app/${pkg_label}/${pkg_name}.apk" && \ 130 | log_print "Migrated ${pkg_label} from AppSystemizer $oldVer." 131 | chown 0:0 "${MODDIR}/system/priv-app/${pkg_label}" 132 | chmod 0755 "${MODDIR}/system/priv-app/${pkg_label}" 133 | chown 0:0 "${MODDIR}/system/priv-app/${pkg_label}/${pkg_name}.apk" 134 | chmod 0644 "${MODDIR}/system/priv-app/${pkg_label}/${pkg_name}.apk" 135 | fi 136 | done 137 | fi 138 | else 139 | run 140 | fi 141 | } 142 | 143 | run() { 144 | log_print "Running AppSystemizer" 145 | [ -s "$STOREDLIST" ] && { eval apps="($(<${STOREDLIST}))"; log_print "Loaded apps list from ${STOREDLIST}."; } || { unset STOREDLIST; } 146 | list="${apps[*]}"; 147 | for i in ${MODDIR}/system/priv-app/*/*.apk; do 148 | if [ "$i" != "${MODDIR}/system/priv-app/*/*.apk" ]; then 149 | pkg_name="${i##*/}"; pkg_name="${pkg_name%.*}"; pkg_label="${i%/*}"; pkg_label="${pkg_label##*/}"; 150 | if [ "$list" = "${list//${pkg_name}/}" ]; then 151 | rm -rf ${MODDIR}/system/priv-app/${pkg_label} && log_print "Unsystemized ${pkg_name}: change will take effect after reboot." 152 | fi 153 | fi 154 | done 155 | 156 | for line in "${apps[@]}"; do 157 | IFS=',' read pkg_name pkg_label <<< $line 158 | [[ "$pkg_name" = "android" || "$pkg_label" = "AndroidSystem" ]] && continue # workaround for Companion App 159 | [[ -z "$pkg_name" || -z "$pkg_label" ]] && { log_print "Package name or package label empty: ${pkg_name}/${pkg_label}."; continue; } 160 | for i in /data/app/${pkg_name}-*/base.apk; do 161 | if [ "$i" != "/data/app/${pkg_name}-*/base.apk" ]; then 162 | [ -e "${MODDIR}/system/priv-app/${pkg_label}" ] && { log_print "Ignoring ${pkg_name}: already a systemized app."; continue; } 163 | [ -e "/system/priv-app/${pkg_label}" ] && { log_print "Ignoring ${pkg_name}: already a system app."; continue; } 164 | mkdir -p "${MODDIR}/system/priv-app/${pkg_label}" 2>/dev/null 165 | if cp "$i" "${MODDIR}/system/priv-app/${pkg_label}/${pkg_name}.apk"; then 166 | log_print "Systemized ${pkg_name}: change will take effect after reboot." 167 | else 168 | log_print "Copy Failed: cp $i ${MODDIR}/system/priv-app/${pkg_label}/${pkg_name}.apk" 169 | [ -e ${MODDIR}/system/priv-app/${pkg_label} ] && rm -rf ${MODDIR}/system/priv-app/${pkg_label} 170 | fi 171 | chown 0:0 "${MODDIR}/system/priv-app/${pkg_label}" 172 | chmod 0755 "${MODDIR}/system/priv-app/${pkg_label}" 173 | chown 0:0 "${MODDIR}/system/priv-app/${pkg_label}/${pkg_name}.apk" 174 | chmod 0644 "${MODDIR}/system/priv-app/${pkg_label}/${pkg_name}.apk" 175 | elif [ -n "$STOREDLIST" ]; then 176 | log_print "Ignoring ${pkg_name}: app is not installed." 177 | fi 178 | done 179 | done 180 | } 181 | 182 | [ -d /system/priv-app ] || log_print "No access to /system/priv-app!" 183 | [ -d /data/app ] || log_print "No access to /data/app!" 184 | 185 | case $1 in 186 | upgrade) shift; upgrade "$1" "$2";; 187 | update) update;; 188 | *) run;; 189 | esac 190 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /common/system.prop: -------------------------------------------------------------------------------- 1 | # This file will be read by resetprop 2 | # Example: Change dpi 3 | # ro.sf.lcd_density=320 4 | -------------------------------------------------------------------------------- /config.sh: -------------------------------------------------------------------------------- 1 | ########################################################################################## 2 | # 3 | # Magisk Module Template Config Script 4 | # by topjohnwu 5 | # 6 | ########################################################################################## 7 | ########################################################################################## 8 | # 9 | # Instructions: 10 | # 11 | # 1. Place your files into system folder (delete the placeholder file) 12 | # 2. Fill in your module's info into module.prop 13 | # 3. Configure the settings in this file (common/config.sh) 14 | # 4. For advanced features, add shell commands into the script files under common: 15 | # post-fs-data.sh, service.sh 16 | # 5. For changing props, add your additional/modified props into common/system.prop 17 | # 18 | ########################################################################################## 19 | 20 | ########################################################################################## 21 | # Configs 22 | ########################################################################################## 23 | MODID=AppSystemizer 24 | 25 | # Set to true if you need to enable Magic Mount 26 | # Most mods would like it to be enabled 27 | AUTOMOUNT=true 28 | 29 | # Set to true if you need to load system.prop 30 | PROPFILE=false 31 | 32 | # Set to true if you need post-fs-data script 33 | POSTFSDATA=true 34 | 35 | # Set to true if you need late_start service script 36 | LATESTARTSERVICE=false 37 | 38 | ########################################################################################## 39 | # Installation Message 40 | ########################################################################################## 41 | 42 | # Set what you want to show when installing your mod 43 | 44 | print_modname() { 45 | ui_print "*******************************" 46 | ui_print " App Systemizer " 47 | ui_print "*******************************" 48 | ui_print " !! This module CANNOT be !! " 49 | ui_print " !! installed from recovery !! " 50 | ui_print " Please, reboot to Android " 51 | ui_print "and install from Magisk Manager" 52 | ui_print "*******************************" 53 | } 54 | 55 | ########################################################################################## 56 | # Replace list 57 | ########################################################################################## 58 | 59 | # List all directories you want to directly replace in the system 60 | # By default Magisk will merge your files with the original system 61 | # Directories listed here however, will be directly mounted to the correspond directory in the system 62 | 63 | # You don't need to remove the example below, these values will be overwritten by your own list 64 | # This is an example 65 | REPLACE=" 66 | /system/app/Youtube 67 | /system/priv-app/SystemUI 68 | /system/priv-app/Settings 69 | /system/framework 70 | " 71 | 72 | # Construct your own list here, it will overwrite the example 73 | # !DO NOT! remove this if you don't need to replace anything, leave it empty as it is now 74 | REPLACE=" 75 | " 76 | 77 | ########################################################################################## 78 | # Permissions 79 | ########################################################################################## 80 | 81 | set_permissions() { 82 | # Only some special files require specific permissions 83 | # The default permissions should be good enough for most cases 84 | 85 | # Here are some examples for the set_perm functions: 86 | 87 | # set_perm_recursive (default: u:object_r:system_file:s0) 88 | # set_perm_recursive $MODPATH/system/lib 0 0 0755 0644 89 | 90 | # set_perm (default: u:object_r:system_file:s0) 91 | # set_perm $MODPATH/system/bin/app_process32 0 2000 0755 u:object_r:zygote_exec:s0 92 | # set_perm $MODPATH/system/bin/dex2oat 0 2000 0755 u:object_r:dex2oat_exec:s0 93 | # set_perm $MODPATH/system/lib/libart.so 0 0 0644 94 | 95 | # The following is default permissions, DO NOT remove 96 | set_perm_recursive $MODPATH 0 0 0755 0644 97 | } 98 | 99 | # Retrieve current module.prop ver and versionCode 100 | [ -s "/magisk/$MODID/module.prop" ] && currentVer="$(sed -n 's/version=//p' /magisk/$MODID/module.prop)"; 101 | [ -s "/magisk/$MODID/module.prop" ] && currentVersionCode="$(sed -n 's/versionCode=//p' /magisk/$MODID/module.prop)"; 102 | -------------------------------------------------------------------------------- /module.prop: -------------------------------------------------------------------------------- 1 | id=AppSystemizer 2 | name=App Systemizer 3 | version=14.0.0 4 | versionCode=60 5 | author=loserskater, stangri 6 | description=This module converts user-installed apps to system apps with the help of companion AppSystemizer application. 7 | template=1400 8 | -------------------------------------------------------------------------------- /system/app/AppSystemizer/com.loserskater.appsystemizer.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stangri/AppSystemizer/6c9c4d7b61ce0abe02c04caa136b009f1917075e/system/app/AppSystemizer/com.loserskater.appsystemizer.apk -------------------------------------------------------------------------------- /system/placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stangri/AppSystemizer/6c9c4d7b61ce0abe02c04caa136b009f1917075e/system/placeholder --------------------------------------------------------------------------------