FORUMS
Remove All Ads from XDA

[HOW TO][Windows] Manually Deodex and Odex back

808 posts
Thanks Meter: 960
 
By sicopat, Senior Member on 8th August 2011, 02:08 PM
Post Reply Email Thread
The purpose of this thread is to give basics to manually deodex and odexing back framework and apk files


Credits and Thanks to :
Quote:

jubeh
Decad3nce
software_samurai
JKay
LeoMar75

and many others I forgot


Theory :
Quote:

WHAT IS AN ODEX FILE?

In Android file system, applications and framework files come in packages with the extension .apk or .jar. These APKs or JARs contain certain .odex files whose supposed function is to save space. These ‘odex’ files are actually collections of parts of an application that are optimized before booting. Doing so speeds up the boot process, as it preloads part of an application. On the other hand, it also makes hacking those applications difficult because a part of the coding has already been extracted to another location before execution.

THEN COMES DEODEX

Deodexing is basically repackaging of these APKs or JARs in a certain way, such that the .odex files are reassembled into classes.dex files directly integrated inside the APKs or JARs. By doing that, all pieces of an application package are put together back in one place.
For now, we need Baksmali.jar and Smali.jar to deodex, it seems these tools are not perfect and it seems to be why deodexed stock browser is laging/freezing.
This is the reason why there is a return to odexed customROMs


Prerequisites :

You will need these files :
Quote:

* backsmali.jar
* smali.jar
* custom java.awt.jar
* dexopt wrapper
* recent version of busybox

all included in the attached .zip (end of post)

You will also need :
Quote:

