[GUIDE] How to Decompile APKs with ODEX files [Noob Friendly]

Search This thread

dnnz

Senior Member
Jan 7, 2013
107
23
THIS GUIDE HAS BEEN TESTED ON KITKAT, MARSHMALLOW AND NOUGAT

When you have a system app with an odex file like bluetooth.apk and bluetooth.odex you can't use apktool for decompile and there is no need for deodex the whole ROM, follow this guide to decompile and mod one of these apps and nothing else.


REQUIREMENTS

- Be root
- platform-tools folder : lastest version download
- Java installed
- Files: baksmali.jar, smali.jar and zipalign.exe.


SET UP

- Make a folder named "Baksmali" and place these files: baksmali.jar, smali.jar, zipaling.exe, the apk and it's odex file
- Place the platform-tools folder in Baksmali folder and rename it to framework.
- Make sure the files are named baksmali.jar and smali.jar for simplicity , not baksmali-somenumber.jar. This is optional but keep in mind that in the commands i will assume these files are named like that so if you don't you'll have to replace with their real names like baksmali-2.0.0.jar

I i attached a zip with the complete Baksmali folder, but keep in mind this folder was created in feb 2016, you may need download manually the latest files to make sure if you got any errors it's not because of outdated versions


DECOMPILE

- Conect your device to the PC
- Go to Backsmali/framework
- Right click + SHIFT on an empty space of the folder and select "open command window here" and write:

adb pull /system/framework/arm/boot.oat boot.oat

For kitkat: adb pull /system/framework


- Go to Baksmali folder
- Right click + SHIFT on an empty space of the folder and select "open command window here" and write this command (replace NAME with the name of your odex file):

java -jar baksmali.jar -x -c boot.oat -d framework NAME.odex -o out

For Kitkat = java -jar baksmali.jar -d framework -x NAME.odex

- The files should be in the "out" folder now created


COMPILE

This way you can create a classes.dex so then you can place it in an apk so the apk is not more dependent of the odex file.

- Again in Baksmali folder Right click + SHIFT and select "open command window here":

java -jar smali.jar -o classes.dex out

Now open the APK file with 7zip/winrar and drag the file classes.dex, confirm and exit.

write this command:

zipalign -v 4 apk.apk new_apk.apk

apk: name of the apk we just added classes.dex file
new_apk: apk generated by zipaling, ready to use in the device

PLACE APP IN THE DEVICE

Rename the new_apk to the original name, and with a root explorer place it in system/app with permisions rw-r-r, remember deleting the odex file in that folder.
Update Marhsmallow: Delete the folder APKNAME in system/app and paste the apk in with permisions rw-r-r
If when you open the app crashes always try rebooting

 

Attachments

  • Baksmali.zip
    3.2 MB · Views: 4,635
Last edited:

luismpc

New member
Mar 1, 2016
2
0
Hello

Thank you for your guide.
I am trying to decompile the Settings.apk in order to solve some translations issues in a flash-able ROM.
In the priv-app/Settings folder there is a Settings.odex file, so i tried to follow your guide to decompile the whole thing.
The following command gives me an error, i think there is some version mismatch here:

java -jar baksmali-2.1.0.jar -d framework -x Settings.odex
Exception in thread "main" org.jf.dexlib2.DexFileFactory$UnsupportedOatVersionException: Unsupported oat version: 39
at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:147)
at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:78)
at org.jf.baksmali.main.main(main.java:266)

I am copying the needed files (framework, Settings.odex/apk) from the Zip ROM, not from the phone, i guess this isnt an issue right?
 

dnnz

Senior Member
Jan 7, 2013
107
23
Hello

Thank you for your guide.
I am trying to decompile the Settings.apk in order to solve some translations issues in a flash-able ROM.
In the priv-app/Settings folder there is a Settings.odex file, so i tried to follow your guide to decompile the whole thing.
The following command gives me an error, i think there is some version mismatch here:

java -jar baksmali-2.1.0.jar -d framework -x Settings.odex
Exception in thread "main" org.jf.dexlib2.DexFileFactory$UnsupportedOatVersionException: Unsupported oat version: 39
at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:147)
at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:78)
at org.jf.baksmali.main.main(main.java:266)

I am copying the needed files (framework, Settings.odex/apk) from the Zip ROM, not from the phone, i guess this isnt an issue right?


Idk maybe you should try adb pull to extract the framework from the phone, also the last versión of baksmali is 2.1.1 you got them all here.
The folder i share has the lastest versión of both.
Note Im not a dev, i made this step by step guide because i dind't find in google something clear about it and took me a long time to make it work.
 

dnnz

Senior Member
Jan 7, 2013
107
23
Hello

Thank you for your guide.
I am trying to decompile the Settings.apk in order to solve some translations issues in a flash-able ROM.
In the priv-app/Settings folder there is a Settings.odex file, so i tried to follow your guide to decompile the whole thing.
The following command gives me an error, i think there is some version mismatch here:

java -jar baksmali-2.1.0.jar -d framework -x Settings.odex
Exception in thread "main" org.jf.dexlib2.DexFileFactory$UnsupportedOatVersionException: Unsupported oat version: 39
at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:147)
at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:78)
at org.jf.baksmali.main.main(main.java:266)

I am copying the needed files (framework, Settings.odex/apk) from the Zip ROM, not from the phone, i guess this isnt an issue right?

The guide worked on KitKat, now is updated to work on Marhsmallow, you can use the new method maybe also works on Lollipop...
 

shunsai

Senior Member
Apr 4, 2007
344
80
大阪府
This guide worked wonderfully for me. I was able to decompile and recompile a system apk for Marshmallow. Thank you!

Is there a way to convert the smali files to java for Marshmallow apks (dex2jar)?
 

Pain-N-Panic

Senior Member
Mar 24, 2013
1,731
625
Droid
Google Pixel 7 Pro
Everything worked great up until the compile part. I got an error saying "mismatched d input '' expecting END_METHOD_DIRECTIVE"

See photo attached. Anyone have any idea how to fix this so I can compile a classes.dex for my SystemUI?

Also, I just upgraded to Android N if that makes a difference...
 

Attachments

  • _20160918_223957.jpg
    _20160918_223957.jpg
    157 KB · Views: 569

neo4uo

Senior Member
Nov 27, 2010
943
280
Alabama
I tried for a Marshmallow file and get this error, also I did update smali and baksmali to the latest files;
Code:
C:\Baksmali>java -jar baksmali.jar -x -c boot.oat -d framework LGSystemUI.odex -o out
Exception in thread "main" com.beust.jcommander.ParameterException: Unknown option: -x
        at com.beust.jcommander.JCommander.parseValues(JCommander.java:742)
        at com.beust.jcommander.JCommander.parse(JCommander.java:282)
        at com.beust.jcommander.JCommander.parse(JCommander.java:265)
        at org.jf.baksmali.Main.main(Main.java:90)

Thanks
 

a.vandelay

Senior Member
Oct 25, 2010
148
19
I tried for a Marshmallow file and get this error, also I did update smali and baksmali to the latest files;
Code:
C:\Baksmali>java -jar baksmali.jar -x -c boot.oat -d framework LGSystemUI.odex -o out
Exception in thread "main" com.beust.jcommander.ParameterException: Unknown option: -x
        at com.beust.jcommander.JCommander.parseValues(JCommander.java:742)
        at com.beust.jcommander.JCommander.parse(JCommander.java:282)
        at com.beust.jcommander.JCommander.parse(JCommander.java:265)
        at org.jf.baksmali.Main.main(Main.java:90)

Thanks

you don't need the "-x" for baksmail, just "x"

Code:
java -jar baksmali.jar x -c boot.oat -d framework LGSystemUI.odex -o out
 
  • Like
Reactions: San.Dip

San.Dip

Senior Member
Nov 16, 2011
86
46
you don't need the "-x" for baksmail, just "x"
Thanks a lot, it worked for me. I am using version 2.2.0.
However, while executing "java -jar smali.jar -o classes.dex out" command I get following error. Please suggest the necessary correction.

