#! /system/bin/sh
# Based On Universal Odex 3.1
# Ultra-Mega-Super-Mod By MatrixDJ96
# Last Update: 17-07-2013
# Enjoy! :-)

dexo_i()
{
if [ `grep "ro.product.model=" /system/build.prop` ]
then
	device=`grep "ro.product.model=" /system/build.prop | sed 's:ro.product.model=::g'`
	echo "Universal Odex For $device"
else
	echo "Universal Odex"
fi
echo "Version 4.2.3"
echo
if [ `grep "ro.modversion=" /system/build.prop` ]
then
	romname=`grep "ro.modversion=" /system/build.prop | sed 's:ro.modversion=::g' | sed 's:-: :g' | sed 's:_: :g'`
	echo "Installed Rom: $romname"
else
	echo "Unknown Rom"
fi
if [ `grep "ro.build.version.release=" /system/build.prop` ]
then
	romversion=`grep "ro.build.version.release=" /system/build.prop | sed 's:ro.build.version.release=::g'`
	if [ `grep "ro.build.version.release=2.2" /system/build.prop` ]
	then
		info="Froyo"
	fi
	if [ `grep "ro.build.version.release=2.3" /system/build.prop` ]
	then
		info="Gingerbread"
	fi
	if [ `grep "ro.build.version.release=4.0" /system/build.prop` ]
	then
		info="Ice Cream Sandwich"
	fi
	if [ `grep "ro.build.version.release=4.1" /system/build.prop` ]
	then
		info="Jelly Bean"
	fi
	if [ `grep "ro.build.version.release=4.2" /system/build.prop` ]
	then
		info="Jelly Bean"
	fi
	if [ `grep "ro.build.version.release=4.3" /system/build.prop` ]
	then
		info="Jelly Bean"
	fi
	if [ `grep "ro.build.version.release=5.0" /system/build.prop` ]
	then
		info="Key Lime Pie"
	fi
	echo "Android Version: $romversion ($info)"
else
	echo "Unknow Android Version"
fi
}

dexo_p()
{
echo "Mounting File System..."
mount -o remount, rw /
mount -o remount, rw /data
mount -o remount, rw /system
echo
echo "Setting Variable and Costant..."
DIR=/
DIRDAL=/data/dalvik-cache
DIRDAPP=/data/app
DIRSAPP=/system/app
DIRFRAME=/system/framework
DIRX=/system/xbin
TMPDIR=/odex
echo
cd $DIRX
if [ -f $DIRX/busybox ]
then
	echo "Setting BusyBox..."
	cp -p busybox bb1
	cp -p busyodex busybox
	echo
fi
if [ -f /sdcard/csa.txt ]
then
	CSA=`grep " " /sdcard/csa.txt`
fi
if [ -z "${BOOTCLASSPATH+xx}" ]
then
	echo "BOOTCLASSPATH not setted"
	echo "Grepping from init.rc..."
	dexBCP=`grep "export BOOTCLASSPATH" /init.rc \
		| sed -e 's:^[ \t]*::' \
		| sed 's:export BOOTCLASSPATH ::g' \
		| sed 's:\:: :g'`
	dexObjectList=`grep "export BOOTCLASSPATH" /init.rc \
		| sed -e 's:^[ \t]*::' \
		| sed 's:export BOOTCLASSPATH :\::g' \
		| sed 's:\:/system/framework/: :g'`
else
	dexBCP=$BOOTCLASSPATH
	dexObjectList=`echo $BOOTCLASSPATH \
		| sed 's:\:: :g' \
		| sed 's:/system/framework/::g'`
fi
echo "BOOTCLASSPATCH: $dexBCP"
echo
echo "BOOTSTRAP: $dexObjectList"
echo
echo "Grepping preloaded-classes..."
echo
cd $DIRFRAME
unzip -l framework.jar
if [ $? != "0" ]
then
	echo
	echo "Impossible unzip framework to grep preloaded-classes!"
	if [ -f bb1 ]
	then
		echo
		echo "Restoring BusyBox..."
		mv bb1 busybox
		echo
    fi
	echo "Exiting..."
	exit 1
else
	unzip -l framework.jar | grep preloaded-classes >/dev/null 2>&1
	if [ $? != "0" ]
    then
		echo
		echo "Impossible grep preloaded-classes"
		if [ -f bb1 ]
		then
			echo
			echo "Restoring BusyBox..."
			mv bb1 busybox
		fi
		echo
		echo "Exiting..."
		exit 1
	fi
fi
cd $DIR
if [ -f /sys/class/timed_output/vibrator/enable ]
then
	vibration="/sys/class/timed_output/vibrator/enable"
else
	vibration="none"
fi
cd $DIR
if [ ! -d $TMPDIR ]
then
	echo
	echo "Creating Temp..."
	mkdir $TMPDIR
	echo
else
	echo "Temp Exists"
	echo
fi
echo "All Ok"
echo
}

