#!/system/bin/sh
#
# Based On Universal Odex 3.1
# Modded & Updated By MatrixDJ96
# Language: English
# Last Update: 03-11-2013
# Enjoy! :-)
#

bb="busybox"

start_info() {
$bb echo "Universal Odex Script"
$bb echo "Version 6.3.1"
$bb echo
if $bb [ `$bb grep "ro.product.model=" /system/build.prop` ];
then
	device=`$bb grep "ro.product.model=" /system/build.prop | $bb sed 's:ro.product.model=::g'`
	$bb echo "Product Model: $device"
else
	$bb echo "Unknow Device"
fi;
if $bb [ `$bb grep "ro.build.display.id=" /system/build.prop` ];
then
	build_name=`$bb grep "ro.build.display.id=" /system/build.prop | $bb sed 's:ro.build.display.id=::g' | $bb sed 's:-: :g' | $bb sed 's:_: :g'`
	$bb echo "Installed Build: $build_name"
else
	$bb echo "Unknown Build"
fi;
if $bb [ `$bb grep "ro.build.version.release=" /system/build.prop` ];
then
	system_version=`$bb grep "ro.build.version.release=" /system/build.prop | $bb sed 's:ro.build.version.release=::g'`
	if $bb [ `$bb grep "ro.build.version.release=2.2" /system/build.prop` ];
	then
		android_version="Froyo"
	fi;
	if $bb [ `$bb grep "ro.build.version.release=2.3" /system/build.prop` ];
	then
		android_version="Gingerbread"
	fi;
	if $bb [ `$bb grep "ro.build.version.release=4.0" /system/build.prop` ];
	then
		android_version="Ice Cream Sandwich"
	fi;
	if $bb [ `$bb grep "ro.build.version.release=4.1" /system/build.prop` ];
	then
		android_version="Jelly Bean"
	fi;
	if $bb [ `$bb grep "ro.build.version.release=4.2" /system/build.prop` ];
	then
		android_version="Jelly Bean"
	fi;
	if $bb [ `$bb grep "ro.build.version.release=4.3" /system/build.prop` ];
	then
		android_version="Jelly Bean"
	fi;
	if $bb [ `$bb grep "ro.build.version.release=5.0" /system/build.prop` ];
	then
		android_version="Key Lime Pie"
	fi;
	$bb echo "Android Version: $system_version ($android_version)"
else
	$bb echo "Unknow Android Version"
fi;
cd /
if $bb [ -d /preload ];
then
	PRELOAD="yes"
else
	PRELOAD="no"
fi;
}

root() {
$bb echo "Checking For Root Permissions..."
if $bb [[ "`$bb id -u`" == "0" ]];
then
	$bb echo "Root Permissions Acquired!"
	$bb echo
else
	$bb echo "Could Not Acquire Root Permissions..."
	$bb echo
	$bb echo "Type 'su' And Try Again"
	$bb echo
	exit 1
fi;
}

preparing() { 
$bb echo "Mounting File System..."
$bb mount -o remount, rw /
$bb mount -o remount, rw /data
if $bb [[ "$PRELOAD" == "yes" ]];
then
	$bb mount -o remount, rw /preload
fi;
$bb mount -o remount, rw /system
$bb echo
$bb echo "Setting Variable and Costant..."
DIR=/
DIRDAL=/data/dalvik-cache
DIRDAPP=/data/app
DIRSAPP=/system/app
DIRFRAME=/system/framework
if $bb [[ "$PRELOAD" == "yes" ]];
then
	DIRPAPP=/preload/symlink/system/app
fi;
DIRX=/system/xbin
DIRS=/sbin
TMPDIR=/odex
cd $DIRX
if $bb [ -f busybox ];
then
	if $bb [ -f busyodex ];
	then
		$bb echo
		$bb echo "Setting BusyBox..."
		$bb cp -p busybox bb1
		$bb cp -p busyodex busybox
	fi;
fi;
$bb echo
cd $DIR
if $bb [ -f /sdcard/csa.txt ];
then
	CSA=`$bb grep " " /sdcard/csa.txt`
fi;
if $bb [ -f /sdcard/cpa.txt ];
then
	CPA=`$bb grep " " /sdcard/cpa.txt`
fi;
if $bb [ -f /sys/class/timed_output/vibrator/enable ];
then
	vibration="/sys/class/timed_output/vibrator/enable"
else
	vibration="none"
fi;
if $bb [ ! -z "${BOOTCLASSPATH+xx}" ];
then
	dexObjectList=`$bb echo $BOOTCLASSPATH \
		| $bb sed 's:/system/framework/::g' \
		| $bb sed 's/:/ /g'`
else
	$bb echo "BOOTCLASSPATH Not Setted!"
	$bb echo
	cd $DIRX
	if $bb [ -f bb1 ];
	then
		$bb echo "Restoring BusyBox..."
		$bb mv -f bb1 busybox
	fi; 
	$bb echo "Exiting..."
	$bb echo
	exit 1
fi;
$bb echo "BOOTCLASSPATCH: $BOOTCLASSPATH"
$bb echo
$bb echo "BOOTSTRAP: $dexObjectList"
$bb echo
$bb echo "Searching 'preloaded-classes'..."
$bb echo
cd $DIRFRAME
$bb unzip -l framework.jar
if $bb [[ "$?" != "0" ]];
then
	$bb echo
	$bb echo "Impossible Unzip framework.jar To Find 'preloaded-classes'!"
	if $bb [[ "$vibration" != "none" ]];
	then
		$bb echo 200 > $vibration
	fi; 
	cd $DIRX
	if $bb [ -f bb1 ];
	then
		$bb echo
		$bb echo "Restoring BusyBox..."
		$bb mv -f bb1 busybox
    fi; 
	$bb echo
	$bb echo "Exiting..."
	$bb echo
	exit 1
else
	$bb unzip -l framework.jar | $bb grep -q preloaded-classes > /dev/null 2>&1
	if $bb [[ "$?" != "0" ]];
	then
		$bb echo
		$bb echo "File 'preloaded-classes' Not Found!"
		$bb echo "Odex Not Possible For This Rom..."
		if $bb [[ "$vibration" != "none" ]];
		then
			$bb echo 200 > $vibration
		fi;
		$bb echo
		cd $DIRX
		if $bb [ -f bb1 ];
		then
			$bb echo "Restoring BusyBox..."
			$bb mv -f bb1 busybox
		fi; 
		$bb echo "Exiting..."
		$bb echo
		exit 1
	else
		$bb echo
		$bb echo "Founded!"
	fi;
fi;
if $bb [ ! -d $TMPDIR ];
then
	$bb echo
	$bb echo "Creating Temp..."
	$bb mkdir $TMPDIR
	$bb echo
else
	$bb echo
	$bb echo "Temp Exists"
	$bb echo
fi;
$bb echo "All Ok"
$bb echo
}

free_space_preload() {
FREEP=`$bb df -Pm /preload | $bb tail -n 1 | $bb awk '{print $4}'`
$bb echo "Free Space In Preload: $FREEP Mb"
TOTALP=`$bb df -Pm /preload | $bb tail -n 1 | $bb awk '{print $2}'`
NECPA=`$bb expr $TOTALP \/ 100 \* 25`
CONPA=`$bb expr $FREEP \>= $NECPA`
NECCPA=`$bb expr $TOTALP \/ 100 \* 23`
CONCPA=`$bb expr $FREEP \>= $NECCPA`
}

cons_space_preload() {
if  $bb [[ "$CONPA" == "1" ]];
then
	$bb echo
	$bb echo "Sufficient Space!"
	$bb echo
else
	$bb echo "Insufficient Space..."
	$bb echo
	$bb echo -n "Continue? Yes/No "
	read answer
	if $bb [[ "$answer" == "yes" ]] || $bb [[ "$answer" == "y" ]] || $bb [[ "$answer" == "Yes" ]] || $bb [[ "$answer" == "Y" ]];
	then
		$bb echo
		$bb echo "Ok..."
		$bb echo
	else
		$bb echo
		$bb echo "Exiting..."
		$bb echo
		exit 1
	fi;
fi;
}

cons_space_custom_preload() {
if  $bb [[ "$CONCPA" == "1" ]];
then
	$bb echo
	$bb echo "Sufficient Space!"
	$bb echo
else
	$bb echo "Insufficient Space..."
	$bb echo
	$bb echo -n "Continue? Yes/No "
	read answer
	if $bb [[ "$answer" == "yes" ]] || $bb [[ "$answer" == "y" ]] || $bb [[ "$answer" == "Yes" ]] || $bb [[ "$answer" == "Y" ]];
	then
		$bb echo
		$bb echo "Ok..."
		$bb echo
	else
		$bb echo
		$bb echo "Exiting..."
		$bb echo
		exit 1
	fi;
fi;
}

free_space_system() {
FREES=`$bb df -Pm /system | $bb tail -n 1 | $bb awk '{print $4}'`
$bb echo "Free Space In System: $FREES Mb"
TOTALS=`$bb df -Pm /system | $bb tail -n 1 | $bb awk '{print $2}'`
NECSBS=`$bb expr $TOTALS \/ 100 \* 12`
NECSFR=`$bb expr $TOTALS \/ 100 \* 14`
NECSCSA=`$bb expr $TOTALS \/ 100 \* 16`
NECSFCS=`$bb expr $TOTALS \/ 100 \* 21`
NECSSYS=`$bb expr $TOTALS \/ 100 \* 16`
NECSALL=`$bb expr $TOTALS \/ 100 \* 25`
CONSBS=`$bb expr $FREES \>= $NECSBS`
CONSFR=`$bb expr $FREES \>= $NECSFR`
CONSCSA=`$bb expr $FREES \>= $NECSCSA`
CONSFCS=`$bb expr $FREES \>= $NECSFCS`
CONSSYS=`$bb expr $FREES \>= $NECSSYS`
CONSALL=`$bb expr $FREES \>= $NECSALL`
}

cons_space_bootstrap() {
if $bb [[ "$CONSBS" == "1" ]];
then
	$bb echo
	$bb echo "Sufficient Space!"
	$bb echo
else
	$bb echo "Insufficient Space..."
	$bb echo
	$bb echo -n "Continue? Yes/No "
	read answer
	if $bb [[ "$answer" == "yes" ]] || $bb [[ "$answer" == "y" ]] || $bb [[ "$answer" == "Yes" ]] || $bb [[ "$answer" == "Y" ]];
	then
		$bb echo
		$bb echo "Ok..."
		$bb echo
	else
		$bb echo
		$bb echo "Exiting..."
		$bb echo
		exit 1
	fi;
fi;
}

cons_space_framework() {
if $bb [[ "$CONSFR" == "1" ]];
then
	$bb echo
	$bb echo "Sufficient Space!"
	$bb echo
else
	$bb echo "Insufficient Space..."
	$bb echo
	$bb echo -n "Continue? Yes/No "
	read answer
	if $bb [[ "$answer" == "yes" ]] || $bb [[ "$answer" == "y" ]] || $bb [[ "$answer" == "Yes" ]] || $bb [[ "$answer" == "Y" ]];
	then
		$bb echo
		$bb echo "Ok..."
		$bb echo
	else
		$bb echo
		$bb echo "Exiting..."
		$bb echo
		exit 1
	fi;
fi;
}

cons_space_custom_system() {
if  $bb [[ "$CONSCSA" == "1" ]];
then
	$bb echo
	$bb echo "Sufficient Space!"
	$bb echo
else
	$bb echo "Insufficient Space..."
	$bb echo
	$bb echo -n "Continue? Yes/No "
	read answer
	if $bb [[ "$answer" == "yes" ]] || $bb [[ "$answer" == "y" ]] || $bb [[ "$answer" == "Yes" ]] || $bb [[ "$answer" == "Y" ]];
	then
		$bb echo
		$bb echo "Ok..."
		$bb echo
	else
		$bb echo
		$bb echo "Exiting..."
		$bb echo
		exit 1
	fi;
fi;
}

