├── .gitattributes ├── .gitignore ├── META-INF └── com │ └── google │ └── android │ ├── update-binary │ └── updater-script ├── README.md ├── common ├── post-fs-data.sh ├── sepolicy.sh ├── service.sh ├── system.prop ├── unity_install.sh ├── unity_uninstall.sh └── unityfiles │ ├── addon.sh │ ├── tools │ ├── arm │ │ └── busybox │ └── x86 │ │ └── busybox │ └── util_functions.sh ├── custom ├── libv4a_xhifi_jb_NEON.so ├── libv4a_xhifi_jb_NOVFP.so └── libv4a_xhifi_jb_VFP.so ├── install.sh ├── module.prop ├── system ├── etc │ └── permissions │ │ └── privapp-permissions-com.vipercn.viper4android.xhifi.xml └── priv-app │ └── ViPER4AndroidXHiFi │ └── ViPER4AndroidXHiFi.apk └── uninstall.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | # Declare files that will always have LF line endings on checkout. 2 | *.sh text eol=lf 3 | *.prop text eol=lf 4 | *.md text eol=lf 5 | *.xml text eol=lf 6 | META-INF/** text eol=lf 7 | 8 | # Denote all files that are truly binary and should not be modified. 9 | common/unityfiles/tools/** binary 10 | addon/** binary 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /META-INF/com/google/android/update-binary: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | 3 | TMPDIR=/dev/tmp 4 | MOUNTPATH=/dev/magisk_img 5 | 6 | # Default permissions 7 | umask 022 8 | 9 | # Initial cleanup 10 | rm -rf $TMPDIR 2>/dev/null 11 | mkdir -p $TMPDIR 12 | 13 | # echo before loading util_functions 14 | ui_print() { echo "$1"; } 15 | 16 | require_new_magisk() { 17 | ui_print "***********************************" 18 | ui_print " Please install the latest Magisk! " 19 | ui_print "***********************************" 20 | exit 1 21 | } 22 | 23 | imageless_magisk() { 24 | [ $MAGISK_VER_CODE -gt 18100 ] 25 | return $? 26 | } 27 | 28 | ########################################################################################## 29 | # Environment 30 | ########################################################################################## 31 | 32 | OUTFD=$2 33 | ZIPFILE=$3 34 | 35 | mount /data 2>/dev/null 36 | 37 | # Load utility functions 38 | if [ -f /data/adb/magisk/util_functions.sh ]; then 39 | . /data/adb/magisk/util_functions.sh 40 | NVBASE=/data/adb 41 | elif [ -f /data/magisk/util_functions.sh ]; then 42 | require_new_magisk 43 | else 44 | UF=$TMPDIR/common/unityfiles 45 | unzip -oq "$ZIPFILE" 'common/unityfiles/util_functions.sh' -d $TMPDIR >&2 46 | [ -f "$UF/util_functions.sh" ] || { ui_print "! Unable to extract zip file !"; exit 1; } 47 | . $UF/util_functions.sh 48 | fi 49 | 50 | # Preperation for flashable zips 51 | setup_flashable 52 | 53 | # Mount partitions 54 | mount_partitions 55 | 56 | # Detect version and architecture 57 | api_level_arch_detect 58 | 59 | # Setup busybox and binaries 60 | $BOOTMODE && boot_actions || recovery_actions 61 | 62 | ########################################################################################## 63 | # Preparation 64 | ########################################################################################## 65 | 66 | # Extract common files 67 | unzip -oj "$ZIPFILE" module.prop install.sh uninstall.sh 'common/*' -d $TMPDIR >&2 68 | 69 | [ ! -f $TMPDIR/install.sh ] && abort "! Unable to extract zip file!" 70 | # Load install script 71 | . $TMPDIR/install.sh 72 | 73 | if $MAGISK; then 74 | if imageless_magisk; then 75 | $BOOTMODE && MODDIRNAME=modules_update || MODDIRNAME=modules 76 | MODULEROOT=$NVBASE/$MODDIRNAME 77 | else 78 | $BOOTMODE && IMGNAME=magisk_merge.img || IMGNAME=magisk.img 79 | IMG=$NVBASE/$IMGNAME 80 | request_zip_size_check "$ZIPFILE" 81 | mount_magisk_img 82 | MODULEROOT=$MOUNTPATH 83 | fi 84 | else 85 | MODULEROOT=$MOUNTPATH 86 | fi 87 | 88 | MODID=`grep_prop id $TMPDIR/module.prop` 89 | MODPATH=$MODULEROOT/$MODID 90 | 91 | print_modname 92 | 93 | # Anything after this point won't run 94 | 95 | ui_print "******************************" 96 | ui_print "Powered by Magisk (@topjohnwu)" 97 | ui_print "******************************" 98 | 99 | ########################################################################################## 100 | # Install 101 | ########################################################################################## 102 | 103 | # Create mod paths 104 | rm -rf $MODPATH 2>/dev/null 105 | mkdir -p $MODPATH 106 | 107 | on_install 108 | 109 | # Remove placeholder 110 | rm -f $MODPATH/system/placeholder 2>/dev/null 111 | 112 | # Custom uninstaller 113 | [ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh 114 | 115 | # Auto Mount 116 | if imageless_magisk; then 117 | $SKIPMOUNT && touch $MODPATH/skip_mount 118 | else 119 | $SKIPMOUNT || touch $MODPATH/auto_mount 120 | fi 121 | 122 | # prop files 123 | $PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop 124 | 125 | # Module info 126 | cp -af $TMPDIR/module.prop $MODPATH/module.prop 127 | if $BOOTMODE; then 128 | # Update info for Magisk Manager 129 | if imageless_magisk; then 130 | mktouch $NVBASE/modules/$MODID/update 131 | cp -af $TMPDIR/module.prop $NVBASE/modules/$MODID/module.prop 132 | else 133 | mktouch /sbin/.magisk/img/$MODID/update 134 | cp -af $TMPDIR/module.prop /sbin/.magisk/img/$MODID/module.prop 135 | fi 136 | fi 137 | 138 | # post-fs-data mode scripts 139 | $POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh 140 | 141 | # service mode scripts 142 | $LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh 143 | 144 | # Handle replace folders 145 | for TARGET in $REPLACE; do 146 | mktouch $MODPATH$TARGET/.replace 147 | done 148 | 149 | ui_print "- Setting permissions" 150 | set_permissions 151 | 152 | ########################################################################################## 153 | # Finalizing 154 | ########################################################################################## 155 | 156 | cd / 157 | imageless_magisk || unmount_magisk_img 158 | $BOOTMODE || recovery_cleanup 159 | rm -rf $TMPDIR $MOUNTPATH 160 | 161 | ui_print "- Done" 162 | exit 0 163 | -------------------------------------------------------------------------------- /META-INF/com/google/android/updater-script: -------------------------------------------------------------------------------- 1 | #MAGISK 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Deprecated 2 | I won't be doing anymore work on this - Use the new [V4A app instead](https://forum.xda-developers.com/android/apps-games/app-viper4android-fx-2-6-0-0-t3774651). Magisk module is [here](https://github.com/Zackptg5/ViPER4Android-FX) 3 | 4 | # ViPER4Android XHiFi 5 | This module enables ViPER4Android XHiFi. [More details in support thread](https://forum.xda-developers.com/apps/magisk/module-viper4android-fx-2-5-0-5-t3577058). 6 | 7 | ## Compatibility 8 | * Android Gingerbread+ 9 | * Selinux enforcing 10 | * All root solutions (requires init.d support if not using magisk or supersu. Try [Init.d Injector](https://forum.xda-developers.com/android/software-hacking/mod-universal-init-d-injector-wip-t3692105)) 11 | 12 | ## Change Log 13 | ### v1.6 - 8.11.2019 14 | * Unity v4.4 update 15 | 16 | ### v1.5.2 - 5.16.2019 17 | * Update to Unity v4.2 18 | 19 | ### v1.5.1 - 5.3.2019 20 | * Update to Unity v4.1 21 | 22 | ### v1.5 - 3.28.2019 23 | * Fix boot script once and for all 24 | * Unity v4.0 update 25 | 26 | ### v1.4.7 - 2.8.2019 27 | * Unity v3.3 update - minapi is now 17 28 | 29 | ### v1.4.6 - 1.16.2019 30 | * Forgot to move apk back to priv-app (needed for unity 3.2) 31 | 32 | ### v1.4.5 - 1.15.2019 33 | * Unity v3.2 update 34 | 35 | ### v1.4.4 - 1.10.2019 36 | * Unity v3.1 update 37 | 38 | ### v1.4.3 - 1.5.2019 39 | * Unity v3.0 update 40 | 41 | ### v1.4.2 - 12.23.2018 42 | * Unity v2.2 update 43 | 44 | ### v1.4.1 -12.21.2018 45 | * Updated to unity v2.1 46 | 47 | ### v1.4 - 12.19.2018 48 | * Remove usb policy patching - it's in a separate module now 49 | 50 | ### v1.3 - 12.18.2018 51 | * Unity v2.0 update 52 | * Fixed limitation in zipname triggers - you can use spaces in the zipname now and trigger is case insensitive 53 | * Fixed old boot script bug 54 | 55 | ### v1.2.5 - 12.6.2018 56 | * Add usb audio fix - thanks to donjoe0 @xda-developers 57 | 58 | ### v1.2.4 - 10.23.2018 59 | * Unity v1.7.2 update 60 | 61 | ### v1.2.3 - 9.20.2018 62 | * Unity v1.7.1 update 63 | 64 | ### v1.2.2 - 9.2.2018 65 | * Unity v1.7 update 66 | 67 | ### v1.2.1 - 8.30.2018 68 | * Unity v1.6.1 update 69 | 70 | ### v1.2 - 8.24.2018 71 | * Unity v1.6 update 72 | 73 | ### v1.1 - 7.17.2018 74 | * Unity v1.5.5 update 75 | 76 | ### v1.0 - 5.7.2018 77 | * Initial release 78 | 79 | ### v0.1 Beta - 4.26.2018 80 | * Initial beta release 81 | 82 | ## Credits 83 | * [ViPER's Audio](http://vipersaudio.com/blog/) 84 | * [ViPER520](http://vipersaudio.com/blog/) @ XDA Developers 85 | * [zhuhang](https://forum.xda-developers.com/showthread.php?t=2191223) @ XDA Developers 86 | 87 | ## Source Code 88 | * Module [GitHub](https://github.com/therealahrion/ViPER4Android-XHIFI) 89 | -------------------------------------------------------------------------------- /common/post-fs-data.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zackptg5/ViPER4Android-XHiFi/a3af324087cb1382eb3d656198caec0ba7081406/common/post-fs-data.sh -------------------------------------------------------------------------------- /common/sepolicy.sh: -------------------------------------------------------------------------------- 1 | # Put sepolicy statements here 2 | # Example: allow { audioserver mediaserver } audioserver_tmpfs file { read write open } 3 | allow { audioserver mediaserver } { audioserver_tmpfs mediaserver_tmpfs } file { read write execute } 4 | allow { audioserver mediaserver } system_file file execmod 5 | allow audioserver unlabeled file { read write execute open getattr } 6 | allow hal_audio_default hal_audio_default process execmem 7 | allow hal_audio_default hal_audio_default_tmpfs file execute 8 | allow hal_audio_default audio_data_file dir search 9 | allow system_data_file file open 10 | -------------------------------------------------------------------------------- /common/service.sh: -------------------------------------------------------------------------------- 1 | (until [ $(getprop sys.boot_completed) -eq 1 ]; do 2 | sleep 5 3 | done 4 | am start -a android.intent.action.MAIN -n com.vipercn.viper4android.xhifi/.main.ViPER4Android_XHiFi 5 | until [ "$(pidof com.vipercn.viper4android.xhifi)" ]; do 6 | sleep 3 7 | done 8 | killall com.vipercn.viper4android.xhifi 9 | killall audioserver 10 | killall mediaserver)& 11 | -------------------------------------------------------------------------------- /common/system.prop: -------------------------------------------------------------------------------- 1 | # This file will be read by resetprop 2 | # Example: Change dpi 3 | # ro.sf.lcd_density=320 4 | tunnel.decode=false 5 | lpa.use-stagefright=false 6 | lpa.releaselock=false 7 | lpa.decode=false 8 | -------------------------------------------------------------------------------- /common/unity_install.sh: -------------------------------------------------------------------------------- 1 | osp_detect() { 2 | case $1 in 3 | *.conf) SPACES=$(sed -n "/^output_session_processing {/,/^}/ {/^ *music {/p}" $1 | sed -r "s/( *).*/\1/") 4 | EFFECTS=$(sed -n "/^output_session_processing {/,/^}/ {/^$SPACES\music {/,/^$SPACES}/p}" $1 | grep -E "^$SPACES +[A-Za-z]+" | sed -r "s/( *.*) .*/\1/g") 5 | for EFFECT in ${EFFECTS}; do 6 | SPACES=$(sed -n "/^effects {/,/^}/ {/^ *$EFFECT {/p}" $1 | sed -r "s/( *).*/\1/") 7 | [ "$EFFECT" != "atmos" ] && sed -i "/^effects {/,/^}/ {/^$SPACES$EFFECT {/,/^$SPACES}/ s/^/#/g}" $1 8 | done;; 9 | *.xml) EFFECTS=$(sed -n "/^ *$/,/^ *<\/postprocess>$/ {/^ *$/,/^ *<\/stream>$/ {//d; /<\/stream>/d; s///g; p}}" $1) 10 | for EFFECT in ${EFFECTS}; do 11 | [ "$EFFECT" != "atmos" ] && sed -ri "s/^( *)/\1<\!---->/" $1 12 | done;; 13 | esac 14 | } 15 | 16 | # Tell user aml is needed if applicable 17 | if $MAGISK && ! $SYSOVER; then 18 | if $BOOTMODE; then LOC="$MOUNTEDROOT/*/system $MODULEROOT/*/system"; else LOC="$MODULEROOT/*/system"; fi 19 | FILES=$(find $LOC -type f -name "*audio_effects*.conf" -o -name "*audio_effects*.xml" 2>/dev/null) 20 | if [ ! -z "$FILES" ] && [ ! "$(echo $FILES | grep '/aml/')" ]; then 21 | ui_print " " 22 | ui_print " ! Conflicting audio mod found!" 23 | ui_print " ! You will need to install !" 24 | ui_print " ! Audio Modification Library !" 25 | sleep 3 26 | fi 27 | fi 28 | 29 | ui_print " " 30 | ui_print " Removing remnants from past v4a xhifi installs..." 31 | # Uninstall existing v4a installs 32 | V4AAPPS=$(find /data/app -type d -name "*com.vipercn.viper4android_v2*") 33 | if [ "$V4AAPPS" ]; then 34 | if $BOOTMODE; then 35 | pm uninstall com.vipercn.viper4android_v2 >/dev/null 2>&1 36 | else 37 | rm -rf $V4AAPPS 38 | fi 39 | fi 40 | # Remove remnants of any old v4a installs 41 | for REMNANT in $(find /data -name "*ViPER4AndroidFX*" -o -name "*com.vipercn.viper4android_v2*"); do 42 | [ "$(echo $REMNANT | cut -d '/' -f-4)" == "/data/media/0" ] && continue 43 | if [ -d "$REMNANT" ]; then 44 | rm -rf $REMNANT 45 | else 46 | rm -f $REMNANT 47 | fi 48 | done 49 | 50 | # Detect driver compatibility 51 | ui_print " " 52 | case $(cat /proc/cpuinfo | grep 'Features' | tr '[:upper:]' '[:lower:]') in 53 | *"neon"*) ui_print " Neon Device detected!"; DRV=NEON;; 54 | *"vfp"*) ui_print " Non-neon VFP Device detected!"; DRV=VFP;; 55 | *) ui_print " Non-Neon, Non-VFP Device detected!"; DRV=NOVFP;; 56 | esac 57 | 58 | mkdir -p $TMPDIR/system/lib/soundfx 59 | cp -f $TMPDIR/custom/libv4a_xhifi_jb_$DRV.so $TMPDIR/system/lib/soundfx/libv4a_xhifi_ics.so 60 | sed -ri "s/version=(.*)/version=\1 (2.1.0.2-1)/" $TMPDIR/module.prop 61 | sed -i "s//$SOURCE/g" $TMPDIR/common/sepolicy.sh 62 | 63 | ui_print " Patching existing audio_effects files..." 64 | for OFILE in ${CFGS}; do 65 | FILE="$UNITY$(echo $OFILE | sed "s|^/vendor|/system/vendor|g")" 66 | cp_ch -i $ORIGDIR$OFILE $FILE 67 | osp_detect $FILE 68 | case $FILE in 69 | *.conf) sed -i "/v4a_standard_xhifi {/,/}/d" $FILE 70 | sed -i "/v4a_xhifi {/,/}/d" $FILE 71 | sed -i "s/^effects {/effects {\n v4a_standard_xhifi { #$MODID\n library v4a_xhifi\n uuid d92c3a90-3e26-11e2-a25f-0800200c9a66\n } #$MODID/g" $FILE 72 | sed -i "s/^libraries {/libraries {\n v4a_xhifi { #$MODID\n path $LIBPATCH\/lib\/soundfx\/libv4a_xhifi_ics.so\n } #$MODID/g" $FILE;; 73 | *.xml) sed -i "/v4a_standard_xhifi/d" $FILE 74 | sed -i "/v4a_xhifi/d" $FILE 75 | sed -i "// a\ " $FILE 76 | sed -i "// a\ " $FILE;; 77 | esac 78 | done 79 | -------------------------------------------------------------------------------- /common/unity_uninstall.sh: -------------------------------------------------------------------------------- 1 | if ! $MAGISK || $SYSOVER; then 2 | for OFILE in ${CFGS}; do 3 | FILE="$UNITY$(echo $OFILE | sed "s|^/vendor|/system/vendor|g")" 4 | case $FILE in 5 | *.conf) sed -i "/v4a_standard_xhifi { #$MODID/,/} #$MODID/d" $FILE 6 | sed -i "/v4a_xhifi { #$MODID/,/} #$MODID/d" $FILE;; 7 | *.xml) sed -i "//d" $FILE;; 8 | esac 9 | done 10 | fi 11 | -------------------------------------------------------------------------------- /common/unityfiles/addon.sh: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | # ADDOND_VERSION=2 3 | 4 | . /tmp/backuptool.functions 5 | 6 | ARG="$1"; P="$(dirname $C)"; MODID= 7 | 8 | list_files() { 9 | cat <> /proc/self/fd/$OUTFD 17 | } 18 | 19 | toupper() { 20 | echo "$@" | tr '[:lower:]' '[:upper:]' 21 | } 22 | 23 | grep_cmdline() { 24 | local REGEX="s/^$1=//p" 25 | cat /proc/cmdline | tr '[:space:]' '\n' | sed -n "$REGEX" 2>/dev/null 26 | } 27 | 28 | grep_prop() { 29 | local REGEX="s/^$1=//p" 30 | shift 31 | local FILES=$@ 32 | [ -z "$FILES" ] && FILES='/system/build.prop' 33 | sed -n "$REGEX" $FILES 2>/dev/null | head -n 1 34 | } 35 | 36 | is_mounted() { 37 | grep -q " `readlink -f $1` " /proc/mounts 2>/dev/null 38 | return $? 39 | } 40 | 41 | abort() { 42 | ui_print "$1" 43 | $MAGISK && ! imageless_magisk && is_mounted $MOUNTPATH && unmount_magisk_img 44 | $BOOTMODE || recovery_cleanup 45 | $DEBUG && debug_log 46 | exit 1 47 | } 48 | 49 | ###################### 50 | # Environment Related 51 | ###################### 52 | 53 | setup_flashable() { 54 | # Preserve environment varibles 55 | OLD_PATH=$PATH 56 | ensure_bb 57 | $BOOTMODE && return 58 | if [ -z $OUTFD ] || readlink /proc/$$/fd/$OUTFD | grep -q /tmp; then 59 | # We will have to manually find out OUTFD 60 | for FD in `ls /proc/$$/fd`; do 61 | if readlink /proc/$$/fd/$FD | grep -q pipe; then 62 | if ps | grep -v grep | grep -q " 3 $FD "; then 63 | OUTFD=$FD 64 | break 65 | fi 66 | fi 67 | done 68 | fi 69 | } 70 | 71 | ensure_bb() { 72 | ARCH32=`getprop ro.product.cpu.abi | cut -c-3` 73 | [ -z $ARCH32 ] && ARCH32=`getprop ro.product.cpu.abi2 | cut -c-3` 74 | [ -z $ARCH32 ] && ARCH32=arm 75 | if [ -x $MAGISKTMP/busybox/busybox ]; then 76 | [ -z $BBDIR ] && BBDIR=$MAGISKTMP/busybox 77 | elif [ -x $TMPDIR/bin/busybox ]; then 78 | [ -z $BBDIR ] && BBDIR=$TMPDIR/bin 79 | else 80 | [ -z $BBDIR ] && BBDIR=$TMPDIR/bin 81 | mkdir -p $BBDIR 2>/dev/null 82 | cp -f $UF/tools/$ARCH32/busybox $BBDIR/busybox 2>/dev/null 83 | chmod 755 $BBDIR/busybox 84 | $BBDIR/busybox --install -s $BBDIR 85 | fi 86 | echo $PATH | grep -q "^$BBDIR" || export PATH=$BBDIR:$PATH 87 | } 88 | 89 | recovery_actions() { 90 | # Make sure random don't get blocked 91 | mount -o bind /dev/urandom /dev/random 92 | # Unset library paths 93 | OLD_LD_LIB=$LD_LIBRARY_PATH 94 | OLD_LD_PRE=$LD_PRELOAD 95 | OLD_LD_CFG=$LD_CONFIG_FILE 96 | unset LD_LIBRARY_PATH 97 | unset LD_PRELOAD 98 | unset LD_CONFIG_FILE 99 | # Force our own busybox path to be in the front 100 | # and do not use anything in recovery's sbin 101 | export PATH=$BBDIR:/system/bin:/vendor/bin 102 | } 103 | 104 | recovery_cleanup() { 105 | [ -z $OLD_PATH ] || export PATH=$OLD_PATH 106 | [ -z $OLD_LD_LIB ] || export LD_LIBRARY_PATH=$OLD_LD_LIB 107 | [ -z $OLD_LD_PRE ] || export LD_PRELOAD=$OLD_LD_PRE 108 | [ -z $OLD_LD_CFG ] || export LD_CONFIG_FILE=$OLD_LD_CFG 109 | ui_print "- Unmounting partitions" 110 | [ "$supersuimg" -o -d /su ] && umount /su 2>/dev/null 111 | umount -l /system_root 2>/dev/null 112 | umount -l /system 2>/dev/null 113 | umount -l /vendor 2>/dev/null 114 | umount -l /dev/random 2>/dev/null 115 | } 116 | 117 | debug_log() { 118 | $BOOTMODE && local LOG=/storage/emulated/0/$MODID-debug || local LOG=/data/media/0/$MODID-debug 119 | set +x 120 | echo -e "***---Device Info---***" > $LOG-tmp.log 121 | echo -e "\n---Props---\n" >> $LOG-tmp.log 122 | getprop >> $LOG-tmp.log 123 | if $MAGISK; then 124 | echo -e "\n\n***---Magisk Info---***" >> $LOG-tmp.log 125 | echo -e "\n---Magisk Version---\n\n$MAGISK_VER_CODE" >> $LOG-tmp.log 126 | imageless_magisk && { echo -e "\n---Installed Modules---\n" >> $LOG-tmp.log; 127 | ls $NVBASE/modules >> $LOG-tmp.log; } 128 | echo -e "\n---Last Magisk Log---\n" >> $LOG-tmp.log 129 | [ -d /cache ] && cat /cache/magisk.log >> $LOG-tmp.log || cat /data/cache/magisk.log >> $LOG-tmp.log 130 | fi 131 | echo -e "\n\n***---Unity Debug Info---***" >> $LOG-tmp.log 132 | echo -e "\n---Installed Files---\n" >> $LOG-tmp.log 133 | grep "^+* cp_ch" $LOG.log | sed 's/.* //g' >> $LOG-tmp.log 134 | sed -i "\|$TMPDIR/|d" $LOG-tmp.log 135 | echo -e "\n---Installed Boot Scripts---\n" >> $LOG-tmp.log 136 | grep "^+* install_script" $LOG.log | sed -e 's/.* //g' -e 's/^-.* //g' >> $LOG-tmp.log 137 | echo -e "\n---Installed Prop Files---\n" >> $LOG-tmp.log 138 | grep "^+* prop_process" $LOG.log | sed 's/.* //g' >> $LOG-tmp.log 139 | echo -e "\n---Shell & Unity Variables---\n" >> $LOG-tmp.log 140 | (set) >> $LOG-tmp.log 141 | echo -e "\n---(Un)Install Log---\n" >> $LOG-tmp.log 142 | echo "$(cat $LOG.log)" >> $LOG-tmp.log 143 | mv -f $LOG-tmp.log $LOG.log 144 | } 145 | 146 | cleanup() { 147 | if $MAGISK; then 148 | imageless_magisk || unmount_magisk_img 149 | ui_print " " 150 | ui_print " *******************************************" 151 | ui_print " * Powered by Magisk (@topjohnwu) *" 152 | ui_print " *******************************************" 153 | fi 154 | $BOOTMODE || recovery_cleanup 155 | ui_print " " 156 | ui_print " *******************************************" 157 | ui_print " * Unity by ahrion & zackptg5 @ XDA *" 158 | ui_print " *******************************************" 159 | ui_print " " 160 | $DEBUG && debug_log 161 | [ -d "$TMPDIR/addon/Aroma-Installer" ] && { rm -rf $TMPDIR; sleep 3; reboot recovery; } || { rm -rf $TMPDIR; exit 0; } 162 | } 163 | 164 | find_block() { 165 | for BLOCK in "$@"; do 166 | DEVICE=`find /dev/block -type l -iname $BLOCK | head -n 1` 2>/dev/null 167 | if [ ! -z $DEVICE ]; then 168 | readlink -f $DEVICE 169 | return 0 170 | fi 171 | done 172 | # Fallback by parsing sysfs uevents 173 | for uevent in /sys/dev/block/*/uevent; do 174 | local DEVNAME=`grep_prop DEVNAME $uevent` 175 | local PARTNAME=`grep_prop PARTNAME $uevent` 176 | for BLOCK in "$@"; do 177 | if [ "`toupper $BLOCK`" = "`toupper $PARTNAME`" ]; then 178 | echo /dev/block/$DEVNAME 179 | return 0 180 | fi 181 | done 182 | done 183 | return 1 184 | } 185 | 186 | mount_part() { 187 | local PART=$1 188 | local POINT=/${PART} 189 | [ -L $POINT ] && rm -f $POINT 190 | mkdir $POINT 2>/dev/null 191 | is_mounted $POINT && return 192 | ui_print "- Mounting $PART" 193 | mount -o rw $POINT 2>/dev/null 194 | if ! is_mounted $POINT; then 195 | local BLOCK=`find_block $PART$SLOT` 196 | mount -o rw $BLOCK $POINT 197 | fi 198 | is_mounted $POINT || abort "! Cannot mount $POINT" 199 | } 200 | 201 | mount_partitions() { 202 | # Check A/B slot 203 | SLOT=`grep_cmdline androidboot.slot_suffix` 204 | if [ -z $SLOT ]; then 205 | SLOT=`grep_cmdline androidboot.slot` 206 | [ -z $SLOT ] || SLOT=_${SLOT} 207 | fi 208 | [ -z $SLOT ] || ui_print "- Current boot slot: $SLOT" 209 | 210 | mount_part system 211 | if [ -f /system/init.rc ]; then 212 | SYSTEM_ROOT=true 213 | [ -L /system_root ] && rm -f /system_root 214 | mkdir /system_root 2>/dev/null 215 | mount --move /system /system_root 216 | mount -o bind /system_root/system /system 217 | else 218 | grep -qE '/dev/root|/system_root' /proc/mounts && SYSTEM_ROOT=true || SYSTEM_ROOT=false 219 | fi 220 | [ -L /system/vendor ] && mount_part vendor 221 | $SYSTEM_ROOT && ui_print "- Device is system-as-root" 222 | } 223 | 224 | api_level_arch_detect() { 225 | API=`grep_prop ro.build.version.sdk` 226 | ABI=`grep_prop ro.product.cpu.abi | cut -c-3` 227 | ABI2=`grep_prop ro.product.cpu.abi2 | cut -c-3` 228 | ABILONG=`grep_prop ro.product.cpu.abi` 229 | 230 | ARCH=arm 231 | ARCH32=arm 232 | IS64BIT=false 233 | if [ "$ABI" = "x86" ]; then ARCH=x86; ARCH32=x86; fi; 234 | if [ "$ABI2" = "x86" ]; then ARCH=x86; ARCH32=x86; fi; 235 | if [ "$ABILONG" = "arm64-v8a" ]; then ARCH=arm64; ARCH32=arm; IS64BIT=true; fi; 236 | if [ "$ABILONG" = "x86_64" ]; then ARCH=x64; ARCH32=x86; IS64BIT=true; fi; 237 | } 238 | 239 | supersuimg_mount() { 240 | supersuimg=$(ls /cache/su.img /data/su.img 2>/dev/null) 241 | if [ "$supersuimg" ]; then 242 | if ! is_mounted /su; then 243 | ui_print "- Mounting /su" 244 | [ -d /su ] || mkdir /su 2>/dev/null 245 | mount -t ext4 -o rw,noatime $supersuimg /su 2>/dev/null 246 | for i in 0 1 2 3 4 5 6 7; do 247 | is_mounted /su && break 248 | local loop=/dev/block/loop$i 249 | mknod $loop b 7 $i 250 | losetup $loop $supersuimg 251 | mount -t ext4 -o loop $loop /su 2>/dev/null 252 | done 253 | fi 254 | fi 255 | } 256 | 257 | device_check() { 258 | local PROP=$(echo "$1" | tr '[:upper:]' '[:lower:]') 259 | for i in "ro.product.device" "ro.build.product"; do 260 | [ "$(sed -n "s/^$i=//p" /system/build.prop 2>/dev/null | head -n 1 | tr '[:upper:]' '[:lower:]')" == "$PROP" -o "$(sed -n "s/^$i=//p" $VEN/build.prop 2>/dev/null | head -n 1 | tr '[:upper:]' '[:lower:]')" == "$PROP" ] && return 0 261 | done 262 | return 1 263 | } 264 | 265 | api_check() { 266 | local OPT=`getopt -o nx -- "$@"` TAPI=$2 267 | eval set -- "$OPT" 268 | while true; do 269 | case "$1" in 270 | -n) [ $API -lt $TAPI ] && abort "! Your system API of $API is less than the minimum api of $2! Aborting!"; shift;; 271 | -x) [ $API -gt $TAPI ] && abort "! Your system API of $API is greater than the maximum api of $2! Aborting!"; shift;; 272 | --) shift; break;; 273 | esac 274 | done 275 | } 276 | 277 | set_vars() { 278 | echo $PATH | grep -q "^$UF/tools/$ARCH32" || export PATH=$UF/tools/$ARCH32:$PATH 279 | if $MAGISK; then 280 | imageless_magisk && MOUNTEDROOT=$NVBASE/modules || MOUNTEDROOT=$MAGISKTMP/img 281 | if $BOOTMODE; then 282 | MOD_VER="$MOUNTEDROOT/$MODID/module.prop" 283 | ORIGDIR="$MAGISKTMP/mirror" 284 | else 285 | MOD_VER="$MODPATH/module.prop" 286 | fi 287 | INFO="$MODPATH/$MODID-files"; PROP=$MODPATH/system.prop; UNITY="$MODPATH" 288 | local ROOTTYPE="MagiskSU" 289 | fi 290 | if $SYSTEM_ROOT && [ ! -L /system/vendor ]; then 291 | ORIGVEN=$ORIGDIR/system_root/system/vendor 292 | else 293 | ORIGVEN=$ORIGDIR/vendor 294 | fi 295 | SYS=/system; VEN=/system/vendor; SHEBANG="#!/system/bin/sh" 296 | [ $API -lt 26 ] && DYNLIB=false 297 | $DYNLIB && { LIBPATCH="\/vendor"; LIBDIR=$VEN; } || { LIBPATCH="\/system"; LIBDIR=/system; } 298 | if ! $MAGISK || $SYSOVER; then 299 | UNITY="" 300 | [ -d /system/addon.d ] && INFO=/system/addon.d/$MODID-files || INFO=/system/etc/$MODID-files 301 | [ -L /system/vendor ] && { VEN=/vendor; $BOOTMODE && ORIGVEN=$ORIGDIR/vendor; } 302 | if ! $MAGISK; then 303 | # Determine system boot script type 304 | supersuimg_mount 305 | MOD_VER="/system/etc/$MODID-module.prop"; NVBASE=/system/etc/init.d; ROOTTYPE="Rootless/other root" 306 | if [ "$supersuimg" ] || [ -d /su ]; then 307 | SHEBANG="#!/su/bin/sush"; ROOTTYPE="Systemless SuperSU"; NVBASE=/su/su.d 308 | elif [ -e "$(find /data /cache -name supersu_is_here | head -n1)" ]; then 309 | SHEBANG="#!/su/bin/sush"; ROOTTYPE="Systemless SuperSU" 310 | NVBASE=$(dirname `find /data /cache -name supersu_is_here | head -n1` 2>/dev/null)/su.d 311 | elif [ -d /system/su ] || [ -f /system/xbin/daemonsu ] || [ -f /system/xbin/sugote ]; then 312 | NVBASE=/system/su.d; ROOTTYPE="System SuperSU" 313 | elif [ -f /system/xbin/su ]; then 314 | [ "$(grep "SuperSU" /system/xbin/su)" ] && { NVBASE=/system/su.d; ROOTTYPE="System SuperSU"; } || ROOTTYPE="LineageOS SU" 315 | fi 316 | PROP=$NVBASE/$MODID-props 317 | fi 318 | fi 319 | ui_print "- $ROOTTYPE detected" 320 | } 321 | 322 | ################# 323 | # Module Related 324 | ################# 325 | 326 | set_perm() { 327 | chown $2:$3 $1 || return 1 328 | chmod $4 $1 || return 1 329 | local CON=$5 330 | [ -z $CON ] && local CON=u:object_r:system_file:s0 331 | chcon $CON $1 || return 1 332 | } 333 | 334 | set_perm_recursive() { 335 | find $1 -type d 2>/dev/null | while read dir; do 336 | set_perm $dir $2 $3 $4 $6 337 | done 338 | find $1 -type f -o -type l 2>/dev/null | while read file; do 339 | set_perm $file $2 $3 $5 $6 340 | done 341 | } 342 | 343 | mktouch() { 344 | mkdir -p ${1%/*} 2>/dev/null 345 | [ -z $2 ] && touch $1 || echo $2 > $1 346 | chmod 644 $1 347 | } 348 | 349 | run_addons() { 350 | local OPT=`getopt -o mhiuv -- "$@"` NAME PNAME 351 | eval set -- "$OPT" 352 | while true; do 353 | case "$1" in 354 | -m) NAME=main; shift;; 355 | -h) NAME=preinstall; PNAME="Preinstall"; shift;; 356 | -i) NAME=install; PNAME="Install"; shift;; 357 | -u) NAME=uninstall; PNAME="Uninstall"; shift;; 358 | -v) NAME=postuninstall; PNAME="Postuninstall"; shift;; 359 | --) shift; break;; 360 | esac 361 | done 362 | if [ "$(ls -A $TMPDIR/addon/*/$NAME.sh 2>/dev/null)" ]; then 363 | [ -z $PNAME ] || { ui_print " "; ui_print "- Running $PNAME Addons -"; } 364 | for i in $TMPDIR/addon/*/$NAME.sh; do 365 | ui_print " Running $(echo $i | sed -r "s|$TMPDIR/addon/(.*)/$NAME.sh|\1|")..." 366 | . $i 367 | done 368 | [ -z $PNAME ] || { ui_print " "; ui_print "- `echo $PNAME`ing (cont) -"; } 369 | fi 370 | } 371 | 372 | cp_ch() { 373 | local OPT=`getopt -o inr -- "$@"` BAK=true UBAK=true REST=true FOL=false 374 | eval set -- "$OPT" 375 | while true; do 376 | case "$1" in 377 | -i) UBAK=false; REST=false; shift;; 378 | -n) UBAK=false; shift;; 379 | -r) FOL=true; shift;; 380 | --) shift; break;; 381 | esac 382 | done 383 | local SRC="$1" DEST="$2" OFILES="$1" 384 | $FOL && OFILES=$(find $SRC -type f 2>/dev/null) 385 | [ -z $3 ] && PERM=0644 || PERM=$3 386 | case "$DEST" in 387 | $TMPDIR/*|/data/adb/*|$MODULEROOT/*|/sbin/.magisk/img/*) BAK=false;; 388 | esac 389 | for OFILE in ${OFILES}; do 390 | if $FOL; then 391 | if [ "$(basename $SRC)" == "$(basename $DEST)" ]; then 392 | local FILE=$(echo $OFILE | sed "s|$SRC|$DEST|") 393 | else 394 | local FILE=$(echo $OFILE | sed "s|$SRC|$DEST/$(basename $SRC)|") 395 | fi 396 | else 397 | [ -d "$DEST" ] && local FILE="$DEST/$(basename $SRC)" || local FILE="$DEST" 398 | fi 399 | if $BAK; then 400 | if $UBAK && $REST; then 401 | [ ! "$(grep "$FILE$" $INFO 2>/dev/null)" ] && echo "$FILE" >> $INFO 402 | [ -f "$FILE" -a ! -f "$FILE~" ] && { cp -af $FILE $FILE~; echo "$FILE~" >> $INFO; } 403 | elif ! $UBAK && $REST; then 404 | [ ! "$(grep "$FILE$" $INFO 2>/dev/null)" ] && echo "$FILE" >> $INFO 405 | elif ! $UBAK && ! $REST; then 406 | [ ! "$(grep "$FILE\NORESTORE$" $INFO 2>/dev/null)" ] && echo "$FILE\NORESTORE" >> $INFO 407 | fi 408 | fi 409 | install -D -m $PERM "$OFILE" "$FILE" 410 | case $FILE in 411 | */vendor/*.apk) chcon u:object_r:vendor_app_file:s0 $FILE;; 412 | */vendor/etc/*) chcon u:object_r:vendor_configs_file:s0 $FILE;; 413 | */vendor/*) chcon u:object_r:vendor_file:s0 $FILE;; 414 | */system/*) chcon u:object_r:system_file:s0 $FILE;; 415 | esac 416 | done 417 | } 418 | 419 | patch_script() { 420 | [ -L /system/vendor ] && local VEN=/vendor 421 | sed -i -e "1i $SHEBANG" -e "1i SYS=$ROOT/system" -e "1i VEN=$ROOT$VEN" $1 422 | for i in "ROOT" "MAGISK" "LIBDIR" "SYSOVER" "MODID" "MOUNTEDROOT" "NVBASE"; do 423 | sed -i "4i $i=$(eval echo \$$i)" $1 424 | done 425 | if $MAGISK; then 426 | sed -i -e "s|\$MODPATH|$MOUNTEDROOT/$MODID|g" -e "s|\$MOUNTPATH|$MOUNTEDROOT|g" -e "s|\$MODULEROOT|$MOUNTEDROOT|g" -e "12i INFO=$MOUNTEDROOT/$MODID/$MODID-files" $1 427 | else 428 | sed -i -e "s|\$MODPATH||g" -e "s|\$MOUNTPATH||g" -e "s|\$MODULEROOT||g" -e "12i INFO=$INFO" $1 429 | fi 430 | } 431 | 432 | install_script() { 433 | case "$1" in 434 | -l) shift; $MAGISK && local INPATH=$NVBASE/service.d; local EXT="-ls";; 435 | -p) shift; $MAGISK && local INPATH=$NVBASE/post-fs-data.d; local EXT="";; 436 | *) local $MAGISK && local INPATH=$(dirname $2); local EXT="";; 437 | esac 438 | patch_script "$1" 439 | if $MAGISK; then 440 | case $(basename $1) in 441 | post-fs-data.sh|service.sh) cp_ch -n $1 $MODULEROOT/$MODID/$(basename $1);; 442 | *) cp_ch -n $1 $INPATH/$(basename $1) 0755;; 443 | esac 444 | else 445 | cp_ch -n $1 $NVBASE/$MODID-$(basename $1 | sed 's/.sh$//')$EXT 0700 446 | fi 447 | } 448 | 449 | prop_process() { 450 | sed -i -e "/^#/d" -e "/^ *$/d" $1 451 | if $MAGISK; then 452 | [ -f $PROP ] || mktouch $PROP 453 | else 454 | [ -f $PROP ] || mktouch $PROP "$SHEBANG" 455 | sed -ri "s|^(.*)=(.*)|setprop \1 \2|g" $1 456 | fi 457 | while read LINE; do 458 | echo "$LINE" >> $PROP 459 | done < $1 460 | $MAGISK || chmod 0700 $PROP 461 | } 462 | 463 | center_and_print() { 464 | ui_print " " 465 | local NEW CHARS SPACES 466 | ui_print " *******************************************" 467 | for i in name version author; do 468 | NEW=$(grep_prop $i $TMPDIR/module.prop) 469 | [ "$i" == "author" ] && NEW="by ${NEW}" 470 | CHARS=$((${#NEW}-$(echo "$NEW" | tr -cd "©®™" | wc -m))) 471 | SPACES="" 472 | if [ $CHARS -le 41 ]; then 473 | for j in $(seq $(((41-$CHARS) / 2))); do 474 | SPACES="${SPACES} " 475 | done 476 | fi 477 | if [ $(((41-$CHARS) % 2)) -eq 1 ]; then 478 | ui_print " *$SPACES$NEW${SPACES} *" 479 | else 480 | ui_print " *$SPACES$NEW$SPACES*" 481 | fi 482 | [ "$i" == "name" ] && ui_print " *******************************************" 483 | done 484 | ui_print " *******************************************" 485 | ui_print " " 486 | } 487 | 488 | ####### 489 | # main 490 | ####### 491 | 492 | unity_install() { 493 | ui_print "- Installing" 494 | 495 | # Preinstall Addons 496 | run_addons -h 497 | 498 | # Make info file 499 | rm -f $INFO 500 | mktouch $INFO 501 | 502 | # Run user install script 503 | [ -f "$TMPDIR/common/unity_install.sh" ] && . $TMPDIR/common/unity_install.sh 504 | 505 | # Install Addons 506 | run_addons -i 507 | 508 | # Check sizes in case compression was used anywhere in zip 509 | if $MAGISK && ! $SYSOVER; then 510 | if ! imageless_magisk; then 511 | request_size_check "$TMPDIR/system" 512 | check_filesystem $IMG $MODULEROOT 513 | if [ $reqSizeM -gt $curFreeM ]; then 514 | newSizeM=$(((curSizeM + reqSizeM - curFreeM) / 32 * 32 + 64)) 515 | ui_print " Resizing $IMG to ${newSizeM}M" 516 | $MAGISKBIN/magisk imgtool umount $MODULEROOT $MAGISKLOOP 517 | $MAGISKBIN/magisk imgtool resize $IMG $newSizeM >&2 518 | mount_snippet 519 | fi 520 | fi 521 | fi 522 | 523 | # Remove comments from files 524 | for i in $TMPDIR/common/sepolicy.sh $TMPDIR/common/system.prop $TMPDIR/common/service.sh $TMPDIR/common/post-fs-data.sh; do 525 | [ -f $i ] && sed -i -e "/^#/d" -e "/^ *$/d" $i 526 | done 527 | 528 | ui_print " Installing scripts and files for $ARCH SDK $API device..." 529 | 530 | # Custom uninstaller 531 | $MAGISK && [ -f $TMPDIR/uninstall.sh ] && install_script $TMPDIR/uninstall.sh $MODPATH/uninstall.sh 532 | 533 | # Handle replace folders 534 | for TARGET in $REPLACE; do 535 | if $MAGISK; then mktouch $MODPATH$TARGET/.replace; else rm -rf $TARGET; fi 536 | done 537 | 538 | # Prop files 539 | [ -s $TMPDIR/common/system.prop ] && { prop_process $TMPDIR/common/system.prop; $MAGISK || echo $PROP >> $INFO; } 540 | 541 | #Install post-fs-data mode scripts 542 | [ -s $TMPDIR/common/post-fs-data.sh ] && install_script -p $TMPDIR/common/post-fs-data.sh 543 | 544 | # Service mode scripts (and sepolicy) 545 | if [ -s $TMPDIR/common/sepolicy.sh ]; then 546 | [ "$NVBASE" == "/system/etc/init.d" -o "$MAGISK" == "true" ] && echo -n "magiskpolicy --live" >> $TMPDIR/common/service.sh || echo -n "supolicy --live" >> $TMPDIR/common/service.sh 547 | sed -i -e '/^#.*/d' -e '/^$/d' $TMPDIR/common/sepolicy.sh 548 | while read LINE; do 549 | case $LINE in 550 | \"*\") echo -n " $LINE" >> $TMPDIR/common/service.sh;; 551 | \"*) echo -n " $LINE\"" >> $TMPDIR/common/service.sh;; 552 | *\") echo -n " \"$LINE" >> $TMPDIR/common/service.sh;; 553 | *) echo -n " \"$LINE\"" >> $TMPDIR/common/service.sh;; 554 | esac 555 | done < $TMPDIR/common/sepolicy.sh 556 | fi 557 | [ -s $TMPDIR/common/service.sh ] && install_script -l $TMPDIR/common/service.sh 558 | 559 | # Install files 560 | $IS64BIT || rm -rf $TMPDIR/system/lib64 $TMPDIR/system/vendor/lib64 561 | [ -d "/system/priv-app" ] || mv -f $TMPDIR/system/priv-app $TMPDIR/system/app 2>/dev/null 562 | [ -d "/system/xbin" ] || mv -f $TMPDIR/system/xbin $TMPDIR/system/bin 2>/dev/null 563 | if $DYNLIB; then 564 | for FILE in $(find $TMPDIR/system/lib*/* -maxdepth 0 -type d 2>/dev/null | sed -e "s|$TMPDIR/system/lib.*/modules||" -e "s|$TMPDIR/system/||"); do 565 | mkdir -p $(dirname $TMPDIR/system/vendor/$FILE) 566 | mv -f $TMPDIR/system/$FILE $TMPDIR/system/vendor/$FILE 567 | done 568 | fi 569 | rm -f $TMPDIR/system/placeholder 570 | cp_ch -r $TMPDIR/system $UNITY/system 571 | # Install rom backup script 572 | if [ "$INFO" == "/system/addon.d/$MODID-files" ]; then 573 | ui_print " Installing addon.d backup script..." 574 | sed -i "s/MODID=.*/MODID=$MODID/" $TMPDIR/common/unityfiles/addon.sh 575 | cp_ch -n $TMPDIR/common/unityfiles/addon.sh $UNITY/system/addon.d/98-$MODID-unity.sh 0755 576 | fi 577 | 578 | # Install scripts and module info 579 | cp_ch -n $TMPDIR/module.prop $MOD_VER 580 | if $MAGISK; then 581 | # Auto mount 582 | if [ -d $MODPATH/system ] && ! $SYSOVER; then 583 | if imageless_magisk; then 584 | if $SKIPMOUNT || [ ! -d $MODPATH/system ]; then touch $MODPATH/skip_mount; fi 585 | else 586 | $SKIPMOUNT || touch $MODPATH/auto_mount 587 | fi 588 | elif [ ! -d $MODPATH/system ] && $SYSOVER; then 589 | imageless_magisk && $SKIPMOUNT && touch $MODPATH/skip_mount 590 | fi 591 | cp -af $TMPDIR/module.prop $MODPATH/module.prop 592 | # Update info for magisk manager 593 | $BOOTMODE && { rm -f $MOUNTEDROOT/$MODID/remove; mktouch $MOUNTEDROOT/$MODID/update; cp_ch -n $TMPDIR/module.prop $MOUNTEDROOT/$MODID/module.prop; } 594 | elif [ "$NVBASE" == "/system/etc/init.d" ] && [ "$(ls -A $NVBASE/$MODID* 2>/dev/null)" ]; then 595 | ui_print " " 596 | ui_print " ! This root method has no boot script support !" 597 | ui_print " ! You will need to add init.d support !" 598 | fi 599 | 600 | # Add blank line to end of all prop/script files if not already present 601 | for FILE in $MODPATH/*.sh $MODPATH/*.prop; do 602 | [ -f $FILE ] && { [ "$(tail -1 $FILE)" ] && echo "" >> $FILE; } 603 | done 604 | 605 | # Remove info file if not needed 606 | [ -s $INFO ] || rm -f $INFO 607 | 608 | # Set permissions 609 | ui_print " " 610 | ui_print "- Setting Permissions" 611 | $MAGISK && set_perm_recursive $MODPATH 0 0 0755 0644 612 | set_permissions 613 | } 614 | 615 | unity_uninstall() { 616 | ui_print " " 617 | ui_print "- Uninstalling" 618 | 619 | # Uninstall Addons 620 | run_addons -u 621 | 622 | # Remove files 623 | local FILE=$INFO 624 | $BOOTMODE && [ -f $MODULEROOT/$MODID/$MODID-files ] && FILE=$MODULEROOT/$MODID/$MODID-files 625 | $MAGISK || [ -f $FILE ] || abort " ! Mod not detected !" 626 | if [ -f $FILE ]; then 627 | while read LINE; do 628 | if [ "$(echo -n $LINE | tail -c 1)" == "~" ] || [ "$(echo -n $LINE | tail -c 9)" == "NORESTORE" ]; then 629 | continue 630 | elif [ -f "$LINE~" ]; then 631 | mv -f $LINE~ $LINE 632 | else 633 | rm -f $LINE 634 | while true; do 635 | LINE=$(dirname $LINE) 636 | [ "$(ls -A $LINE 2>/dev/null)" ] && break 1 || rm -rf $LINE 637 | done 638 | fi 639 | done < $FILE 640 | rm -f $FILE 641 | fi 642 | 643 | if $MAGISK; then 644 | rm -rf $MODPATH 645 | if $BOOTMODE; then 646 | [ -d $MOUNTEDROOT/$MODID/system ] && touch $MOUNTEDROOT/$MODID/remove || rm -rf $MOUNTEDROOT/$MODID 647 | fi 648 | fi 649 | 650 | # Run user install script 651 | [ -f "$TMPDIR/common/unity_uninstall.sh" ] && . $TMPDIR/common/unity_uninstall.sh 652 | 653 | # Postuninstall Addons 654 | run_addons -v 655 | 656 | ui_print " " 657 | ui_print "- Completing uninstall -" 658 | } 659 | 660 | unity_upgrade() { 661 | if [ "$1" == "-s" ]; then 662 | mount -o rw,remount /system 663 | [ -L /system/vendor ] && mount -o rw,remount /vendor 664 | [ -d /system/addon.d ] && INFO=/system/addon.d/$MODID-files || INFO=/system/etc/$MODID-files 665 | fi 666 | [ -f "$TMPDIR/common/unity_upgrade.sh" ] && . $TMPDIR/common/unity_upgrade.sh 667 | unity_uninstall 668 | [ "$1" == "-s" ] && { INFO="$MODPATH/$MODID-files"; ui_print " ! Running upgrade..."; } 669 | unity_install 670 | } 671 | 672 | comp_check() { 673 | # Check for min & max api version 674 | if [ "$API" ]; then 675 | [ "$MINAPI" ] && api_check -n $MINAPI 676 | [ "$MAXAPI" ] && api_check -x $MAXAPI 677 | fi 678 | 679 | if [ -z $MAGISKBIN ]; then 680 | MAGISK=false 681 | else 682 | MAGISK=true 683 | [ $MAGISK_VER_CODE -lt 18000 ] && require_new_magisk 684 | $SYSOVER && $BOOTMODE && { ui_print " ! Magisk manager isn't supported!"; abort " ! Install in recovery !"; } 685 | $SYSOVER && { mount -o rw,remount /system; [ -L /system/vendor ] && mount -o rw,remount /vendor; } 686 | fi 687 | } 688 | 689 | unity_main() { 690 | # Set variables 691 | set_vars 692 | 693 | # Add blank line to end of all files if needbe 694 | for i in $(find $TMPDIR -type f -name "*.sh" -o -name "*.prop"); do 695 | [ "$(tail -1 "$i")" ] && echo "" >> "$i" 696 | done 697 | 698 | #Debug 699 | if $DEBUG; then 700 | ui_print " " 701 | ui_print "- Debug mode" 702 | if $BOOTMODE; then 703 | ui_print " Debug log will be written to: /storage/emulated/0/$MODID-debug.log" 704 | exec 2>/storage/emulated/0/$MODID-debug.log 705 | else 706 | ui_print " Debug log will be written to: /data/media/0/$MODID-debug.log" 707 | exec 2>/data/media/0/$MODID-debug.log 708 | fi 709 | set -x 710 | fi 711 | 712 | # Main addons 713 | [ -f "$TMPDIR/addon.tar.xz" ] && tar -xf $TMPDIR/addon.tar.xz -C $TMPDIR 2>/dev/null 714 | run_addons -m 715 | 716 | # Load user vars/function 717 | unity_custom 718 | 719 | # Determine mod installation status 720 | ui_print " " 721 | if $MAGISK && ! $SYSOVER && [ -f "/system/addon.d/$MODID-files" -o -f "/system/etc/$MODID-files" ]; then 722 | ui_print " ! Previous system override install detected!" 723 | ui_print " ! Removing...!" 724 | $BOOTMODE && { ui_print " ! Magisk manager isn't supported!"; abort " ! Flash in TWRP !"; } 725 | unity_upgrade -s 726 | elif [ -f "$MOD_VER" ]; then 727 | if [ $(grep_prop versionCode $MOD_VER) -ge $(grep_prop versionCode $TMPDIR/module.prop) ]; then 728 | ui_print " ! Current or newer version detected!" 729 | unity_uninstall 730 | else 731 | ui_print " ! Older version detected! Upgrading..." 732 | unity_upgrade 733 | fi 734 | else 735 | unity_install 736 | fi 737 | 738 | # Complete (un)install 739 | cleanup 740 | } 741 | 742 | SKIPMOUNT=false; SYSOVER=false; DEBUG=false; DYNLIB=false; SEPOLICY=false 743 | OIFS=$IFS; IFS=\|; 744 | case $(echo $(basename "$ZIPFILE") | tr '[:upper:]' '[:lower:]') in 745 | *debug*) DEBUG=true;; 746 | *sysover*) SYSOVER=true;; 747 | esac 748 | IFS=$OIFS 749 | 750 | # Detect whether in boot mode 751 | [ -z $BOOTMODE ] && BOOTMODE=false 752 | $BOOTMODE || ps | grep zygote | grep -qv grep && BOOTMODE=true 753 | $BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -qv grep && BOOTMODE=true 754 | 755 | # Unzip files 756 | ui_print " " 757 | ui_print "Unzipping files..." 758 | unzip -oq "$ZIPFILE" -d $TMPDIR 2>/dev/null 759 | chmod -R 755 $UF/tools 760 | [ "$(grep_prop id $TMPDIR/module.prop)" == "UnityTemplate" ] && { ui_print "! Unity Template is not a separate module !"; abort "! This template is for devs only !"; } 761 | -------------------------------------------------------------------------------- /custom/libv4a_xhifi_jb_NEON.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zackptg5/ViPER4Android-XHiFi/a3af324087cb1382eb3d656198caec0ba7081406/custom/libv4a_xhifi_jb_NEON.so -------------------------------------------------------------------------------- /custom/libv4a_xhifi_jb_NOVFP.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zackptg5/ViPER4Android-XHiFi/a3af324087cb1382eb3d656198caec0ba7081406/custom/libv4a_xhifi_jb_NOVFP.so -------------------------------------------------------------------------------- /custom/libv4a_xhifi_jb_VFP.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zackptg5/ViPER4Android-XHiFi/a3af324087cb1382eb3d656198caec0ba7081406/custom/libv4a_xhifi_jb_VFP.so -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | ########################################################################################## 2 | # 3 | # Unity Config Script 4 | # by topjohnwu, modified by Zackptg5 5 | # 6 | ########################################################################################## 7 | 8 | ########################################################################################## 9 | # Unity Logic - Don't change/move this section 10 | ########################################################################################## 11 | 12 | if [ -z $UF ]; then 13 | UF=$TMPDIR/common/unityfiles 14 | unzip -oq "$ZIPFILE" 'common/unityfiles/util_functions.sh' -d $TMPDIR >&2 15 | [ -f "$UF/util_functions.sh" ] || { ui_print "! Unable to extract zip file !"; exit 1; } 16 | . $UF/util_functions.sh 17 | fi 18 | 19 | comp_check 20 | 21 | ########################################################################################## 22 | # Config Flags 23 | ########################################################################################## 24 | 25 | # Uncomment and change 'MINAPI' and 'MAXAPI' to the minimum and maximum android version for your mod 26 | # Uncomment DYNLIB if you want libs installed to vendor for oreo+ and system for anything older 27 | # Uncomment SYSOVER if you want the mod to always be installed to system (even on magisk) - note that this can still be set to true by the user by adding 'sysover' to the zipname 28 | # Uncomment DIRSEPOL if you want sepolicy patches applied to the boot img directly (not recommended) - THIS REQUIRES THE RAMDISK PATCHER ADDON (this addon requires minimum api of 17) 29 | # Uncomment DEBUG if you want full debug logs (saved to /sdcard in magisk manager and the zip directory in twrp) - note that this can still be set to true by the user by adding 'debug' to the zipname 30 | #MINAPI=21 31 | #MAXAPI=25 32 | DYNLIB=true 33 | #SYSOVER=true 34 | #DIRSEPOL=true 35 | #DEBUG=true 36 | 37 | # Uncomment if you do *NOT* want Magisk to mount any files for you. Most modules would NOT want to set this flag to true 38 | # This is obviously irrelevant for system installs. This will be set to true automatically if your module has no files in system 39 | #SKIPMOUNT=true 40 | 41 | ########################################################################################## 42 | # Replace list 43 | ########################################################################################## 44 | 45 | # List all directories you want to directly replace in the system 46 | # Check the documentations for more info why you would need this 47 | 48 | # Construct your list in the following format 49 | # This is an example 50 | REPLACE_EXAMPLE=" 51 | /system/app/Youtube 52 | /system/priv-app/SystemUI 53 | /system/priv-app/Settings 54 | /system/framework 55 | " 56 | 57 | # Construct your own list here 58 | REPLACE=" 59 | " 60 | 61 | ########################################################################################## 62 | # Custom Logic 63 | ########################################################################################## 64 | 65 | # Set what you want to display when installing your module 66 | 67 | print_modname() { 68 | center_and_print # Replace this line if using custom print stuff 69 | unity_main # Don't change this line 70 | } 71 | 72 | set_permissions() { 73 | : # Remove this if adding to this function 74 | 75 | # Note that all files/folders have the $UNITY prefix - keep this prefix on all of your files/folders 76 | # Also note the lack of '/' between variables - preceding slashes are already included in the variables 77 | # Use $VEN for vendor (Do not use /system$VEN, the $VEN is set to proper vendor path already - could be /vendor, /system/vendor, etc.) 78 | 79 | # Some examples: 80 | 81 | # For directories (includes files in them): 82 | # set_perm_recursive (default: u:object_r:system_file:s0) 83 | 84 | # set_perm_recursive $UNITY/system/lib 0 0 0755 0644 85 | # set_perm_recursive $UNITY$VEN/lib/soundfx 0 0 0755 0644 86 | 87 | # For files (not in directories taken care of above) 88 | # set_perm (default: u:object_r:system_file:s0) 89 | 90 | # set_perm $UNITY/system/lib/libart.so 0 0 0644 91 | } 92 | 93 | # Custom Variables for Install AND Uninstall - Keep everything within this function - runs before uninstall/install 94 | unity_custom() { 95 | if [ -d /system/priv-app ]; then SOURCE=priv_app; else SOURCE=system_app; fi 96 | if $BOOTMODE; then 97 | CFGS="$(find /system /vendor -type f -name "*audio_effects*.conf" -o -name "*audio_effects*.xml")" 98 | else 99 | CFGS="$(find -L /system -type f -name "*audio_effects*.conf" -o -name "*audio_effects*.xml")" 100 | fi 101 | } 102 | 103 | # Custom Functions for Install AND Uninstall - You can put them here 104 | -------------------------------------------------------------------------------- /module.prop: -------------------------------------------------------------------------------- 1 | id=ViPER4AndroidXHiFi 2 | name=ViPER4Android XHiFi 3 | version=v1.6 4 | versionCode=27 5 | author=ViPER520, ZhuHang, Zackptg5 6 | description=ViPER4Android XHiFi is an audio enhancing software to provide everyone with a better audio experience 7 | support=https://forum.xda-developers.com/apps/magisk/module-viper4android-fx-2-5-0-5-t3577058 8 | minMagisk=1530 9 | -------------------------------------------------------------------------------- /system/etc/permissions/privapp-permissions-com.vipercn.viper4android.xhifi.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /system/priv-app/ViPER4AndroidXHiFi/ViPER4AndroidXHiFi.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zackptg5/ViPER4Android-XHiFi/a3af324087cb1382eb3d656198caec0ba7081406/system/priv-app/ViPER4AndroidXHiFi/ViPER4AndroidXHiFi.apk -------------------------------------------------------------------------------- /uninstall.sh: -------------------------------------------------------------------------------- 1 | if $SYSOVER || $DIRSEPOL; then 2 | rm -f $INFO; mount -o rw,remount /system 3 | [ -L /system/vendor ] && mount -o rw,remount /vendor 4 | fi 5 | 6 | FILE=$INFO 7 | [ -f $MODPATH/$MODID-files ] && FILE=$MODPATH/$MODID-files 8 | if [ -f $FILE ]; then 9 | while read LINE; do 10 | if [ "$(echo -n $LINE | tail -c 1)" == "~" ] || [ "$(echo -n $LINE | tail -c 9)" == "NORESTORE" ]; then 11 | continue 12 | elif [ -f "$LINE~" ]; then 13 | mv -f $LINE~ $LINE 14 | else 15 | rm -f $LINE 16 | while true; do 17 | LINE=$(dirname $LINE) 18 | [ "$(ls -A $LINE 2>/dev/null)" ] && break 1 || rm -rf $LINE 19 | done 20 | fi 21 | done < $FILE 22 | fi 23 | 24 | if $SYSOVER || $DIRSEPOL; then 25 | rm -f $INFO; mount -o ro,remount /system 26 | [ -L /system/vendor ] && mount -o ro,remount /vendor 27 | fi 28 | --------------------------------------------------------------------------------