* your GS2
* with the official odexed firmware you want to mod
* rooted and with root explorer (pay app but really usefull) and with CWM recovery (better )
* ADB installed and working in su (#)
* copy dexopt-wrapper in /system/bin/ and giving it 755 permissions (using root explorer or command: chmod 755 /system/bin/dexopt-wrapper
* optional (if errors during odexing back) overwrite installed busybox with the one included here in /system/xbin/

You have to know :
* even on stock firmware (odexed) there are some deodexed .apk (like framework-res.apk in /system/framework/ and like some .apk in system/app/)

Tip on Windows "Vista / 7" : open a CMD prompt in a specified folder
Quote:

1. Select the folder you want to open in the command prompt
2. Right-click on it while holding the Shift key
3. Select Open command window here



Manually Deodexing :

theory :
Quote:

to decompil an odex file you need Baksmali.jar and you needs the BOOTCLASSPATH
BOOTCLASSPATH is a list in specific order of some framework .jar files

** To decompil and re-odex back .odex from JAR file you need to use the BOOTCLASSPATH specified in the init.rc file located in the root folder of your GS2 : (open init.rc with notepad ++)

Extract of I9100 init.rc :
export BOOTCLASSPATH /system/framework/core.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/core-junit.jar

** To decompil an .odex from APK file, BOOTCLASSPATH is different in fonction of the APKs, so the lazy way is to include all the .JAR files of the framework folder
2 applications : Emails.apk and MobilePrint.apk needs one more custom java.awt.jar


1/ put in the same folder :
Quote:

* apk to deodex
* all system/framework files
add :
* custom java.awt.jar
* baksami.jar
* smali.jar
* zipalign.exe

2/ open CMD prompt in this folder (see above for how to)

3/ Deodexing Framework file (I will take android.policy.jar for example) :

* BAKSMALI of the android.policy.odex :
Code:
java -Xmx1024m -jar baksmali.jar -c :core.jar:bouncycastle.jar:ext.jar:framework.jar:android.policy.jar:services.jar:core-junit.jar -x android.policy.odex
* This create an out folder. You can now modify some files (like adding Advanced power menu)

* SMALI the /out folder in a classes.dex file :
Code:
java -Xmx1024m -jar smali.jar out -o classes.dex
* finally deodex your android.policy.jar :
Quote:

open android.policy.jar with 7zip without extracting
push the classes.dex created in the 7zip window in the root folder
close the 7zip windows and here is your deodexed android.policy.jar


4/ Deodexing APK in system/app (I will take SystemUI.apk for exemple) :

* BAKSMALI of the SystemUI.odex :
Code:
java -Xmx1024m -jar baksmali.jar -c :am.jar:android.policy.jar:android.test.runner.jar:bmgr.jar:bouncycastle.jar:com.android.location.provider.jar:com.google.android.maps.jar:com.samsung.device.jar:com.yamaha.android.media.jar:core.jar:core-junit.jar:ext.jar:framework.jar:ime.jar:input.jar:java.awt.jar:javax.obex.jar:libvtmanagerjar.jar:monkey.jar:pm.jar:sec_feature.jar:seccamera.jar:sechardware.jar:secmediarecorder.jar:services.jar:sqlite-jdbc.jar:svc.jar:twframework.jar -x SystemUI.odex
* an out folder is created. You can modify the files inside if you want.

* SMALI the /out folder in a classes.dex file :
Code:
java -Xmx1024m -jar smali.jar out -o classes.dex
* finally deodex your SystemUI.apk :
Quote:

open SystemUI.apk with 7zip without extracting
push the classes.dex created in the 7zip window in the root folder
close the 7zip windows and here is your deodexed SystemUI.apk

* extra step for APKs : zipaplign of your new deodexed SystemUI.apk
--> In the same CMD prompt windows, type :
Code:
zipalign -v 4 SystemUI.apk zip_SystemUI.apk
A zip_SystemUI.apk file is created. Delete your deodexed SystemUI.apk and rename zip_SystemUI.apk in SystemUI.apk



ODEXING BACK :

the theory :
Quote:

*You will need to copy the (custom) deodexed file (.jar or .apk) in the system/framework/ folder of your phone.
*You will use dexopt wrapper (already copied in your phone) to obtain a new .odex file (patched_android.policy.odex for example)
* You will copy the signature of original .odex file to patched.odex file - if not, the phone won't boot ...

How To :
1/ backup your original files (apk jar and odex) to /sdcard/Mod/
2/ copy modified deodexed files (.apk and .jar) in /system/framework/ of your GS2

Now we are going to odex back

3/ open a CMD prompt in the folder of adb.exe (usualy /android-sdk-windows/platform-tools/)
4/ type command :
Code:
adb shell
su
## for .JAR file :
dexopt-wrapper /system/framework/XXX.jar /system/framework/patched_XXX.odex /system/framework/core.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/core-junit.jar

response must be :
--- BEGIN '/system/framework/android.policy.jar' (bootstrap=0) ---
--- waiting for verify+opt, pid=7194
--- would reduce privs here
--- END '/system/framework/android.policy.jar' (success) ---

## for .APK file :
dexopt-wrapper /system/framework/XXX.apk /system/framework/patched_XXX.odex /system/framework/core.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/core-junit.jar
--> This will create the patched_XXX.odex file

Now we need to copy signature from original .odex file to patched .odex file cause Dalvik need files signature integrity in order to boot.

5/ always in the same CMD prompt windows :
Code:
# if not already done ...
adb shell
su

# copy the original .odex and .jar in system/framework (not .apk) : 
cp /sdcard/MOD/original.XXX.odex /system/framework
cp -f /sdcard/MOD/XXX.jar /system/framework   # where XXX.jar is the original odexed .jar

# give all permissions to XXX.odex files :
chmod 777 /system/framework/original.XXX.odex
chmod 777 /system/framework/patched_XXX.odex

# copy signature :
busybox dd if=/system/framework/original.XXX.odex of=/system/framework/patched_XXX.odex bs=1 count=20 skip=52 seek=52 conv=notrunc

response must be :
busybox dd if=/system/framework/original.XXX.odex of=/system/framewor
k/patched_XXX.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
20+0 records in
20+0 records out
20 bytes (20B) copied, 0.002042 seconds, 9.6KB/s
Now the signature is copied over the patched_XXX.odex

Notice :
a - if you don't have response after busybox dd command : busybox is not installed or you have a to old version, use the busybox included in the attached .zip
b - if you don't have the last response line : 20 byt
Attached Files
File Type: zip all_for_deodexing_reodexing.zip - [Click for QR Code] (5.38 MB, 21663 views)
The Following 170 Users Say Thank You to sicopat For This Useful Post: [ View ] Gift sicopat Ad-Free
 
 
8th August 2011, 03:30 PM |#2  
aDEO's Avatar
Senior Member
Flag Bruxelles
Thanks Meter: 10
 
More
Awesome! Thank you for your time sir!

Best regards,
aDEO
The Following User Says Thank You to aDEO For This Useful Post: [ View ] Gift aDEO Ad-Free
8th August 2011, 04:40 PM |#3  
Member
Thanks Meter: 2
 
More
awesome man!'help me out of questions!
9th August 2011, 12:55 AM |#4  
Senior Member
Flag Buckinghamshire
Thanks Meter: 134
 
More
Thanks for the guide, just a quick question.

Can I odex a custom deodexed ROM? Just that will save me time.

If not, I'll unpack an official ROM and made my mods. You've posted some other great guides which has really helped me tonight! Thanks again.
9th August 2011, 07:45 AM |#5  
abu2x's Avatar
Member
Jogja
Thanks Meter: 7
 
More
nice tutorial
I've successfully deodex them.
lets try odex them back .
9th August 2011, 09:37 AM |#6  
sicopat's Avatar
OP Senior Member
Thanks Meter: 960
 
Donate to Me
More
Quote:
Originally Posted by Mekrel

Thanks for the guide, just a quick question.

Can I odex a custom deodexed ROM? Just that will save me time.

If not, I'll unpack an official ROM and made my mods. You've posted some other great guides which has really helped me tonight! Thanks again.

Yes you can odex back a customROM (in theory) I never try to, but you will need to odex back all the .jar of the framework folder. And you will need the original firmware to copy signature of original .odex files to re-odexed .odex files

Sent from my GT-I9100 using XDA Premium App
9th August 2011, 09:45 AM |#7  
sicopat's Avatar
OP Senior Member
Thanks Meter: 960
 
Donate to Me
More
Quote:
Originally Posted by abu2x

nice tutorial
I've successfully deodex them.
lets try odex them back .

Sometimes it will work the first time.
Sometimes it won't cause you forgot to give good permissions to dexopt-wrapper in system/bin
Or to the pached_XXX.odex files (need write permissions for all)

Or Busybox not installed or to old... Then the copy signature step won't work

Sent from my GT-I9100 using XDA Premium App
The Following User Says Thank You to sicopat For This Useful Post: [ View ] Gift sicopat Ad-Free
9th August 2011, 11:42 AM |#8  
eybee1970's Avatar
Senior Member
Thanks Meter: 13,302
 
More
brilliant! thx a ton!
13th August 2011, 05:37 PM |#9  
Brotuck's Avatar
Senior Member
Flag Rotterdam
Thanks Meter: 451
 
More
Great ! I was looking for this, thank you.

One thing was still giving me a hard time and i got that one solved also.
When doing a odex back from a custom theme, the method is different.

Because you need to use the modified framework file in the dependencylist.
So for me it was:

(I put a modified framework.jar in /sdcard)


dexopt-wrapper /sdcard/framework.jar /sdcard/framework.odex /system/framework/core.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/sdcard/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/core-junit.jar


Otherwise it does NOT work. Now i have succusfully added overglow to a odex ROM.
The Following 2 Users Say Thank You to Brotuck For This Useful Post: [ View ] Gift Brotuck Ad-Free
14th August 2011, 09:28 AM |#10  
Brotuck's Avatar
Senior Member
Flag Rotterdam
Thanks Meter: 451
 
More
Ok a new problem with the framework.jar

In the method to odex on the FP there was mentioned to use the dependency framework stuff.

When doing that trying to odex framework.jar i only get bootloops. aka the created odex file is wrong. The weird part is that the odex file created is 6,8 mb

When using the method i proposed in including the modified framework.jar in the dependencylist a bigger framework.odex is created. This one is about 7,14 mb
And it boots !

But it seems to be messed up because when trying to do some settings i get fc or it just exits. It appears to focus on phone settings. (try adding a apn and it closes)

Does anyone know of a solution for this ?
I did try to add the java.awt.jat in the dependencylist, but it does not seem to matter at all.
The Following User Says Thank You to Brotuck For This Useful Post: [ View ] Gift Brotuck Ad-Free
14th August 2011, 09:39 PM |#11  
sicopat's Avatar
OP Senior Member
Thanks Meter: 960
 
Donate to Me
More
Yes you need to use your modded framework.jar in bootclasspath dependencies of dexopt wrapper.

If force close, perhaps you did not erase dalvik cache or made a mistake when modding framework.jar
Did you use the last Smali version out today x.7 to make your mod ? cause smali.jar was buggy with framwork.jar deodexing.

If you just want to odex a theme with more than 1 framework file, you should need to do by step : first you copy 1 file and odex it back then you do the same for second file ... You should only use 1 deodexed jar in your bootclasspath corresponding to the file you try to odex back.

Hope this will help, i cannot help much cause my GS2 doesn't really love the beautifull sand of the mediteraneen sea I am on vacation ...


Sent from my GT-I9100 using XDA Premium App
Post Reply Subscribe to Thread

Guest Quick Reply (no urls or BBcode)
Message:
Previous Thread Next Thread
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes