1. 程式人生 > >Odex檔案反編譯為Jar包

Odex檔案反編譯為Jar包

目前在研究Android手機字型的靈活設定問題,歸類各手機廠商的實現方式:

1:在主體商店設定字型後,手機需要重起

2:在主題商店設定字型後,立即生效

方案1的效果已基本實現,但是方案二的效果有基礎輪廓,但是還是好奇,所以用友商的手機過來看看究竟。

當通過Adb進入到友商系統時,全是.Odex的檔案,原本的.Jar已經被預優化。因此面臨.Odex的反編譯問題。

首先列出需要的工具:

A:smali/baksmali

B:dex2jar

C:jadx

附件中有新增對應工具,本文件只記錄對應的方法。

 

本文以Framework.odex檔案的反編譯為目標,介紹反編譯的方法和步驟:

假設所有工具已經下載到位,統一放在Decompile目錄下,目錄結構如圖所示:

Decompile

    |————smali

                    |

                    ——smali

                    ——baksmali

    |————dex2jar

                    |

                    ——d2j*.bat

    |————jadx

                    |

                    ——jadx-ui.bat

步驟:

1.進入到Decompile目錄,Adb連線對應裝置,執行以下命令:

    adb pull /system/framework/framework.odex 

2.執行java -jar smali\baksmali-2.1.3.jar,會有如下列印

usage: java -jar baksmali.jar [options] <dex-file>

disassembles and/or dumps a dex file

 -?,--help prints the help message then exits.

                                            Specify twice for debug options

                                ......

 -X,--experimental enable experimental opcodes to be

                                            disassembled, even if they aren't

                                            necessarily supported in the Android

                                            runtime yet

3.執行java -jar smali\baksmali-2.1.3.jar -a 16 -x framework.odex -d .

   會有如下錯誤:

    Error occurred while loading boot class path files. Aborting.

    org.jf.util.ExceptionWithContext: Cannot locate boot class path file /system/framework/telephony-msim.odex

        at org.jf.dexlib2.analysis.ClassPath.loadClassPathEntry(ClassPath.java:277)

        at org.jf.dexlib2.analysis.ClassPath.fromClassPath(ClassPath.java:182)

        at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:67)

        at org.jf.baksmali.main.run(main.java:113)

        at org.jf.baksmali.main.main(main.java:322)

4.執行adb pull /system/framework/telephony-msim.odex,並且繼續執行步驟3,如果有類似步驟3的抱錯,參考步驟4執行,直到步驟3完全正常,跳轉到步驟5 

5.baksmali 執行成功後,會產生out 目錄,裡面放的是中間檔案。執行如下命令:

    java -jar smali\smali-2.1.3.jar -a 16 -o classes.dex out,如果out目錄之前已經存在,請先刪除。

6.執行dex2jar\d2j-dex2jar.bat classes.dex,classes-dex2jar.jar 就是我們要的Jar包

7.將classes-dex2jar.jar 拖動到jadx\jadx-gui.bat上開啟,即可察看原始碼。

 

注:其實也可以在執行完步驟5之後,直接使用jadx開啟dex檔案。