PDA

View Full Version : Re-Odexing script



tanimn
01-17-2011, 01:21 AM
Update: Ready to go!

raiderep turned me onto this idea in irc. Eventually I would like to see it become a boot script to process and odex new files at startup. For now it's a standalone odexer and deodexed restoration tool.

OK. Here's the whole kit and kaboodle.
I need proof-reading, suggestions, help with the release blurb, and maybe some suckers, er testers, to try it out. ;) It's ready to go! Please get back to me ASAP. We want this released soonest.

With one click it odexes, with another click it restores. How much simpler could it get? :D

http://dl.dropbox.com/u/17599767/OneClickOdexer_v1.0.zip

README.TXT


OneClickOdexer v1.0 - Linux/Mac/Windows package
by Kim Middleton ( tanimn _@_ http://WWW.hotmail.com )
for ACS ( Android Creative Syndicate )

Exclusively for use on Samsung Epic 4G handsets.
Based on work by Paul O'Brien @ http://www.MoDaCo.com
Thanks to raiderep, joeykrim, skeeterslint, rjmjr69, and ACS.

PREREQUISITES:

USB Cable.
Correctly installed and configured drivers for your handset.
Root permissions on your handset.
A NANDROID BACKUP!!!


DETAILS:

OneClickOdexer is an odexing and restoral tool for deodexed roms. It will determine if it has been previously run
and automatically odex your rom or restore it to a deodexed state. If a critical error occurs, it will return
your phone to it's previous state. Care has been taken to only odex apps that come stock with an odex file.

With one click, it odexes.
With one click, it restores.

PROS:

Increases speed by about 15%
Reduces memory usage
More space available on /data
Reduced use of dalvik-cache

CONS:

Might need to re-add some widgets and home screen icons
Need to restore your deodexed system to make any theme swaps (But that's just one click away...)

ERRATA:

Backups:
Please perform a nandroid backup before making any major modifications to your handset's software.
Modifications such as changing how the dalvik virtual machine functions in your phone can sometimes prove unpredictable...

Mounting the SD Card:
Do NOT have the sd card mounted to the PC when attempting to run this script.
Do NOT attempt to run this script while your handset is scanning media.

/sdcard/odex:
Do not touch the /sdcard/odex folder unless you intend to flash a new rom or restore from nandroid backup.
If you swap sdcards please make sure to have the correct one inserted when attempting to restore.

Root:
You may have to unlock your screen and accept a popup request from the Superuser application when this script executes.

Manual Usage:
This package includes a script called odex.sh to perform the functions with direct user control. To use that script instead
of the one click method do the following:
push the contents of the odex folder to /data/local/tmp on your handset via adb
login to your handset via adb or local terminal
su to root (if required)
chmod 755 /data/local/tmp/odex.sh
execute /data/local/tmp/odex.sh
select your desired action from the menu

thomasskull666
01-17-2011, 01:28 AM
Dude that's sick, nice work!

tanimn
01-17-2011, 02:21 AM
Dude that's sick, nice work!
Thanks.
It would be even sicker if it finished what it's supposed to do. ;)

juryduty
01-17-2011, 06:04 PM
I'm wondering why you would wish to re-odex your files. Please enlighten me.

DreamsForgotten
01-17-2011, 06:44 PM
Me too had the same question

Sent from my SPH-D700 using Tapatalk

tanimn
01-17-2011, 07:46 PM
I'm wondering why you would wish to re-odex your files. Please enlighten me.

The short answer is speed and space.

If the benefits are good enough, I might even build it into my rom to automatically odex modified files on boot...

DreamsForgotten
01-17-2011, 08:03 PM
So themes will work while being odex correct

Sent from my SPH-D700 using Tapatalk

tanimn
01-17-2011, 08:37 PM
So themes will work while being odex correct

Sent from my SPH-D700 using Tapatalk

That's the idea, yes.
Eventually write it into the startup so that if you install a theme, upon reboot the script detects modified files and creates new odex files for them.
Aside from a second reboot after installing the theme, it could be made to be utterly transparent to the user.

DreamsForgotten
01-17-2011, 09:15 PM
so I'm taking it we would have to run a deodex script, theme, then reboot and the theme is there optimized and re odexed. Next question is there anything I can help with with my limited knowledge

Sent from my SPH-D700 using Tapatalk

mysteryemotionz
01-17-2011, 10:19 PM
This found promising as I notice a 10% performance and stability with a odexed rom

Sent From Da Hood.

rjmjr69
01-17-2011, 10:51 PM
This would be amazing to release for chefs etc. Awesome work. What's left to do? Can we wrap this into our rot app etc? Get that all in 1 app really created. Someone to work on the gui

tanimn
01-18-2011, 02:17 AM
so I'm taking it we would have to run a deodex script, theme, then reboot and the theme is there optimized and re odexed. Next question is there anything I can help with with my limited knowledge
Shouldn't have to deodex first, unless something depends on processing a classes.dex ..?
Setup as a boot script it would check file dates and re-odex anything changed, then hopefully reboot before the handset freaks out about having the wrong odex files.


This would be amazing to release for chefs etc. Awesome work. What's left to do? Can we wrap this into our rot app etc? Get that all in 1 app really created. Someone to work on the gui
We still need a working dexopt-wrapper. I've tried 2 and the odex files don't work, at least for the jars. Zipaligning was only indicated for the apks, but I'll try it with the jars and see what happens.
Before I make it into a boot script I want it to work consistently. I'm not gonna be the butt of anyone's boot-loop jokes. ;)

Writing the logic for file date comparison and removing the interaction should be all it takes to turn it into a boot script. I would probably want to keep a store of old files in case of a problem with a theme or file change. Hopefully I've kept it simple enough to run at that level, although it might have to deal with some manual mounts. The kernel would have to support boot scripts, as well, so it might not be something for our root tool to handle.

DreamsForgotten
01-18-2011, 12:26 PM
Shouldn't have to deodex first, unless something depends on processing a classes.dex ..?


A lot of them do vanilla lock screen, status bar date and some system colors, power down options. More and more edits are happening in android.policy.jar and services.jar but theoretically we could just add a deodex just to flash those edits. Well that depends too deodexing is done from recovery if you do it actually on the phone the boot that follows would reodex it


Sent from my SPH-D700 using Tapatalk

tanimn
01-18-2011, 05:14 PM
Shouldn't have to deodex first, unless something depends on processing a classes.dex ..?

A lot of them do vanilla lock screen, status bar date and some system colors, power down options. More and more edits are happening in android.policy.jar and services.jar but theoretically we could just add a deodex just to flash those edits. Well that depends too deodexing is done from recovery if you do it actually on the phone the boot that follows would reodex it


But don't themes just replace those files when they are flashed? I've never seen one fail because it found the wrong base file or couldn't patch it, they fail when the flashed file doesn't play nice with the existing system...
And yes, if you somehow manage to modify those files in recovery (instead of just replacing) , the change would register on the next boot and be processed.

DreamsForgotten
01-18-2011, 11:03 PM
if the system is odexed, I flash a services.jar file that has classes.dex Inside, on the odexed phone the classes.dex is inside Services.odex. I'm not doubting you its obvious you have way more knowledge than me, I'm just trying to understand I hope I'm not coming off wrong!


From what I understand we could pull our framework res out a stock phone and make image edits but the xml would be referenced in the framework-res.odex so we can't edit them. Also we can't edit services or policy.jar and that's the main need to deodex to begin with. That's what I'm saying gets me confused if the phone is re odexed on boot

Sent from my SPH-D700 using Tapatalk

tanimn
01-19-2011, 12:48 AM
if the system is odexed, I flash a services.jar file that has classes.dex Inside, on the odexed phone the classes.dex is inside Services.odex. I'm not doubting you its obvious you have way more knowledge than me, I'm just trying to understand I hope I'm not coming off wrong!
Not at all. It's just that theming isn't something I've really dug into yet. I'M the one trying to make sure I understand right, since I still can't even build a working dexopt-wrapper. :x

As a boot script the idea is that it runs on boot and checks all the framework and system app files for mismatched dates, indicating a modification. If it detects a modification, it then odexes the new file and puts the odex and the classes.dex-less file in place. In the meantime the phone is screaming about mismatched odex files and probably headed for a reboot anyways. Upon reboot, the odex is in place and it boots normally.

I intend to add in storage for working files so that if somehow it breaks the system in the process it can revert back automatically. I've seen this work on other phones without all the precaution, but this IS a samsung device...



From what I understand we could pull our framework res out a stock phone and make image edits but the xml would be referenced in the framework-res.odex so we can't edit them. Also we can't edit services or policy.jar and that's the main need to deodex to begin with. That's what I'm saying gets me confused if the phone is re odexed on boot

I'm presuming themers will still work with deodexed files. The only difficulty this presents is if you want to 'borrow' a theme that has been odexed, you have to deodex it yourself. Once. Then you make your edits, push it up, and the phone odexes it there. Not quite there yet? Edit the deodexed file, rinse and repeat...

Am I starting to make some sense? ;)