cons_space_system_apps() {
if  $bb [[ "$CONSSYS" == "1" ]];
then
	$bb echo
	$bb echo "Sufficient Space!"
	$bb echo
else
	$bb echo "Insufficient Space..."
	$bb echo
	$bb echo -n "Continue? Yes/No "
	read answer
	if $bb [[ "$answer" == "yes" ]] || $bb [[ "$answer" == "y" ]] || $bb [[ "$answer" == "Yes" ]] || $bb [[ "$answer" == "Y" ]];
	then
		$bb echo
		$bb echo "Ok..."
		$bb echo
	else
		$bb echo
		$bb echo "Exiting..."
		$bb echo
		exit 1
	fi;
fi;
}

cons_space_framework_system_apps() {
if  $bb [[ "$CONSFCS" == "1" ]];
then
	$bb echo
	$bb echo "Sufficient Space!"
	$bb echo
else
	$bb echo "Insufficient Space..."
	$bb echo
	$bb echo -n "Continue? Yes/No "
	read answer
	if $bb [[ "$answer" == "yes" ]] || $bb [[ "$answer" == "y" ]] || $bb [[ "$answer" == "Yes" ]] || $bb [[ "$answer" == "Y" ]];
	then
		$bb echo
		$bb echo "Ok..."
		$bb echo
	else
		$bb echo
		$bb echo "Exiting..."
		$bb echo
		exit 1
	fi;
fi;
}

cons_space_all_system() {
if $bb [[ "$CONSALL" == "1" ]];
then
	$bb echo
	$bb echo "Sufficient Space!"
	$bb echo
else
	$bb echo "Insufficient Space..."
	$bb echo
	$bb echo -n "Continue? Yes/No "
	read answer
	if $bb [[ "$answer" == "yes" ]] || $bb [[ "$answer" == "y" ]] || $bb [[ "$answer" == "Yes" ]] || $bb [[ "$answer" == "Y" ]];
	then
		$bb echo
		$bb echo "Ok..."
		$bb echo
	else
		$bb echo
		$bb echo "Exiting..."
		$bb echo
		exit 1
	fi;
fi;
}

timer() {
$bb echo "Odexing After:    3s"
if $bb [[ "$vibration" != "none" ]];
then
	$bb echo 100 > $vibration
fi;
$bb sleep 1
$bb echo "                  2s"
if $bb [[ "$vibration" != "none" ]];
then
	$bb echo 100 > $vibration
fi;
$bb sleep 1
$bb echo "                  1s"
if $bb [[ "$vibration" != "none" ]];
then
	$bb echo 100 > $vibration
fi;
$bb sleep 1
$bb echo
time=`$bb date +%T`
$bb echo "Script Starts At $time"
if $bb [[ "$vibration" != "none" ]];
then
	$bb echo 200 > $vibration
fi;
$bb sleep 1
$bb echo 
}

odexing_bootstrap() {
$bb echo "Odexing BootStrap..."
$bb sleep 1
$bb echo
cd $DIRFRAME
for core in $dexObjectList
	do
	coreodex=`$bb echo $core | $bb sed -e 's:.jar:.odex:g'`
	if $bb [ ! -f $coreodex ];
	then
		$bb echo "Odexing $core..."
		dexopt-wrapper $core $coreodex `$bb echo $BOOTCLASSPATH`
		if $bb [ $? -eq 0 ];
		then
			$bb echo "Removing 'classes.dex' from $core..."
			zip -q -d $core classes.dex
			$bb echo "Setting Permission of $core..."
			$bb chmod 644 $core
			$bb echo "Setting Permission of $coreodex..."
			$bb chmod 644 $coreodex
			if $bb [ -f $DIRDAL/system@framework@$core@classes.dex ];
			then
				$bb echo "Removing Dalvik of $core..."
				$bb rm -f $DIRDAL/system@framework@$core@classes.dex
			fi;
			$bb echo
		else
			if $bb [[ "$vibration" != "none" ]];
			then
				$bb echo 200 > $vibration
			fi;
			$bb echo "Failed To Odex $core"
			$bb echo
			$bb rm -f $coreodex
			$bb sleep 1
		fi;
	else
		$bb echo "$coreodex Exists"
		$bb echo
	fi;
	done
}

odexing_framework() {
$bb echo "Odexing Framework..."
$bb sleep 1
$bb echo
cd $DIRFRAME
for frame in *.jar
	do
	frameodex=`$bb echo $frame | $bb sed -e 's:.jar:.odex:g'`
	if $bb [ ! -f $frameodex ];
		then
		$bb echo "Odexing $frame..."
		dexopt-wrapper $frame $frameodex `$bb echo $BOOTCLASSPATH`
		if $bb [ $? -eq 0 ];
		then
			$bb echo "Removing 'classes.dex' from $frame..."
			zip -q -d $frame classes.dex
			$bb echo "Setting Permission of $frame..."
			$bb chmod 644 $frame
			$bb echo "Setting Permission of $frameodex..."
			$bb chmod 644 $frameodex
			if $bb [ -f $DIRDAL/system@framework@$frame@classes.dex ];
			then
				$bb echo "Removing Dalvik of $frame..."
				$bb rm -f $DIRDAL/system@framework@$frame@classes.dex
			fi;
			$bb echo
		else
			if $bb [[ "$vibration" != "none" ]];
			then
				$bb echo 200 > $vibration
			fi;
			$bb echo "Failed To Odex $frame"
			$bb echo
			$bb rm -f $frameodex
			$bb sleep 1
		fi;
	else
		$bb echo "$frameodex Exists"
		$bb echo
	fi;
	done
}