C:\Users\Sandip\Desktop\New folder\Baksmali>java -jar smali.jar -o classes.dex out
Exception in thread "main" com.beust.jcommander.MissingCommandException: Expected a command, got -o
at com.beust.jcommander.JCommander.parseValues(JCommander.java:725)
at com.beust.jcommander.JCommander.parse(JCommander.java:304)
at com.beust.jcommander.JCommander.parse(JCommander.java:287)
at org.jf.smali.Main.main(Main.java:87)
C:\Users\Sandip\Desktop\New folder\Baksmali>
 

oblyvision

Senior Member
Nov 8, 2014
81
54
Ok. I did everything worked. However, when I try with my SystemUI, I notice additional file inside a folder (lib/arm/libNaturalEffect.so) which I assume system animation effect separated from the system (indication of modifiable).
So, do I need to keep the folder and place recompiled SystemUI.apk inside it, or else?
 

BobbyDev

Member
Jul 19, 2016
5
0
In case anyone has this same error...

Thanks a lot, it worked for me. I am using version 2.2.0.
However, while executing "java -jar smali.jar -o classes.dex out" command I get following error. Please suggest the necessary correction.

C:\Users\Sandip\Desktop\New folder\Baksmali>java -jar smali.jar -o classes.dex out
Exception in thread "main" com.beust.jcommander.MissingCommandException: Expected a command, got -o
at com.beust.jcommander.JCommander.parseValues(JCommander.java:725)
at com.beust.jcommander.JCommander.parse(JCommander.java:304)
at com.beust.jcommander.JCommander.parse(JCommander.java:287)
at org.jf.smali.Main.main(Main.java:87)
C:\Users\Sandip\Desktop\New folder\Baksmali>

I had this same error, and here is the solution I found that worked:

java -jar smali.jar assemble out -o classes.dex

I know that SanDip left the link on where he figured out how to fix it, but it wasn't immediately obvious to me what the fix was after I visited the link. Hope this helps someone!
 

Xperiarmus

New member
Jun 2, 2018
1
0
THIS GUIDE HAS BEEN TESTED ON KITKAT, MARSHMALLOW AND NOUGAT
I try to use this guide for Lollipop 5.1.1. boot.oat created succesfully:
Code:
d:\Baksmali\framework>adb pull /system/framework/arm/boot.oat boot.oat
/system/framework/arm/boot.oat: 1 file pulled. 4.8 MB/s (54336860 bytes in 10.858s)
and everything is ok until following command:
Code:
d:\Baksmali>java -jar baksmali.jar -x -c boot.oat -d framework DownloadProviderUi.odex -o out
Exception in thread "main" com.beust.jcommander.MissingCommandException: Expected a command, got -x
        at com.beust.jcommander.JCommander.parseValues(JCommander.java:725)
        at com.beust.jcommander.JCommander.parse(JCommander.java:304)
        at com.beust.jcommander.JCommander.parse(JCommander.java:287)
        at org.jf.baksmali.Main.main(Main.java:90)
I can't find new files. I even can't find "out" folder. Where should it be? I'm newbie, this guide noob friendly - I hope you can help me. I have 2 apps: each have apk and odex files. I need to deodex this apps.
 

Fatmajk

New member
Apr 26, 2018
4
0
Code:
d:\Baksmali>java -jar baksmali.jar -x -c boot.oat -d framework DownloadProviderUi.odex -o out
Exception in thread "main" com.beust.jcommander.MissingCommandException: Expected a command, got -x
        at com.beust.jcommander.JCommander.parseValues(JCommander.java:725)
        at com.beust.jcommander.JCommander.parse(JCommander.java:304)
        at com.beust.jcommander.JCommander.parse(JCommander.java:287)
        at org.jf.baksmali.Main.main(Main.java:90)

Try executing without the dash before the command, like this: java -jar baksmali.jar x -c boot.oat -d framework DownloadProviderUi.odex -o out

---------- Post added at 03:39 PM ---------- Previous post was at 03:32 PM ----------