DreamsForgotten
01-19-2011, 02:03 AM
Yeah you are Im definitely on board

Sent from my SPH-D700 using Tapatalk

tanimn
01-20-2011, 05:02 AM
So as it stands, I've tried 3 different versions of dexopt-wrapper with the following results:


D/AndroidRuntime( 2475): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
D/AndroidRuntime( 2475): CheckJNI is OFF
D/dalvikvm( 2475): creating instr width table
I/dalvikvm( 2475): DexOpt: mismatch dep name: '/system/framework/core.odex' vs.
'/data/dalvik-cache/system@framework@core.jar@classes.dex'
E/dalvikvm( 2475): /system/framework/ext.jar odex has stale dependencies
I/dalvikvm( 2475): Zip is good, but no classes.dex inside, and no valid .odex fi
le in the same directory
D/dalvikvm( 2475): Unable to process classpath element '/system/framework/ext.ja
r'
I/dalvikvm( 2475): DexOpt: mismatch dep name: '/system/framework/core.odex' vs.
'/data/dalvik-cache/system@framework@core.jar@classes.dex'
E/dalvikvm( 2475): /system/framework/framework.jar odex has stale dependencies
I/dalvikvm( 2475): Zip is good, but no classes.dex inside, and no valid .odex fi
le in the same directory
D/dalvikvm( 2475): Unable to process classpath element '/system/framework/framew
ork.jar'
I/dalvikvm( 2475): DexOpt: mismatch dep name: '/system/framework/core.odex' vs.
'/data/dalvik-cache/system@framework@core.jar@classes.dex'
E/dalvikvm( 2475): /system/framework/android.policy.jar odex has stale dependenc
ies
I/dalvikvm( 2475): Zip is good, but no classes.dex inside, and no valid .odex fi
le in the same directory
D/dalvikvm( 2475): Unable to process classpath element '/system/framework/androi
d.policy.jar'
I/dalvikvm( 2475): DexOpt: mismatch dep name: '/system/framework/core.odex' vs.
'/data/dalvik-cache/system@framework@core.jar@classes.dex'
E/dalvikvm( 2475): /system/framework/services.jar odex has stale dependencies
I/dalvikvm( 2475): Zip is good, but no classes.dex inside, and no valid .odex fi
le in the same directory
D/dalvikvm( 2475): Unable to process classpath element '/system/framework/servic
es.jar'
D/AndroidRuntime( 2475): --- registering native functions ---
I've tried building from cm6 source, building from aosp source, and precompiled ( http://forum.xda-developers.com/showpost.php?p=3864655&postcount=36 ). All appear to output perfectly good odex files, as per comparison with the dalvik-cache, but the system acts like they're not there.

I've considered signatures, as suggested here http://forum.xda-developers.com/showpost.php?p=8090714&postcount=1 , but then what signature should it be matching?

I'm probably missing something stupidly simple, but I could use a fresh set of eyes to help me out here.

DreamsForgotten
01-20-2011, 11:14 AM
http://www.droidforums.net/forum/members/4542.html

This is xeudoxus's user profile, he makes GUI scripts for deodexing Droid phones, but adjust his script for anyone who sends in a framework to work on their phones as well. He's very helpful and usually willing. I'm sure if you make contact and explain what's going on he can shed some light!

http://www.mydroidworld.com/forums/droi ... 1-2-a.html (http://www.mydroidworld.com/forums/droid-roms/867-app-script-xultimate-v1-1-2-a.html)
Check this link out for what he created. It has an option to redex the phone as well.

tanimn
01-21-2011, 05:55 AM
WOOT!