odexing_custom_system_apps() {
$bb echo "Odexing Custom System Apps..."
$bb sleep 1
$bb echo
cd $DIRSAPP
if $bb [ -f AndroidTerm.odex ];
then
	$bb echo "Skipping AndroidTerm..."
	$bb echo
else
	$bb cp -p AndroidTerm.apk AndroidTerm.odex
	$bb cp -p AndroidTerm.apk AT.apk
fi;
if $bb [ -f RootExplorer.apk ];
then
	$bb echo "Skipping RootExplorer..."
	$bb cp -p RootExplorer.apk RootExplorer.odex
	$bb echo
fi;
if $bb [ -f DeluxeSettings.apk ];
then
	$bb echo "Skipping DeluxeSettings..."
	$bb cp -p DeluxeSettings.apk DeluxeSettings.odex
	$bb echo
fi;
for capp in $CSA
	do
	cappodex=`$bb echo $capp | $bb sed -e 's:.apk:.odex:g'`
	$bb readlink $capp
	if $bb [ $? -eq 1 ];
	then
		if $bb [ ! -f $cappodex ];
		then
			$bb echo "Odexing $capp..."
			dexopt-wrapper $capp $cappodex `$bb echo $BOOTCLASSPATH`
			if $bb [ $? -eq 0 ];
			then
				$bb echo "Removing 'classes.dex' from $capp..."
				zip -q -d $capp classes.dex
				$bb unzip -l $capp | $bb grep -q /lib
				if $bb [[ "$?" != "1" ]];
				then
					$bb echo "Removing libs from $capp..."
					zip -q -d $capp *.so
				fi;
				$bb echo "Zipalign from $capp..."
				zipalign -f 4 $capp $TMPDIR/$capp
				$bb cat $TMPDIR/$capp > $capp
				$bb rm -f $TMPDIR/$capp
				$bb echo "Setting Permission of $capp..."
				$bb chmod 644 $capp
				$bb echo "Setting Permission of $cappodex..."
				$bb chmod 644 $cappodex
				if $bb [ -f $DIRDAL/system@app@$capp@classes.dex ];
				then
					$bb echo "Removing Dalvik of $capp..."
					$bb rm -f $DIRDAL/system@app@$capp@classes.dex
				fi;
		 		$bb echo
			else
				if $bb [[ "$vibration" != "none" ]];
				then
					$bb echo 200 > $vibration
				fi;
				$bb echo "Failed To Odex $capp"
		 		$bb echo
				$bb rm -f $cappodex
				$bb sleep 1
			fi;
		else
			$bb echo "$cappodex Exists"
			$bb echo
		fi;
	fi;
	done
if $bb [ -f RootExplorer.odex ];
then
	$bb echo "Restoring RootExplorer.apk..."
	$bb rm -f RootExplorer.odex 
	$bb echo
fi;
if $bb [ -f DeluxeSettings.odex ];
then
	$bb echo "Restoring DeluxeSettings..."
	$bb rm -f DeluxeSettings.odex 
	$bb echo
fi;
}

odexing_system_apps() {
$bb echo "Odexing System Apps..."
$bb sleep 1
$bb echo
cd $DIRSAPP
if $bb [ -f AndroidTerm.odex ];
then
	$bb echo "Skipping AndroidTerm..."
	$bb echo
else
	$bb cp -p AndroidTerm.apk AndroidTerm.odex
	$bb cp -p AndroidTerm.apk AT.apk
fi;
if $bb [ -f RootExplorer.apk ];
then
	$bb echo "Skipping RootExplorer..."
	$bb cp -p RootExplorer.apk RootExplorer.odex
	$bb echo
fi;
if $bb [ -f DeluxeSettings.apk ];
then
	$bb echo "Skipping DeluxeSettings..."
	$bb cp -p DeluxeSettings.apk DeluxeSettings.odex
	$bb echo
fi;
for app in *.apk
	do
	appodex=`$bb echo $app | $bb sed -e 's:.apk:.odex:g'`
	$bb readlink $app
	if $bb [ $? -eq 1 ];
	then
		if $bb [ ! -f $appodex ];
		then
			$bb echo "Odexing $app..."
			dexopt-wrapper $app $appodex `$bb echo $BOOTCLASSPATH`
			if $bb [ $? -eq 0 ];
			then
				$bb echo "Removing 'classes.dex' from $app..."
				zip -q -d $app classes.dex
				$bb unzip -l $app | $bb grep -q /lib
				if $bb [[ "$?" != "1" ]];
				then
					$bb echo "Removing libs from $app..."
					zip -q -d $app *.so
				fi;
				$bb echo "Zipalign from $app..."
				zipalign -f 4 $app $TMPDIR/$app
				$bb cat $TMPDIR/$app > $app
				$bb rm -f $TMPDIR/$app
				$bb echo "Setting Permission of $app..."
				$bb chmod 644 $app
				$bb echo "Setting Permission of $appodex..."
				$bb chmod 644 $appodex
				if $bb [ -f $DIRDAL/system@app@$app@classes.dex ];
				then
					$bb echo "Removing Dalvik of $app..."
					$bb rm -f $DIRDAL/system@app@$app@classes.dex
				fi;
				$bb echo
			else
				if $bb [[ "$vibration" != "none" ]];
				then
					$bb echo 200 > $vibration
				fi;
				$bb echo "Failed To Odex $app"
		 		$bb echo
				$bb rm -f $appodex
				$bb sleep 1
			fi;
		else
			$bb echo "$appodex Exists"
			$bb echo
		fi;
	fi;
	done
if $bb [ -f RootExplorer.odex ];
then
	$bb echo "Restoring RootExplorer..."
	$bb rm -f RootExplorer.odex 
	$bb echo
fi;
if $bb [ -f DeluxeSettings.odex ];
then
	$bb echo "Restoring DeluxeSettings..."
	$bb rm -f DeluxeSettings.odex 
	$bb echo
fi;
}