I'm also trying to use baksmali (v2.2.2) to decode odex files, without success so far. I'm launching the command:
sudo java -jar baksmali.jar x -c framework/arm/boot.oat -d framework/ Messages.odex -o out/

and I get the error below:
Code:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1890058312
	at org.jf.dexlib2.dexbacked.BaseDexBuffer.readSmallUint(BaseDexBuffer.java:53)
	at org.jf.dexlib2.dexbacked.OatFile$DexEntryIterator.next(OatFile.java:579)
	at org.jf.dexlib2.dexbacked.OatFile$DexEntryIterator.next(OatFile.java:570)
	at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
	at org.jf.util.AbstractForwardSequentialList$1.next(AbstractForwardSequentialList.java:91)
	at java.util.AbstractSequentialList.get(AbstractSequentialList.java:88)
	at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:129)
	at org.jf.baksmali.DexInputCommand.loadDexFile(DexInputCommand.java:144)
	at org.jf.baksmali.DisassembleCommand.run(DisassembleCommand.java:161)
	at org.jf.baksmali.Main.main(Main.java:102)

Anyone having this issue as well? Adding -Xmx5000m option to the java command does not work.
 

gg9hot

New member
Oct 28, 2012
1
0
I have just reinstalled stk.apk into pixelized OS for SMT-23

THIS GUIDE HAS BEEN TESTED ON KITKAT, MARSHMALLOW AND NOUGAT

When you have a system app with an odex file like bluetooth.apk and bluetooth.odex you can't use apktool for decompile and there is no need for deodex the whole ROM, follow this guide to decompile and mod one of these apps and nothing else.

thank you very much sir, i almost reverted back to my old OS since custom OS did not have a sim card menu. omst epople since dont know abou this since i really had to search for this/.
 

diracsbracket

Member
May 8, 2020
11
1
To I tried to test it on the HiddenMenu.apk but am getting errors of missing "embedded dex file"
(I am on Android 8.0.0)

Code:
java -jar baksmali.jar x -c boot.oat -d framework HiddenMenu.odex -o out
Exception in thread "main" org.jf.dexlib2.DexFileFactory$DexFileNotFoundException: Could not locate the embedded dex file /system/app/HiddenMenu/HiddenMenu.apk. Is the vdex file missing?
        at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:586)
        at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:567)
        at org.jf.baksmali.DexInputCommand.loadDexFile(DexInputCommand.java:158)
        at org.jf.baksmali.DisassembleCommand.run(DisassembleCommand.java:162)
        at org.jf.baksmali.Main.main(Main.java:102)
Caused by: org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value: 7f 45 4c 46 02 01 01 03
        at org.jf.dexlib2.util.DexUtil.verifyDexHeader(DexUtil.java:93)
        at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:583)
        ... 4 more

To try to solve the above problem, I tried to reconstruct the path structure as on the device (I adb pulled the complete \system\framework dir from the device), without success:

Code:
java -jar baksmali.jar x -c boot.oat -d framework .\system\app\HiddenMenu\oat\arm64\HiddenMenu.odex -o out
Error occurred while loading class path files. Aborting.
org.jf.dexlib2.DexFileFactory$DexFileNotFoundException: Could not locate the embedded dex file /system/framework/core-oj.jar. Is the vdex file missing?
        at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:586)
        at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:567)
        at org.jf.dexlib2.analysis.PathEntryLoader.loadEntry(PathEntryLoader.java:62)
        at org.jf.dexlib2.analysis.ClassPathResolver.loadLocalOrDeviceBootClassPathEntry(ClassPathResolver.java:197)
        at org.jf.dexlib2.analysis.ClassPathResolver.<init>(ClassPathResolver.java:89)
        at org.jf.dexlib2.analysis.ClassPathResolver.<init>(ClassPathResolver.java:154)
        at org.jf.baksmali.AnalysisArguments.loadClassPathForDexFile(AnalysisArguments.java:134)
        at org.jf.baksmali.AnalysisArguments.loadClassPathForDexFile(AnalysisArguments.java:89)
        at org.jf.baksmali.DisassembleCommand.getOptions(DisassembleCommand.java:209)
        at org.jf.baksmali.DeodexCommand.getOptions(DeodexCommand.java:71)
        at org.jf.baksmali.DisassembleCommand.run(DisassembleCommand.java:183)
        at org.jf.baksmali.Main.main(Main.java:102)