Figured out the problem. Apparently the files need to be odexed in place, at least in the partition that they will run on, or else something doesn't line up right. I was getting totally confused because the generated odex files were matching what was in dalvik-cache, but I was creating them on /data and not /system. These files didn't work right. Creating them in /system didn't match what was in dalvik-cache but they did work.

This version of the script will odex a deodexed rom while backing up the deodexed source files, or restore those files when needed. Don't blame me if you don't nandroid and something goes wrong, but I've been back and forth a dozen times now with no problems.

Push all files to /data/local/tmp, chmod 755 odex.sh and execute as root.

I can confirm about a 15% faster boot with odexed vs deodexed (42s vs 49s cold to lockscreen on my setup). Beyond that, feel free to clock your apps and let me know.

http://dl.dropbox.com/u/17599767/epic-odex_v0.7.zip

Take it out, kick it around, and get back to me.

tanimn
01-21-2011, 05:57 AM
http://www.droidforums.net/forum/members/4542.html

This is xeudoxus's user profile, he makes GUI scripts for deodexing Droid phones, but adjust his script for anyone who sends in a framework to work on their phones as well. He's very helpful and usually willing. I'm sure if you make contact and explain what's going on he can shed some light!

http://www.mydroidworld.com/forums/droi ... 1-2-a.html (http://www.mydroidworld.com/forums/droid-roms/867-app-script-xultimate-v1-1-2-a.html)
Check this link out for what he created. It has an option to redex the phone as well.

Thanks for the reference, but my pride got in the way and I figured it out before I could email him. ;)

mysteryemotionz
01-21-2011, 11:08 AM
WOOT!

Figured out the problem. Apparently the files need to be odexed in place, at least in the partition that they will run on, or else something doesn't line up right. I was getting totally confused because the generated odex files were matching what was in dalvik-cache, but I was creating them on /data and not /system. These files didn't work right. Creating them in /system didn't match what was in dalvik-cache but they did work.

This version of the script will odex a deodexed rom while backing up the deodexed source files, or restore those files when needed. Don't blame me if you don't nandroid and something goes wrong, but I've been back and forth a dozen times now with no problems.

Push all files to /data/local/tmp, chmod 755 odex.sh and execute as root.

I can confirm about a 15% faster boot with odexed vs deodexed (42s vs 49s cold to lockscreen on my setup). Beyond that, feel free to clock your apps and let me know.

http&#58;//dl&#46;dropbox&#46;com/u/17599767/epic-odex_v0&#46;7&#46;zip

Take it out, kick it around, and get back to me.

When I get home I'll give this a run
Sent From Da Hood.

DreamsForgotten
01-21-2011, 04:02 PM
I'm flashing themes left and right so my only question is once I run it what's the procedure to flash the themes while I'm odexex or how do I revert just to flash a theme

Sent from my SPH-D700 using Tapatalk

tanimn
01-21-2011, 09:58 PM
I'm flashing themes left and right so my only question is once I run it what's the procedure to flash the themes while I'm odexex or how do I revert just to flash a theme
The script stores the deodexed files on the sdcard, so just run it again and restore the files. I actually wanted it to reboot recovery when doing that, but with the current disarray in filesystem types and recovery versions I decided to just make it a normal reboot.

Alternatively, using cwm to selectively restore /system from a deodexed backup will work if you lost or deleted those files. I could get really crazy on the pc side and have all the files piped back there for storage and retrieval, but the package as it stands right now can be run completely from the handset, and that would add an immense amount of time to process.

That doesn't mean that tonight I won't be wasting my time writing pc side adb loaders for this, but my goal is something that can be baked into a rom or kernel and be completely automated beyond perhaps being enabled or disabled by the user...

So how about it? Is ACS up to releasing a one-click odexer this weekend? ;)

DreamsForgotten
01-21-2011, 10:12 PM
Amazing dude, great work.

Sent from my SPH-D700 using Tapatalk

rjmjr69
01-21-2011, 11:49 PM
I think ACS really could use this being released asap... amazing work bro as usual. Thank you so much for the hard work and time. The team could use a bit of a boost on the forums right aout now so awesome timing you re the man.....
Got a little birdie on my shoulder saying froyo end of next week ota

k0nane
01-23-2011, 12:01 AM
Got a little birdie on my shoulder saying froyo end of next week ota

Why didn't I hear about this yet? ;)

mysteryemotionz
01-23-2011, 12:44 AM
Got a little birdie on my shoulder saying froyo end of next week ota

Why didn't I hear about this yet? ;)

Wow I knew something before you

Sent From Da Hood.

tanimn
01-23-2011, 08:15 AM
OK. Here's the whole kit and kaboodle.
I need proof-reading, suggestions, help with the release blurb, and maybe some suckers, er testers, to try it out. ;) It's ready to go! Please get back to me ASAP. We want this released soonest.

With one click it odexes, with another click it restores. How much simpler could it get? :D

http://dl.dropbox.com/u/17599767/OneClickOdexer_v1.0.zip

All readable files for proofing:

README.TXT:

README.TXT

OneClickOdexer v1.0 - Linux/Mac/Windows package
by Kim Middleton ( tanimn _@_ WWW.hotmail.com )
for ACS ( Android Creative Syndicate )

Exclusively for use on Samsung Epic 4G handsets.
Based on work by Paul O'Brien @ www.MoDaCo.com
Thanks to raiderep, joeykrim, skeeterslint, rjmjr69, and ACS.

PREREQUISITES:

USB Cable.
Correctly installed and configured drivers for your handset.
Root permissions on your handset.
A NANDROID BACKUP!!!


DETAILS:

OneClickOdexer is an odexing and restoral tool for deodexed roms. It will determine if it has been previously run
and automatically odex your rom or restore it to a deodexed state. If a critical error occurs, it will return
your phone to it's previous state. Care has been taken to only odex apps that come stock with an odex file.

With one click, it odexes.
With one click, it restores.

PROS:

Increases speed by about 15%
Reduces memory usage
More space available on /data
Reduced use of dalvik-cache

CONS:

Might need to re-add some widgets and home screen icons
Need to restore your deodexed system to make any theme swaps (But that's just one click away...)

ERRATA:

Backups:
Please perform a nandroid backup before making any major modifications to your handset's software.
Modifications such as changing how the dalvik virtual machine functions in your phone can sometimes prove unpredictable...

Mounting the SD Card:
Do NOT have the sd card mounted to the PC when attempting to run this script.
Do NOT attempt to run this script while your handset is scanning media.

/sdcard/odex:
Do not touch the /sdcard/odex folder unless you intend to flash a new rom or restore from nandroid backup.
If you swap sdcards please make sure to have the correct one inserted when attempting to restore.

Root:
You may have to unlock your screen and accept a popup request from the Superuser application when this script executes.

Manual Usage:
This package includes a script called odex.sh to perform the functions with direct user control. To use that script instead
of the one click method do the following:
push the contents of the odex folder to /data/local/tmp on your handset via adb
login to your handset via adb or local terminal
su to root (if required)
chmod 755 /data/local/tmp/odex.sh
execute /data/local/tmp/odex.sh
select your desired action from the menu
OneClickOdexer.cmd:

:::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::
::
:: OneClickOdexer.cmd v0.5
::
:: <CREDITS>
::
:: Thanks to those who's work led the way here:
:: joeykrim for root
:: skeeterslint for busybox
:: raiderep for the idea
:: Based on work by Paul O'Brien @ www.MoDaCo.com
::
:: OneClickOdexer Windows script by tanimn ( tanimn_@_hotmail_._com )
::
:: <DESCRIPTION>
::
:: Script package to odex or restore /system/framework and /system/app
:: on Samsung Epic 4g via adb. NANDROID BACKUP BEFORE USE!!!
:: Verified on DK28. Consider experimental for any other firmware.
::
:: <REQUIREMENTS>
::
:: This windows script REQUIRES the following files present in the indicated folders:
:: .\
:: OneClickOdexer.cmd
:: .\etc\
:: load.txt
:: .\odex\
:: busybox / dexopt_wrapper / OdexOne.sh / zip / zipalign
:: .\adb\
:: adb.exe / AdbWinApi.dll / AdbWinUsbApi.dll
::
@echo off

:Variables

set adb=.\adb\adb.exe

:Begin
:: Check for device
echo One Click Odexer / Restoral Tool
echo Please Wait...
call :Check DeviceCheck > nul
call :Run
goto Clean


:Check
if [%Loop%]==[] (set /A Loop=0)
:: Cycle adb
if [%Loop%]==[0] (
%adb% kill-server
%adb% start-server
call :Sleep 3
)
:: Check for attached device
for /F "tokens=1 usebackq" %%i in (`%adb% get-state`) do call :CheckGo %%i %1
goto END

:CheckGo
if /I %Loop% GEQ 5 (set /A Loop=0 && set Break=%2 && goto NoDev)
if [%1]==[device] (set /A Loop=0 && goto END)
set /A Loop=Loop+1
call :Sleep 5
call :Check %2
set /A Loop=0
goto END


:Run
if not [%Break%]==[] (goto END)
%adb% push odex\OdexOne.sh /data/local/tmp/OdexOne.sh
%adb% push odex\busybox /data/local/tmp/busybox
%adb% push odex\dexopt_wrapper /data/local/tmp/dexopt_wrapper
%adb% push odex\zip /data/local/tmp/zip
%adb% push odex\zipalign /data/local/tmp/zipalign
%adb% shell chmod 755 /data/local/tmp/OdexOne.sh
cls
%adb% shell < .\etc\load.txt
goto END

:NoDev
cls
echo.
echo Your device was not properly detected! Please make sure that debugging is enabled on your
echo handset, and that the proper drivers are installed and working on your host pc.
echo Please make a note of the function below.
echo After resolving the issue, please attempt to run this script again.
echo.
echo Processing stopped in function %Break%.
goto END

:Sleep
ping -n %1 localhost > nul
goto END

:Clean
set adb=
set /A Loop=
set Break=
echo Processing completed. Please wait for your phone to reboot or rerun if it doesnt.
call :Sleep 10
:END
OneClickOdexer.sh:

#!/bin/sh
################################################## #####################################
################################################## #####################################
##
## OneClickOdexer.sh v0.3
##
## <CREDITS>
##
## Thanks to those who's work led the way here:
## joeykrim for root
## skeeterslint for busybox
## raiderep for the idea
## Based on work by Paul O'Brien @ www.MoDaCo.com
##
## OneClickOdexer linux/unix script by tanimn ( tanimn_@_hotmail_._com )
## A very primitive loader for linux/unix users who still want 1 click use.
## Normal use is to upload the contents of ./odex to /data/local/tmp on your
## handset and execute odex.sh from there as root.
##
## <DESCRIPTION>
##
## Script package to odex or restore /system/framework and /system/app
## on Samsung Epic 4g via adb. NANDROID BACKUP BEFORE USE!!!
## Verified on DK28. Consider experimental for any other firmware.
##
## <REQUIREMENTS>
##
## This Bourne Shell script REQUIRES the following files present in the indicated folders:
## ./
## OneClickOdexer.sh
## ./etc/
## load.txt
## ./odex/
## busybox / dexopt_wrapper / OdexOne.sh / zip / zipalign
## ./adb/
## adb
##

bindir=$(pwd)
adb=$bindir/adb/adb
chmod 755 $adb
$adb kill-server
$adb start-server
$adb get-state
sleep 5
$adb push $bindir/odex/OdexOne.sh /data/local/tmp/OdexOne.sh
$adb push $bindir/odex/busybox /data/local/tmp/busybox
$adb push $bindir/odex/dexopt_wrapper /data/local/tmp/dexopt_wrapper
$adb push $bindir/odex/zip /data/local/tmp/zip
$adb push $bindir/odex/zipalign /data/local/tmp/zipalign
$adb shell chmod 755 /data/local/tmp/OdexOne.sh

$adb shell < $bindir/etc/load.txt
echo
echo "If you see output above indicating permission errors"
echo "then please re-run this script as root."
sleep 9
echo
echo "If the script stalls but does not reboot, please rerun."
exit 0;
OdexOne.sh:

#!/system/bin/sh
# Based on work by Paul O'Brien @ www.MoDaCo.com
# experimental - nandroid backup before you run this script!
# gutted for parts by Kim Middleton tanimn_@_hotmail_._com January 2011 for SPH-D700
# Version 1.0

# check for proper working environment
bindir=/data/local/tmp
outdir=/sdcard/odex
dcache=/data/dalvik-cache
go=`id | grep "uid=0"`
cd $bindir
chmod 755 busybox


$bindir/busybox test ! "$go" &&\
echo "We do NOT have Root. This script will not proceed." &&\
echo "This may be a transient error. Please close this window and unlock your phone." &&\
echo "Attempt to run this script again and watch for a Superuser request popup on" &&\
echo "your handset. If you see no popup and continue to receive this message, please" &&\
echo "verify that you have persistent root available on your handset." &&\
echo &&\
echo "This script will now exit." &&\
exit 1 ||\
echo "We have Root. Proceeding...";

# mount system as rw here in case busybox install needed.
mount -o remount,rw /dev/block/stl9 /system

# Check for full package
for filename in OdexOne.sh dexopt_wrapper busybox zip zipalign
do
$bindir/busybox test ! -f $bindir/$filename &&\
echo "$filename is required but not found in $bindir" &&\
exit 1 ||\
chmod 4755 $bindir/$filename
done

# check for busybox and install it if not present
$bindir/busybox test ! -f /system/bin/busybox &&\
echo "BusyBox not yet installed. Correcting now..." &&\
$bindir/busybox --install -s /system/bin &&\
sync;

# check for native binaries
for filename in busybox zip zipalign dexopt dexopt_wrapper
do
if [ -f /system/bin/$filename ]
then
eval $filename="/system/bin/$filename"
else
eval $filename="$bindir/$filename"
fi
done

# create output folder on sd-card
if [ ! -d $outdir ]
then
mkdir $outdir
fi

# functions

godex()
{
# change to system/framework and process EVERY jar IN ORDER OF $BOOTCLASSPATH!
cd /system/framework
indir=$(pwd)

for filename in core.jar ext.jar framework.jar android.policy.jar services.jar *.jar
do
name=${filename%.jar}
if [ ! -f $outdir/$name.odex ]
then
cp $filename $outdir/$filename
$dexopt_wrapper $filename $name.odex $BOOTCLASSPATH
if [ $? -eq 0 ]
then
$zip -d $filename classes.dex
cp $name.odex $outdir/$name.odex
rm $dcache/system@framework@${filename}@classes.dex
echo "$filename processed successfully."
echo
else
rm *.odex
cp $outdir/*.jar $indir/
rm $outdir/*
echo "Framework file $filename failled. Cannot Complete."
echo "System has been restored. Please reboot now."
exit 1;
fi
fi
done

cd /system/app
indir=$(pwd)

# Process apks from system/app that are normally odexed
for filename in AccountAndSyncSettings.apk ApplicationsProvider.apk AxT9IME.apk BadgeProvider.apk BluetoothOPP.apk \
BluetoothServices.apk BluetoothTestMode.apk Brightness.apk Browser.apk BuddiesNow.apk CalendarProvider.apk \
CallSetting.apk CameraFirmware.apk Camera.apk CertInstaller.apk ClockPackage.apk Contacts.apk ContactsProvider.apk \
DataCreate.apk DefaultContainerService.apk DeviceManagement.apk DialerTabActivity.apk Divx.apk Dlna.apk \
DownloadProvider.apk DrmUA.apk Dun.apk Email.apk FactoryTest.apk Gallery3D.apk GoogleBackupTransport.apk \
HiddenMenu.apk HTMLViewer.apk InputEventApp.apk JobManager.apk KeyBoardSlideUpCounter.apk Keytracer.apk \
LatinIME.apk Launcher2.apk lcdtest.apk LiveWallpapers.apk LiveWallpapersPicker.apk LogsProvider.apk \
MediaProvider.apk Memo.apk Mms.apk MusicPlayer.apk MyFiles.apk NetworkLocation.apk PackageInstaller.apk \
PhoneCrashNotifier.apk PhoneErrService.apk PhoneInfo.apk Phone.apk PicoTts.apk Preconfig.apk Protips.apk \
SamsungWidget_CalendarClock.apk SamsungWidget_FeedAndUpdate.apk SamsungWidget_ProgramMonitor.apk \
SamsungWidget_StockClock.apk SamsungWidget_WeatherClock.apk ScreenCaptureService.apk SecDownloadProvider.apk \
SecurityProvider.apk SelectiveReset.apk SelfTestMode.apk serviceModeApp.apk Settings.apk SettingsProvider.apk \
shutdown.apk SimDetachNotifier.apk SisoDrmProvider.apk SlateTest.apk SnsAccount.apk SnsProvider.apk SoundPlayer.apk \
SoundRecorder.apk TelephonyProvider.apk TouchWiz30Launcher.apk TouchWizCalculator.apk TouchWizCalendar.apk \
TtsService.apk UserDictionaryProvider.apk VideoPlayer.apk VoiceDialer.apk VoiceRecorder.apk VpnServices.apk WlanTest.apk
do
name=${filename%.apk}
if [ ! -f $outdir/$name.odex ]
then
cp $filename $outdir/$filename
$dexopt_wrapper $filename $name.odex $BOOTCLASSPATH
if [ $? -eq 0 ]
then
$zip -d $filename classes.dex
cp $name.odex $outdir/$name.odex
rm $dcache/system@app@${filename}@classes.dex
echo "$filename processed successfully."
echo
else
rm $indir/$name.odex
rm $outdir/$filename
echo "$filename NOT processed successfully. NOT a fatal Error."
echo
fi
fi
done

sleep 3
sync
reboot now
exit 0;
}

restore()
{
# change to backup dir and restore EVERY jar IN ORDER OF $BOOTCLASSPATH!
cd /system/framework
indir=$(pwd)
for filename in core.jar ext.jar framework.jar android.policy.jar services.jar *.jar
do
name=${filename%.jar}
cd $outdir
if [ -f $outdir/$name.odex ]
then
cp $filename $indir/$filename
rm $filename
rm $name.odex
cd $indir
rm $name.odex
echo "$filename restored successfully."
fi
cd $indir
done

# change to backup dir and restore all odexed apk files.
cd /system/app
indir=$(pwd)
cd $outdir
for filename in *.apk
do
name=${filename%.apk}
cd $outdir
if [ -f $outdir/$name.odex ]
then
cp $filename $indir/$filename
rm $filename
rm $name.odex
cd $indir
rm $name.odex
echo "$filename restored successfully."
fi
cd $outdir
done

sleep 3
sync
reboot now
exit 0;
}

todex()
{
# change to system/framework and process EVERY jar IN ORDER OF $BOOTCLASSPATH!
cd /system/framework
indir=$(pwd)

for filename in core.jar ext.jar framework.jar android.policy.jar services.jar *.jar
do
name=${filename%.jar}
if [ ! -f $outdir/$name.odex ]
then
echo "$outdir/$name.odex does not exist."
fi
done

cd /system/app
indir=$(pwd)

for filename in AccountAndSyncSettings.apk ApplicationsProvider.apk AxT9IME.apk BadgeProvider.apk BluetoothOPP.apk \
BluetoothServices.apk BluetoothTestMode.apk Brightness.apk Browser.apk BuddiesNow.apk CalendarProvider.apk \
CallSetting.apk CameraFirmware.apk Camera.apk CertInstaller.apk ClockPackage.apk Contacts.apk ContactsProvider.apk \
DataCreate.apk DefaultContainerService.apk DeviceManagement.apk DialerTabActivity.apk Divx.apk Dlna.apk \
DownloadProvider.apk DrmUA.apk Dun.apk Email.apk FactoryTest.apk Gallery3D.apk GoogleBackupTransport.apk \
HiddenMenu.apk HTMLViewer.apk InputEventApp.apk JobManager.apk KeyBoardSlideUpCounter.apk Keytracer.apk \
LatinIME.apk Launcher2.apk lcdtest.apk LiveWallpapers.apk LiveWallpapersPicker.apk LogsProvider.apk \
MediaProvider.apk Memo.apk Mms.apk MusicPlayer.apk MyFiles.apk NetworkLocation.apk PackageInstaller.apk \
PhoneCrashNotifier.apk PhoneErrService.apk PhoneInfo.apk Phone.apk PicoTts.apk Preconfig.apk Protips.apk \
SamsungWidget_CalendarClock.apk SamsungWidget_FeedAndUpdate.apk SamsungWidget_ProgramMonitor.apk \
SamsungWidget_StockClock.apk SamsungWidget_WeatherClock.apk ScreenCaptureService.apk SecDownloadProvider.apk \
SecurityProvider.apk SelectiveReset.apk SelfTestMode.apk serviceModeApp.apk Settings.apk SettingsProvider.apk \
shutdown.apk SimDetachNotifier.apk SisoDrmProvider.apk SlateTest.apk SnsAccount.apk SnsProvider.apk SoundPlayer.apk \
SoundRecorder.apk TelephonyProvider.apk TouchWiz30Launcher.apk TouchWizCalculator.apk TouchWizCalendar.apk \
TtsService.apk UserDictionaryProvider.apk VideoPlayer.apk VoiceDialer.apk VoiceRecorder.apk VpnServices.apk WlanTest.apk
do
name=${filename%.apk}
if [ ! -f $outdir/$name.odex ]
then
echo "$filename and $name.odex do not exist in $outdir."
fi
done
echo "Would normally reboot here."
sleep 3
sync
exit 0;
}

testore()
{
# change to backup dir and restore EVERY jar IN ORDER OF $BOOTCLASSPATH!
cd /system/framework
indir=$(pwd)
for filename in core.jar ext.jar framework.jar android.policy.jar services.jar *.jar
do
name=${filename%.jar}
cd $outdir
if [ -f $outdir/$name.odex ]
then
echo "$filename would be restored successfully."
fi
cd $indir
done

# change to backup dir and restore all odexed apk files.
cd /system/app
indir=$(pwd)
cd $outdir
for filename in *.apk
do
name=${filename%.apk}
cd $outdir
if [ -f $outdir/$name.odex ]
then
echo "$filename would be restored successfully."
fi
cd $outdir
done
echo "Would normally reboot here."
sleep 3
sync
exit 0;
}


checkstate()
{
# Are we odexing or restoring or what?
cd /system/framework
indir=$(pwd)

for filename in core.jar ext.jar framework.jar android.policy.jar services.jar *.jar
do
name=${filename%.jar}
if [ ! -f $outdir/$name.odex ]
then
if [ ! "$State" = "deodexed" ]
then
# todex
godex
exit 0;
fi
State="deodexed"
else
if [ ! "$State" = "odexed" ]
then
echo "Something went badly wrong. This script detected a deodexed system,"
echo "but has detected an odex file for $filename. Please restore a working"
echo "system from a nandroid backup and deodex BEFORE applying any new theme"
echo "elements. This script will now exit with no action taken."
echo "State $State Filename $filename"
exit 1;
fi
State="odexed"
fi
done
}

echo "This script odexes /system/framework and /system/app for improved performance"
echo "or restores the original deodexed versions for modification purposes."
echo
echo "HIT CTRL-C NOW TO ABORT! DO NOT STOP THIS SCRIPT IN PROGRESS!"
echo
echo "Every effort has been taken to ensure a safe transition, however lack of a"
echo "recent nandroid backup does not absolve you of the responsibility inherent in"
echo "executing this script. Executing this script does, however, absolve anybody"
echo "else, including me, of any responsibility towards your handset or the state thereof."
echo
echo "ON YOUR OWN HEAD BE IT..."
echo
if [ -f $outdir/core.odex ]
then
State="odexed"
echo "System is currently $State. Will Commence restoring to original."
else
State="deodexed"
echo "System is currently $State. Will Commence Optimizing."
fi
echo
sleep 6
echo "SO MOTE IT BE..."
echo
sleep 4

checkstate
if [ "$State" = "odexed" ]
then
restore
# testore
elif [ "$State" = "deodexed" ]
then
godex
# todex
else
echo "Nothing to do."
exit 0;
fi
echo "Should not see. Rebooting now."
exit 0;
odex.sh:

#!/system/bin/sh
# Based on work by Paul O'Brien @ www.MoDaCo.com
# experimental - nandroid backup before you run this script!
# gutted for parts by Kim Middleton tanimn @ hotmail.com January 2011 for SPH-D700
# Version 0.7.1

# check for proper working environment
bindir=/data/local/tmp
outdir=/sdcard/odex
dcache=/data/dalvik-cache

cd $bindir
chmod 755 busybox

# mount system as rw here in case busybox install needed.
mount -o remount,rw /dev/block/stl9 /system

# Check for full package
for filename in odex.sh dexopt_wrapper busybox zip zipalign
do
$bindir/busybox test ! -f $bindir/$filename &&\
echo "$filename is required but not found in $bindir" &&\
exit 1 ||\
chmod 4755 $bindir/$filename;
done

# check for busybox and install it if not present
$bindir/busybox test ! -f /system/bin/busybox &&\
echo "BusyBox not yet installed. Correcting now..." &&\
$bindir/busybox --install -s /system/bin &&\
sync;

# check for native binaries
for filename in busybox zip zipalign dexopt dexopt_wrapper
do
if [ -f /system/bin/$filename ]
then
eval $filename="/system/bin/$filename"
else
eval $filename="$bindir/$filename"
fi
done

# create output folder on sd-card
if [ ! -d $outdir ]
then
mkdir $outdir;
fi

# functions for menu
godex()
{
# change to system/framework and process EVERY jar IN ORDER OF $BOOTCLASSPATH!
cd /system/framework
indir=$(pwd)

for filename in core.jar ext.jar framework.jar android.policy.jar services.jar *.jar
do
name=${filename%.jar}
if [ ! -f $outdir/$name.odex ]
then
cp $filename $outdir/$filename
$dexopt_wrapper $filename $name.odex $BOOTCLASSPATH
if [ $? -eq 0 ]
then
$zip -d $filename classes.dex
cp $name.odex $outdir/$name.odex
rm $dcache/system@framework@${filename}@classes.dex
echo "$filename processed successfully."
echo
else
rm *.odex
cp $outdir/*.jar $indir/
rm $outdir/*
echo "Framework file $filename failled. Cannot Complete."
echo "System has been restored. Please reboot now."
exit 1;
fi
fi
done

cd /system/app
indir=$(pwd)

# Process apks from system/app that are normally odexed
for filename in AccountAndSyncSettings.apk ApplicationsProvider.apk AxT9IME.apk BadgeProvider.apk BluetoothOPP.apk \
BluetoothServices.apk BluetoothTestMode.apk Brightness.apk Browser.apk BuddiesNow.apk CalendarProvider.apk \
CallSetting.apk CameraFirmware.apk Camera.apk CertInstaller.apk ClockPackage.apk Contacts.apk ContactsProvider.apk \
DataCreate.apk DefaultContainerService.apk DeviceManagement.apk DialerTabActivity.apk Divx.apk Dlna.apk \
DownloadProvider.apk DrmUA.apk Dun.apk Email.apk FactoryTest.apk Gallery3D.apk GoogleBackupTransport.apk \
HiddenMenu.apk HTMLViewer.apk InputEventApp.apk JobManager.apk KeyBoardSlideUpCounter.apk Keytracer.apk \
LatinIME.apk Launcher2.apk lcdtest.apk LiveWallpapers.apk LiveWallpapersPicker.apk LogsProvider.apk \
MediaProvider.apk Memo.apk Mms.apk MusicPlayer.apk MyFiles.apk NetworkLocation.apk PackageInstaller.apk \
PhoneCrashNotifier.apk PhoneErrService.apk PhoneInfo.apk Phone.apk PicoTts.apk Preconfig.apk Protips.apk \
SamsungWidget_CalendarClock.apk SamsungWidget_FeedAndUpdate.apk SamsungWidget_ProgramMonitor.apk \
SamsungWidget_StockClock.apk SamsungWidget_WeatherClock.apk ScreenCaptureService.apk SecDownloadProvider.apk \
SecurityProvider.apk SelectiveReset.apk SelfTestMode.apk serviceModeApp.apk Settings.apk SettingsProvider.apk \
shutdown.apk SimDetachNotifier.apk SisoDrmProvider.apk SlateTest.apk SnsAccount.apk SnsProvider.apk SoundPlayer.apk \
SoundRecorder.apk TelephonyProvider.apk TouchWiz30Launcher.apk TouchWizCalculator.apk TouchWizCalendar.apk \
TtsService.apk UserDictionaryProvider.apk VideoPlayer.apk VoiceDialer.apk VoiceRecorder.apk VpnServices.apk WlanTest.apk
do
name=${filename%.apk}
if [ ! -f $outdir/$name.odex ]
then
cp $filename $outdir/$filename
$dexopt_wrapper $filename $name.odex $BOOTCLASSPATH
if [ $? -eq 0 ]
then
$zip -d $filename classes.dex
cp $name.odex $outdir/$name.odex
rm $dcache/system@app@${filename}@classes.dex
echo "$filename processed successfully."
echo
else
rm $indir/$name.odex
rm $outdir/$filename
echo "$filename NOT processed successfully. NOT a fatal Error."
echo
fi
fi
done

sleep 3
sync
reboot now
exit 0;
}

restore()
{
# change to backup dir and restore EVERY jar IN ORDER OF $BOOTCLASSPATH!
cd /system/framework
indir=$(pwd)
for filename in core.jar ext.jar framework.jar android.policy.jar services.jar *.jar
do
name=${filename%.jar}
cd $outdir
if [ -f $outdir/$name.odex ]
then
cp $filename $indir/$filename
rm $filename
rm $name.odex
cd $indir
rm $name.odex
echo "$filename restored successfully."
fi
cd $indir
done

# change to backup dir and restore all odexed apk files.
cd /system/app
indir=$(pwd)
cd $outdir
for filename in *.apk
do
name=${filename%.apk}
cd $outdir
if [ -f $outdir/$name.odex ]
then
cp $filename $indir/$filename
rm $filename
rm $name.odex
cd $indir
rm $name.odex
echo "$filename restored successfully."
fi
cd $outdir
done

sleep 3
sync
reboot now
exit 0;
}


clean()
{
echo "Only continue if you have attempted to odex and failled or if you intend to"
echo "flash a new rom before modifying system files. This will remove your deodexed"
echo "backups from your sd card and prevent you from restoring your system through"
echo "this script. Press (Y)es to clean files, or any other key to exit."
goclean=""
read -p " " goclean
case $goclean in
[yY]*) rm -r $outdir && exit 0;;
*) exit 0;
esac
}

echo "This script odexes /system/framework and /system/app for improved performance"
echo "or restores the original deodexed versions for modification purposes."
echo
echo "Every effort has been taken to ensure a safe transition, however lack of a"
echo "recent nandroid backup does not absolve you of the responsibility inherent in"
echo "executing this script. Continuing to execute this script, however does absolve"
echo "me of any responsibility towards your handset or the state thereof."
echo
echo "ON YOUR OWN HEAD BE IT..."
echo
echo "Would you like to (O)dex your system, (R)estore your deodexed system,"
echo "(C)lean the odex storage folder for a fresh run, or e(X)it this script."
menu=""
read -p " " menu
case $menu in
[oO]*) godex;;
[rR]*) restore;;
[cC]*) clean;;
*) exit 0;;
esac

k0nane
01-24-2011, 06:30 PM
Out of curiosity: where'd you get 15% from?

tanimn
01-24-2011, 10:00 PM
Out of curiosity: where'd you get 15% from?

Mostly anecdotal evidence from examples on other handsets.
The only direct numbers that I have been able to collect so far are boot times, which are consistently around 15% faster when odexed.

juryduty
01-25-2011, 01:24 AM
Nice job on the release!

mysteryemotionz
01-25-2011, 01:35 AM
The script worked great on bonsia 2.0.0. I noticed a increase in performance across the board. I hope I just remember to de-odex the system when I finish the work up on my theme

Sent From Da Hood.

rjmjr69
01-26-2011, 01:00 AM
Got on the front page of BreifMobile.com which should get picked up by xDA tomorrow

k0nane
01-30-2011, 03:42 AM
There are still a bunch of SyndicateROM 2.1 loyalists - is this Eclair compatible? I could look into it, but I'm lazy.


Can ya make a Ext4 kernel for 2.1 Syndicate or odex this Syndicate so we can use MobileAp with it?I tried odexing it but get Samsung loop.

rjmjr69
01-30-2011, 03:58 AM
We need an updated dk28 rom!!!! Fuck 2.1 users

tanimn
01-30-2011, 04:02 AM
There are still a bunch of SyndicateROM 2.1 loyalists - is this Eclair compatible? I could look into it, but I'm lazy.


Can ya make a Ext4 kernel for 2.1 Syndicate or odex this Syndicate so we can use MobileAp with it?I tried odexing it but get Samsung loop.

It's supposedly run ok on syndicate 2.1, but I have gotten some reports of boot loops and some fc apps that appear to be rom independant.

Here is the beta of the new version that I hope will help alleviate most of those problems:

OneClick Odexer v1.2 Beta (http://dl.dropbox.com/u/17599767/OneClickOdexer_v1.2-BETA.zip)

Nandroid first, as boot loops are a possibility still.
Waiting on enough people to test it out. Feeling lucky? ;)

rjmjr69
01-30-2011, 06:11 AM
testing now if I can figure out how to run it lol

rjmjr69
01-30-2011, 06:23 AM
Bootloop :-( cant get past the samsung screen

got TONS of FC's as it was running.... mostly seemed like the Dialer and Clock

k0nane
01-30-2011, 08:24 AM
Bootloop :-( cant get past the samsung screen

got TONS of FC's as it was running.... mostly seemed like the Dialer and Clock

Thanks for guinea pigging this one, I really didn't want to flash back. ;) Can you grab a logcat?

rjmjr69
01-30-2011, 08:38 AM
Sent to taninm... Can you forward those please Im exhaused and cranky

mysteryemotionz
01-30-2011, 11:42 AM
Tanim can we.push this even further in are update scripts. I'm thinking as a themer is we can run this threw cwm it can check to see if the system is either deodexed or odexed. Once the decision is made it then takes the right costs of action so the theme can be flashed. After the theme is flagged it then re odexes the system.

tanimn
01-30-2011, 06:39 PM
Tanim can we.push this even further in are update scripts. I'm thinking as a themer is we can run this threw cwm it can check to see if the system is either deodexed or odexed. Once the decision is made it then takes the right costs of action so the theme can be flashed. After the theme is flagged it then re odexes the system.

First, I'm not even sure this will run correctly in recovery. Remember that my initial query on this matter had to do with the discrepancy between files odexed on /data/ vs files odexed on /system/ , and how the files were no good unless they were odexed in situ.

I'm HOPING that the process will work in recovery as that will eliminate the chance of interference from user input or random system events, as well as provide data on the possibility of use as a boot script. I'm in the process of putting together a version that should function in cwm, but my primary focus on this project right now is figuring out why the process succeeds sometimes and the results still fail. I'm still waiting on logcats from successful runs that fail to boot, or misbehave otherwise, to figure out what is going on under those circumstances.

Hopefully I just need a small collection of custom BOOTCLASSPATH settings for particular files or something. I'd hate to have to try to code the alchemy involved in deodexing operations...

#INCLUDE <live/chicken.h>
#INCLUDE <tools/machette.h>
#REQUIRE <sacraficial/offering.h>

k0nane
01-31-2011, 02:22 AM
I'd hate to have to try to code the alchemy involved in deodexing operations...

#INCLUDE <live/chicken.h>
#INCLUDE <tools/machette.h>
#REQUIRE <sacraficial/offering.h>

This is about accurate, too. ;)

k0nane
02-14-2011, 01:02 PM
Did you put leprechauns in the sacrificial offering?

I mean, there's got to be some gold in this... because - while I couldn't explain why - odexing improves TASR's gaming scores by 40-80 points. (Or it did. Now they're dropping again. Weird.)

DreamsForgotten
02-14-2011, 01:23 PM
Did you put leprechauns in the sacrificial offering?

I mean, there's got to be some gold in this... because - while I couldn't explain why - odexing improves TASR's gaming scores by 40-80 points. (Or it did. Now they're dropping again. Weird.)

What's TASR?

Sent from my SPH-D700 using Tapatalk

k0nane
02-14-2011, 01:28 PM
Did you put leprechauns in the sacrificial offering?

I mean, there's got to be some gold in this... because - while I couldn't explain why - odexing improves TASR's gaming scores by 40-80 points. (Or it did. Now they're dropping again. Weird.)

What's TASR?

Sent from my SPH-D700 using Tapatalk

"This Ain't SyndicateROM" DK28 - the ROM I'm working on right now. I'll have RC1 pushed to the team probably by tonight.

DreamsForgotten
02-14-2011, 01:52 PM
Nice!

Sent from my SPH-D700 using Tapatalk

theimpaler747
02-14-2011, 05:13 PM
Did you put leprechauns in the sacrificial offering?

I mean, there's got to be some gold in this... because - while I couldn't explain why - odexing improves TASR's gaming scores by 40-80 points. (Or it did. Now they're dropping again. Weird.)

What's TASR?

Sent from my SPH-D700 using Tapatalk

"This Ain't SyndicateROM" DK28 - the ROM I'm working on right now. I'll have RC1 pushed to the team probably by tonight.

Hope so, can't wait for that!

rjmjr69
02-16-2011, 04:16 PM
Hows that coming along?