odexing_preload() {
$bb echo "Odexing Preload Apps..."
$bb sleep 1
$bb echo
cd $DIRPAPP
if $bb [ -f RootExplorer.apk ];
then
	$bb echo "Skipping RootExplorer..."
	$bb cp -p RootExplorer.apk RootExplorer.odex
	$bb echo
fi;
if $bb [ -f DeluxeSettings.apk ];
then
	$bb echo "Skipping DeluxeSettings..."
	$bb cp -p DeluxeSettings.apk DeluxeSettings.odex
	$bb echo
fi;
for papp in *.apk
	do
	pappodex=`$bb echo $papp | $bb sed -e 's:.apk:.odex:g'`
	if $bb [ ! -f $pappodex ];
	then
		$bb echo "Odexing $papp..."
		dexopt-wrapper $papp $pappodex `$bb echo $BOOTCLASSPATH`
		if $bb [ $? -eq 0 ];
		then
			$bb echo "Removing 'classes.dex' from $papp..."
			zip -q -d $papp classes.dex
			$bb unzip -l $papp | $bb grep -q /lib
			if $bb [[ "$?" != "1" ]];
			then
				$bb echo "Removing libs from $papp..."
				zip -q -d $papp *.so
			fi;
			$bb echo "Zipalign from $papp..."
			zipalign -f 4 $papp $TMPDIR/$papp
			$bb cat $TMPDIR/$papp > $papp
			$bb rm -f $TMPDIR/$papp
			$bb echo "Setting Permission of $papp..."
			$bb chmod 644 $papp
			$bb echo "Setting Permission of $pappodex..."
			$bb chmod 644 $pappodex
			$bb rm -f $DIRSAPP/$papp
			$bb ln -s $DIRPAPP/$papp $DIRSAPP/$papp
			$bb ln -s $DIRPAPP/$pappodex $DIRSAPP/$pappodex
			if $bb [ -f $DIRDAL/system@app@$papp@classes.dex ];
			then
				$bb echo "Removing Dalvik of $papp..."
				$bb rm -f $DIRDAL/system@app@$papp@classes.dex
			fi;
			$bb echo
		else
			if $bb [[ "$vibration" != "none" ]];
			then
				$bb echo 200 > $vibration
			fi;
			$bb echo "Failed To Odex $papp"
			$bb echo
			$bb rm -f $pappodex
			$bb sleep 1
		fi;
	else
		$bb echo "$pappodex Exists"
		$bb echo
	fi;
	done
if $bb [ -f RootExplorer.odex ];
then
	$bb echo "Restoring RootExplorer..."
	$bb rm -f RootExplorer.odex 
	$bb echo
fi;
if $bb [ -f DeluxeSettings.odex ];
then
	$bb echo "Restoring DeluxeSettings..."
	$bb rm -f DeluxeSettings.odex 
	$bb echo
fi;
} 

odexing_custom_preload() {
$bb echo "Odexing Custom Preload Apps..."
$bb sleep 1
$bb echo
cd $DIRPAPP
if $bb [ -f RootExplorer.apk ];
then
	$bb echo "Skipping RootExplorer..."
	$bb cp -p RootExplorer.apk RootExplorer.odex
	$bb echo
fi;
if $bb [ -f DeluxeSettings.apk ];
then
	$bb echo "Skipping DeluxeSettings..."
	$bb cp -p DeluxeSettings.apk DeluxeSettings.odex
	$bb echo
fi;
for pcapp in $CPA
	do
	pcappodex=`$bb echo $pcapp | $bb sed -e 's:.apk:.odex:g'`
	if $bb [ ! -f $pcappodex ];
	then
		$bb echo "Odexing $pcapp..."
		dexopt-wrapper $pcapp $pcappodex `$bb echo $BOOTCLASSPATH`
		if $bb [ $? -eq 0 ];
		then
			$bb echo "Removing 'classes.dex' from $pcapp..."
			zip -q -d $pcapp classes.dex
			$bb unzip -l $pcapp | $bb grep -q /lib
			if $bb [[ "$?" != "1" ]];
			then
				$bb echo "Removing libs from $pcapp..."
				zip -q -d $pcapp *.so
			fi;
			$bb echo "Zipalign from $pcapp..."
			zipalign -f 4 $pcapp $TMPDIR/$pcapp
			$bb cat $TMPDIR/$pcapp > $pcapp
			$bb rm -f $TMPDIR/$pcapp
			$bb echo "Setting Permission of $pcapp..."
			$bb chmod 644 $pcapp
			$bb echo "Setting Permission of $pcappodex..."
			$bb chmod 644 $pcappodex
			$bb rm -f $DIRSAPP/$pcapp
			$bb ln -s $DIRPAPP/$pcapp $DIRSAPP/$pcapp
			$bb ln -s $DIRPAPP/$pcappodex $DIRSAPP/$pcappodex
			if $bb [ -f $DIRDAL/system@app@$pcapp@classes.dex ];
			then
				$bb echo "Removing Dalvik of $pcapp..."
				$bb rm -f $DIRDAL/system@app@$pcapp@classes.dex
			fi;
			$bb echo
		else
			if $bb [[ "$vibration" != "none" ]];
			then
				$bb echo 200 > $vibration
			fi;
			$bb echo "Failed To Odex $pcapp"
			$bb echo
			$bb rm -f $pcappodex
			$bb sleep 1
		fi;
	else
		$bb echo "$pcappodex Exists"
		$bb echo
	fi;
	done
if $bb [ -f RootExplorer.odex ];
then
	$bb echo "Restoring RootExplorer..."
	$bb rm -f RootExplorer.odex 
	$bb echo
fi;
if $bb [ -f DeluxeSettings.odex ];
then
	$bb echo "Restoring DeluxeSettings..."
	$bb rm -f DeluxeSettings.odex 
	$bb echo
fi;
}