Caused by: org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value: 7f 45 4c 46 01 01 01 03
        at org.jf.dexlib2.util.DexUtil.verifyDexHeader(DexUtil.java:93)
        at org.jf.dexlib2.dexbacked.OatFile$OatDexEntry.getDexFile(OatFile.java:583)
        ... 11 more
 
Last edited:

Top Liked Posts

  • There are no posts matching your filters.
  • 15
    THIS GUIDE HAS BEEN TESTED ON KITKAT, MARSHMALLOW AND NOUGAT

    When you have a system app with an odex file like bluetooth.apk and bluetooth.odex you can't use apktool for decompile and there is no need for deodex the whole ROM, follow this guide to decompile and mod one of these apps and nothing else.


    REQUIREMENTS

    - Be root
    - platform-tools folder : lastest version download
    - Java installed
    - Files: baksmali.jar, smali.jar and zipalign.exe.


    SET UP

    - Make a folder named "Baksmali" and place these files: baksmali.jar, smali.jar, zipaling.exe, the apk and it's odex file
    - Place the platform-tools folder in Baksmali folder and rename it to framework.
    - Make sure the files are named baksmali.jar and smali.jar for simplicity , not baksmali-somenumber.jar. This is optional but keep in mind that in the commands i will assume these files are named like that so if you don't you'll have to replace with their real names like baksmali-2.0.0.jar

    I i attached a zip with the complete Baksmali folder, but keep in mind this folder was created in feb 2016, you may need download manually the latest files to make sure if you got any errors it's not because of outdated versions


    DECOMPILE

    - Conect your device to the PC
    - Go to Backsmali/framework
    - Right click + SHIFT on an empty space of the folder and select "open command window here" and write:

    adb pull /system/framework/arm/boot.oat boot.oat

    For kitkat: adb pull /system/framework


    - Go to Baksmali folder
    - Right click + SHIFT on an empty space of the folder and select "open command window here" and write this command (replace NAME with the name of your odex file):

    java -jar baksmali.jar -x -c boot.oat -d framework NAME.odex -o out

    For Kitkat = java -jar baksmali.jar -d framework -x NAME.odex

    - The files should be in the "out" folder now created


    COMPILE

    This way you can create a classes.dex so then you can place it in an apk so the apk is not more dependent of the odex file.

    - Again in Baksmali folder Right click + SHIFT and select "open command window here":

    java -jar smali.jar -o classes.dex out

    Now open the APK file with 7zip/winrar and drag the file classes.dex, confirm and exit.

    write this command:

    zipalign -v 4 apk.apk new_apk.apk

    apk: name of the apk we just added classes.dex file
    new_apk: apk generated by zipaling, ready to use in the device

    PLACE APP IN THE DEVICE

    Rename the new_apk to the original name, and with a root explorer place it in system/app with permisions rw-r-r, remember deleting the odex file in that folder.
    Update Marhsmallow: Delete the folder APKNAME in system/app and paste the apk in with permisions rw-r-r
    If when you open the app crashes always try rebooting

    1
    Good guide. Also working in 7.1.1
    1
    I tried for a Marshmallow file and get this error, also I did update smali and baksmali to the latest files;
    Code:
    C:\Baksmali>java -jar baksmali.jar -x -c boot.oat -d framework LGSystemUI.odex -o out
    Exception in thread "main" com.beust.jcommander.ParameterException: Unknown option: -x
            at com.beust.jcommander.JCommander.parseValues(JCommander.java:742)
            at com.beust.jcommander.JCommander.parse(JCommander.java:282)
            at com.beust.jcommander.JCommander.parse(JCommander.java:265)
            at org.jf.baksmali.Main.main(Main.java:90)

    Thanks

    you don't need the "-x" for baksmail, just "x"

    Code:
    java -jar baksmali.jar x -c boot.oat -d framework LGSystemUI.odex -o out