dexo_g()
{
echo "Odexing After:    3s"
if [ $vibration != "none" ]
then
	echo 100 > $vibration
fi
sleep 1
echo "                  2s"
if [ $vibration != "none" ]
then
	echo 100 > $vibration
fi
sleep 1
echo "                  1s"
if [ $vibration != "none" ]
then
	echo 100 > $vibration
fi
sleep 1
echo "                  Go!"
if [ $vibration != "none" ]
then
	echo 200 > $vibration
fi
sleep 1
echo
}

dexo_b()
{
echo "Odexing BOOTSTRAP..."
sleep 1
echo
cd $DIRFRAME
for core in $dexObjectList
	do
	coreodex=`echo $core | sed -e 's:.jar:.odex:g'`
	if [ ! -f $coreodex ]
	then
		dexopt-wrapper $core $coreodex $dexBCP
		if [ $? -eq 0 ]
		then
			zip -d $core classes.dex
			echo "Setting Permission of $core"
			chmod 644 $core
			echo "Setting Permission of $coreodex"
			chmod 644 $coreodex
			if [ -f $DIRDAL/system@framework@$core@classes.dex ]
			then
				echo "Removing Dalvik of $core..."
				rm $DIRDAL/system@framework@$core@classes.dex
			fi
			echo
			else
			rm $coreodex
			echo
		fi
	else
		echo "$coreodex Exists"
		echo
	fi
	done
}

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

dexo_cs()
{
echo "Odexing Custom System Apps..."
sleep 1
echo
cd $DIRSAPP
if [ -f AndroidTerm.odex ]
then
	echo "Skipping AndroidTerm..."
	echo
else
	cp -p AndroidTerm.apk AndroidTerm.odex
	cp -p AndroidTerm.apk AT.apk
fi
for capp in $CSA
	do
	cappodex=`echo $capp | sed -e 's:.apk:.odex:g'`
	if [ ! -f $cappodex ]
	then
		dexopt-wrapper $capp $cappodex $dexBCP
		if [ $? -eq 0 ]
		then
			zip -d $capp classes.dex
			echo "Zipalign from $capp"
			zipalign -f -v 4 $capp $TMPDIR/$capp
			cat $TMPDIR/$capp > $capp
			rm $TMPDIR/$capp
			echo "Setting Permission of $capp"
			chmod 644 $capp
			echo "Setting Permission of $cappodex"
			chmod 644 $cappodex
			if [ -f $DIRDAL/system@app@$capp@classes.dex ]
			then
				echo "Removing Dalvik of $capp..."
				rm $DIRDAL/system@app@$capp@classes.dex
			fi
			echo
		else
			rm $cappodex
			echo
		fi
	else
		echo "$cappodex Exists"
		echo
	fi
	done
}

dexo_s()
{
echo "Odexing System Apps..."
sleep 1
echo
cd $DIRSAPP
if [ -f AndroidTerm.odex ]
then
	echo "Skipping AndroidTerm..."
	echo
else
	cp -p AndroidTerm.apk AndroidTerm.odex
	cp -p AndroidTerm.apk AT.apk
fi
for app in *.apk
	do
	appodex=`echo $app | sed -e 's:.apk:.odex:g'`
	if [ ! -f $appodex ]
	then
		dexopt-wrapper $app $appodex $dexBCP
		if [ $? -eq 0 ]
		then
			zip -d $app classes.dex
			echo "Zipalign from $app"
			zipalign -f -v 4 $app $TMPDIR/$app
			cat $TMPDIR/$app > $app
			rm $TMPDIR/$app
			echo "Setting Permission of $app"
			chmod 644 $app
			echo "Setting Permission of $appodex"
			chmod 644 $appodex
			if [ -f $DIRDAL/system@app@$app@classes.dex ]
			then
				echo "Removing Dalvik of $app..."
				rm $DIRDAL/system@app@$app@classes.dex
			fi
			echo
		else
			rm $appodex
			echo
		fi
	else
		echo "$appodex Exists"
		echo
	fi
	done
}