odexing_data() {
$bb echo "Odexing Data Apps..."
$bb sleep 1
$bb echo
cd $DIRDAPP
if $bb [ -f com.speedsoftware.rootexplorer-1.apk ];
then
	$bb echo "Skipping RootExplorer..."
	$bb cp -p com.speedsoftware.rootexplorer-1.apk com.speedsoftware.rootexplorer-1.odex
	$bb echo
fi;
if $bb [ -f com.speedsoftware.rootexplorer-2.apk ];
then
	$bb echo "Skipping RootExplorer..."
	$bb cp -p com.speedsoftware.rootexplorer-2.apk com.speedsoftware.rootexplorer-2.odex
	$bb echo
fi;
if $bb [ -f com.jkaysoft.icsdeluxe-1.apk ];
then
	$bb echo "Skipping DeluxeSettings..."
	$bb cp -p com.jkaysoft.icsdeluxe-1.apk com.jkaysoft.icsdeluxe-1.odex
	$bb echo
fi;
if $bb [ -f com.jkaysoft.icsdeluxe-2.apk ];
then
	$bb echo "Skipping DeluxeSettings..."
	$bb cp -p com.jkaysoft.icsdeluxe-2.apk com.jkaysoft.icsdeluxe-2.odex
	$bb echo
fi;
for dapp in *.apk
	do
	dappodex=`$bb echo $dapp | $bb sed -e 's:.apk:.odex:g'`
	if $bb [ ! -f $dappodex ];
	then
		$bb echo "Odexing $dapp..."
		dexopt-wrapper $dapp $dappodex `$bb echo $BOOTCLASSPATH`
		if $bb [ $? -eq 0 ];
		then
			$bb echo "Removing 'classes.dex' from $dapp..."
			zip -q -d $dapp classes.dex
			$bb echo "Zipalign from $dapp..."
			zipalign -f 4 $dapp $TMPDIR/$dapp
			$bb cat $TMPDIR/$dapp > $dapp
			$bb rm -f $TMPDIR/$dapp
			$bb echo "Setting Permission of $dapp..."
			$bb chmod 644 $dapp
			$bb echo "Setting Permission of $dappodex..."
			$bb chmod 644 $dappodex
			if $bb [ -f $DIRDAL/data@app@$dapp@classes.dex ];
			then
				$bb echo "Removing Dalvik of $dapp..."
				$bb rm -f $DIRDAL/data@app@$dapp@classes.dex
			fi;
			$bb echo
		else
			if $bb [[ "$vibration" != "none" ]];
			then
				$bb echo 200 > $vibration
			fi;
			$bb echo "Failed To Odex $dapp"
			$bb echo
			$bb rm -f $dappodex
			$bb sleep 1
		fi;
	else
		$bb echo "$dappodex Exists"
		$bb echo
	fi;
	done
if $bb [ -f com.speedsoftware.rootexplorer-1.odex ];
then
	$bb echo "Restoring RootExplorer..."
	$bb rm -f com.speedsoftware.rootexplorer-1.odex
	$bb echo
fi;
if $bb [ -f com.speedsoftware.rootexplorer-2.odex ];
then
	$bb echo "Restoring RootExplorer..."
	$bb rm -f com.speedsoftware.rootexplorer-2.odex
	$bb echo
fi;
if $bb [ -f com.jkaysoft.icsdeluxe-1.odex ];
then
	$bb echo "Restoring DeluxeSettings..."
	$bb rm -f com.jkaysoft.icsdeluxe-1.odex
	$bb echo
fi;
if $bb [ -f com.jkaysoft.icsdeluxe-2.odex ];
then
	$bb echo "Restoring DeluxeSettings..."
	$bb rm -f com.jkaysoft.icsdeluxe-2.odex
	$bb echo
fi;
}

removing_temp() {
cd $DIRX
if $bb [ -f bb1 ];
then
	$bb echo "Restoring BusyBox..."
	$bb mv -f bb1 busybox
	$bb echo
fi;
cd $DIR
if $bb [ -d $TMPDIR ];
then
	$bb echo "Removing Temp..."
	$bb rm -r -f $TMPDIR
	$bb echo
fi;
$bb echo "Odex Complete!"
if $bb [[ "$vibration" != "none" ]];
then
	$bb echo 300 > $vibration
fi;
$bb echo
}

restore() {
cd $DIRSAPP
if $bb [ -f AT.odex ];
then
	$bb echo "Restoring AndroidTerm..."
	$bb rm -f AndroidTerm.odex
	$bb mv -f AT.odex AndroidTerm.odex
	$bb rm -f AndroidTerm.apk
	$bb mv -f AT.apk AndroidTerm.apk
	$bb echo
fi;
cd $DIRDAL
if $bb [ -f system@app@AndroidTerm.apk@classes.dex ];
then
	$bb rm -f system@app@AndroidTerm.apk@classes.dex
fi;
}

reboot()
{
$bb echo "Please Reboot!"
$bb echo
}

if $bb [[ "${2}" == "-log" ]] || $bb [[ "${2}" == "-l" ]];
then
	$bb clear
	if $bb [[ "`$bb id -u`" == "0" ]];
	then
		if $bb [ -f /sys/class/timed_output/vibrator/enable ];
		then
			vibration="/sys/class/timed_output/vibrator/enable"
		else
			vibration="none"
		fi;
	else
		vibration="none"
	fi;
	$bb echo "Log Activated!"
	if $bb [[ "$vibration" != "none" ]];
	then
		$bb echo 200 > $vibration
	fi;
	LOG=/sdcard/odex.log
	if [ -f $LOG ];
	then
		$bb rm -f $LOG
	fi
	$bb sleep 1
	dexo ${1} | $bb tee -a $LOG
	exit 1
fi

if $bb [[ "${1}" == "" ]];
then
	$bb clear
	start_info
	$bb echo
	$bb echo "Type 'dexo -h' To Show All Commands"
	$bb echo
	exit 1
