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檔案。