dexo_da()
{
echo "Odexing Data Apps..."
sleep 1
echo
cd $DIRDAPP
for dapp in *.apk
	do
	dappodex=`echo $dapp | sed -e 's:.apk:.odex:g'`
	if [ ! -f $dappodex ]
	then
		dexopt-wrapper $dapp $dappodex $dexBCP
		if [ $? -eq 0 ]
		then
			zip -d $dapp classes.dex
			echo "Zipalign from $capp"
			zipalign -f -v 4 $dapp $TMPDIR/$dapp
			cat $TMPDIR/$dapp > $dapp
			rm $TMPDIR/$dapp
			echo "Setting Permission of $dapp"
			chmod 644 $dapp
			echo "Setting Permission of $dappodex"
			chmod 644 $dappodex
			if [ -f $DIRDAL/data@app@$dapp@classes.dex ]
			then
				echo "Removing Dalvik of $dapp..."
				rm $DIRDAL/data@app@$dapp@classes.dex
			fi
			echo
		else
			rm $cappodex
			echo
		fi
	else
		echo "$cappodex Exists"
		echo
	fi
	done
}

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

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

dexo_c()
{
echo "Rebooting!"
echo
reboot

}

if [[ "${1}" == "" ]]
then
	clear
	dexo_i
	echo
	echo "Type 'dexo -h' To Show Commands"
	echo
else 
	if [[ "${1}" == "-h" ]]
	then
		clear
		dexo_i
		echo
		echo "dexo -bs  | Odex BootStrap"
		echo "dexo -fr  | Odex BootStrap and Framework"
		echo "dexo -csa | Odex Custom System App"
		echo "dexo -sys | Odex System Apps"
		echo "dexo -fcs | Odex BS-FR-CSA"
		echo "dexo -all | Odex All Rom"
		echo "dexo -dat | Odex Data Apps"
		echo
		echo "Go to my webpage on xda to see more info"
		echo "http://forum.xda-developers.com/showthread.php?t=2162413"
		echo
	else
		if [[ "${1}" == "-bs" ]]
		then
			clear
			dexo_i
			sleep 1
			echo
			dexo_p
			dexo_g
			dexo_b
			dexo_r
			dexo_c
		else
			if [[ "${1}" == "-fr" ]]
			then
				clear
				dexo_i
				sleep 1
				echo
				dexo_p
				dexo_g
				dexo_b
				dexo_f
				dexo_r
				dexo_c
			else
				if [[ "${1}" == "-csa" ]]
				then
					clear
					dexo_i
					sleep 1
					echo
					dexo_p
					dexo_g
					dexo_cs
					dexo_r
					dexo_sr
					dexo_c
				else
					if [[ "${1}" == "-sys" ]]
					then
						clear
						dexo_i
						sleep 1
						echo
						dexo_p
						dexo_g
						dexo_s
						dexo_r
						dexo_sr
						dexo_c
					else
						if [[ "${1}" == "-fcs" ]]
						then
							clear
							dexo_i
							sleep 1
							echo
							dexo_p
							dexo_g
							dexo_b
							dexo_f
							dexo_cs
							dexo_r
							dexo_sr
							dexo_c
						else
							if [[ "${1}" == "-all" ]]
							then
								clear
								dexo_i
								sleep 1
								echo
								dexo_p
								dexo_g
								dexo_b
								dexo_f
								dexo_s
								dexo_r
								dexo_sr
								dexo_c
							else
								if [[ "${1}" == "-dat" ]]
								then
									clear
									dexo_i
									sleep 1
									echo
									dexo_p
									dexo_g
									dexo_da
									dexo_r
									dexo_c
								else
									clear
									dexo_i
									echo
									echo "Unknow Command For 'dexo'"
									echo
								fi
							fi
						fi
					fi
				fi
			fi
		fi
	fi
fi

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