elif $bb [[ "${1}" == "-h" ]];
then
	$bb clear
	start_info
	$bb echo
	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		free_space_preload
	fi;
	free_space_system
	$bb echo
	$bb echo "----------------------------------------"
	$bb echo "Possible Command For Your Phone:"
	$bb echo "dexo -dat | Odex Data Apps"
	if [[ "$CONSBS" == "1" ]];
	then
		$bb echo "dexo -bs  | Odex BootStrap"
	fi;
	if [[ "$CONSFR" == "1" ]];
	then
		$bb echo "dexo -fr  | Odex BootStrap and Framework"
	fi;
 	if $bb [ -f /sdcard/csa.txt ];
	then
		if [[ "$CONSCSA" == "1" ]];
		then
			$bb echo "dexo -csa | Odex Custom System Apps"
		fi;
		if [[ "$CONSFCS" == "1" ]];
		then
			$bb echo "dexo -fcs | Odex BS-FR-CSA"
		fi;
	fi;
	if [[ "$CONSSYS" == "1" ]];
	then
		$bb echo "dexo -sys | Odex System Apps"
	fi;
	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		if $bb [[ "$CONPA" == "1" ]];
		then
			$bb echo "dexo -pa  | Odex Preaload Apps"
		fi;
	fi;
	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		if $bb [ -f /sdcard/cpa.txt ];
		then
			if $bb [[ "CONCPA" == "1" ]];
			then
				$bb echo "dexo -cpa | Odex Custom Preload Apps"
			fi;
		fi;
	fi;
	if [[ "$CONSALL" == "1" ]];
	then
		$bb echo "dexo -all | Odex All Rom"
	fi;
	$bb echo "----------------------------------------"
	$bb echo "Not Recommended Command For Your Phone (Insufficient Free Space):"
	if [[ "$CONSBS" == "0" ]];
	then
		$bb echo "dexo -bs  | Odex BootStrap"
	fi;
	if [[ "$CONSFR" == "0" ]];
	then
		$bb echo "dexo -fr  | Odex BootStrap and Framework"
	fi;
	if $bb [ -f /sdcard/csa.txt ];
	then
		if [[ "$CONSCSA" == "0" ]];
		then
			$bb echo "dexo -csa | Odex Custom System Apps"
		fi;
		if [[ "$CONSFCS" == "0" ]];
		then
			$bb echo "dexo -fcs | Odex BS-FR-CSA"
		fi;
	fi;
	if [[ "$CONSSYS" == "0" ]];
	then
		$bb echo "dexo -sys | Odex System Apps"
	fi;
	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		if $bb [[ "$CONPA" == "0" ]];
		then
			$bb echo "dexo -pa | Odex Preload Apps"
		fi;
	fi;
	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		if $bb [ -f /sdcard/cpa.txt ];
		then
			if $bb [[ "$CONCPA" == "0" ]];
			then
				$bb echo "dexo -cpa | Odex Preaload System Apps"
			fi;
		fi;
	fi;
	if [[ "$CONSALL" == "0" ]];
	then
		$bb echo "dexo -all | Odex All Rom"
	fi;
	$bb echo "----------------------------------------"
	$bb echo "Command Not Possible For Your Phone:"
	if $bb [[ "$PRELOAD" == "no" ]];
	then
		$bb echo "dexo -pa  | Odex Preload Apps (Preload Partition Not Found)"
		$bb echo "dexo -cpa | Odex Custom Preload Apps (Preload Partition Not Found)"
	fi;
	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		if $bb [ ! -f /sdcard/cpa.txt ];
		then
			$bb echo "dexo -cpa | Odex Preaload System Apps (File 'cpa.txt' In SDCard Not Found)"
		fi;
	fi;
	if $bb [ ! -f /sdcard/csa.txt ];
	then
		$bb echo "dexo -csa | Odex Custom System Apps (File 'csa.txt' In SDCard Not Found)"
		$bb echo "dexo -fcs | Odex BS-FR-CSA (File 'csa.txt' In SDCard Not Found)"
	fi;
	$bb echo "----------------------------------------"
	$bb echo
	$bb echo "Secondary Commands:"
	$bb echo "+ Type 'dexo -(one of the option that you have decided) -log' To Activate Log"
	$bb echo "+ Type 'dexo -ch' To Show Changelog"
	$bb echo
	$bb echo "Go to my webpage on xda to see more info"
	$bb echo "http://forum.xda-developers.com/showthread.php?t=2162413"
	$bb echo
	$bb echo "MatrixDJ96 - XDA Senior Member"
	$bb echo
	exit 1
elif $bb [[ "${1}" == "-bs" ]];
then
	$bb clear
	start_info
	$bb echo
	root
	free_space_system
	cons_space_bootstrap
	preparing
	timer
	odexing_bootstrap
	removing_temp
	reboot
elif $bb [[ "${1}" == "-fr" ]];
then
	$bb clear
	start_info
	$bb echo
	root
	free_space_system
	cons_space_framework
	preparing
	timer
	odexing_bootstrap
	odexing_framework
	removing_temp
	reboot
elif $bb [[ "${1}" == "-csa" ]];
then
	$bb clear
	start_info
 	if $bb [ -f /sdcard/csa.txt ];
	then
		$bb echo
		root
		free_space_system
		cons_space_custom_system
		preparing
		timer
		odexing_custom_system_apps
		removing_temp
		restore
		reboot
	else
		$bb echo
		$bb echo "Command Not Possible For Your System"
		$bb echo
		exit 1
	fi;
elif $bb [[ "${1}" == "-sys" ]];
then
	$bb clear
	start_info
	$bb echo
	root
	free_space_system
	cons_space_system_apps
	preparing
	timer
	odexing_system_apps
	removing_temp
	restore
	reboot
elif $bb [[ "${1}" == "-fcs" ]];
then
	$bb clear
	start_info
 	if $bb [ -f /sdcard/csa.txt ];
	then
		$bb echo
		root
		free_space_system
		cons_space_framework_system_apps
		preparing
		timer
		odexing_bootstrap
		odexing_framework
		odexing_custom_system_apps
		removing_temp
		restore
		reboot
	else
		$bb echo
		$bb echo "Command Not Possible For Your System"
		$bb echo
		exit 1
	fi;
elif $bb [[ "${1}" == "-pa" ]];
then
	$bb clear
	start_info
 	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		$bb echo
		root
		free_space_preload
		cons_space_preload
		preparing
		timer
		odexing_preload
		removing_temp
		reboot
	else
		$bb echo
		$bb echo "Command Not Possible For Your System"
		$bb echo
		exit 1
	fi;
elif $bb [[ "${1}" == "-cpa" ]];
then
	$bb clear
	start_info
	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		if $bb [ -f /sdcard/cpa.txt ];
		then
			$bb echo
			root
			free_space_preload
			cons_space_custom_preload
			preparing
			timer
			odexing_custom_preload
			removing_temp
			reboot
		else
			$bb echo
			$bb echo "Command Not Possible For Your System"
			$bb echo
			exit 1
		fi;
	else
		$bb echo
		$bb echo "Command Not Possible For Your System"
		$bb echo
		exit 1
	fi;
elif $bb [[ "${1}" == "-all" ]];
then
	$bb clear
	start_info
	$bb echo
	root
	free_space_system
	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		free_space_preload
	fi;
	cons_space_all_system
	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		cons_space_preload
	fi;
	preparing
	timer
	odexing_bootstrap
	odexing_framework
	if $bb [[ "$PRELOAD" == "yes" ]];
	then
		odexing_preload
	fi;
	odexing_system_apps
	removing_temp
	restore
	reboot
elif $bb [[ "${1}" == "-dat" ]];
then
	$bb clear
	start_info
	$bb echo
	root
	preparing
	timer
	odexing_data
	removing_temp
	reboot
elif $bb [[ "${1}" == "-ch" ]];
then
	$bb clear
	start_info
	$bb echo
	$bb echo "Changelog:"
	$bb echo
	$bb echo "Universal Odex Version 6.3 Private"
	$bb echo "- A Lot Of Bugs Fixed"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 6.2"
	$bb echo "- Added 1 New Command To Odex Your Rom"
	$bb echo "> Now You Can Odex:"
	$bb echo "+ Only Specific Preload Apps ('dexo -cpa')"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 6.1 Private"
	$bb echo "- Fixed Minor Bug"
	$bb echo "- Rewritten Script"
	$bb echo "- Changed Command 'dexo -psa' In 'dexo -pa'"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 6.0 Private"
	$bb echo "- Added Controll Of Free Space In System"
	$bb echo "- Added New Command To Activate Log"
	$bb echo "> Type 'dexo -(one of the option that you have decided) -log'"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 5.2 Private"
	$bb echo "- Removed 'fixbox' Script Because Now There Aren't Necessary Symlink Of BusyBox"
	$bb echo "- Added Check Of Root Permission"
	$bb echo "- Updated Command 'dexo -all' To Odex Also Preload Apps"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 5.1"
	$bb echo "- Fixed Bug Of Odex System And Preload"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 5.0"
	$bb echo "- Added 1 New Command To Odex Your Rom"
	$bb echo "> Now You Can Odex:"
	$bb echo "+ Only Preload Apps ('dexo -psa') (if your phone has preload partition)"
	$bb echo "- Skipped Odex Of RootExplorer If Is Installed In System Or Preload Or Data (beacause old version can't be odexed and i prefer old version)"
	$bb echo "- Fixed A Lot Of Bug"
	$bb echo "- Changed A Little Bit The Interface"
	$bb echo "- More Universal Now"
	$bb echo "- Add New Script (Type 'fixbox') To Fix Error Of Busybox (Like clear: not found)"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 4.2.3"
	$bb echo "- Added 1 New Command To Odex Your Rom"
	$bb echo "> Now You Can Odex:"
	$bb echo "+ App In Data ('dexo -dat')"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 4.2.2"
	$bb echo "- Fixed Grep Of 'dexo -csa' And 'dexo -fcs'"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 4.2.1"
	$bb echo "- Fixed Bug Of Commands 'dexo -csa' And 'dexo -fcs'"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 4.2 Beta"
	$bb echo "- Added 2 New Command To Odex Your Rom"
	$bb echo "> Now You Can Odex:"
	$bb echo "+ Only Specific App ('dexo -csa')"
	$bb echo "+ Framework With Specific App ('dexo -fcs')"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 4.1.3"
	$bb echo "- Fixed BootLoop On Device Like Galaxy S2 (Fixed Permission)"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 4.1.2"
	$bb echo "- Updated Android Terminal Emulator"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 4.1.1.1"
	$bb echo "- More Compatible"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 4.1.1"
	$bb echo "- Fixed Remove Temp File"
	$bb echo "- Fixed Zipalign For ICS And JB"
	$bb echo "- System Now Is Mounted By Busybox"
	$bb echo "- Add Info For Android JB 4.3 And KLP 5.0"
	$bb echo "- System Apps Now Have The BCP For Odex"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 4.0.1"
	$bb echo "- Edited Script To Fix Some Words"
	$bb echo "----------------------------------"
	$bb echo "Universal Odex Version 4.0"
	$bb echo "- Added 4 New Command To Odex Your Rom:"
	$bb echo "> Now You Can Odex:"
	$bb echo "+ Only Bootstrap ('dexo -bs')"
	$bb echo "+ Bootstrap and Framework ('dexo -fr')"
	$bb echo "+ Only System Apps ('dexo -sys')"
	$bb echo "+ All Rom ('dexo -all')" 
	$bb echo
	exit 1
else
	$bb clear
	start_info
	$bb echo
	$bb echo "Are You Sure? '${1}'?"
	$bb echo "Type 'dexo -h' To Show Possible Commands"
	$bb echo
	exit 1
fi;

#  _    _   _____  _______  ____       
# | \  / | |     |    |    |    |  |  \       / 
# |  \/  | |_____|    |    |____|  |    \ _ /   
# |      | |     |    |    |   \   |    /   \   
# |      | |     |    |    |    \  |  /       \ 
