❶ 如何反編譯android 的apk/dex/odex,獲得源碼
反編譯普通APK文件的方法多種多樣,ByteCode Viewer是一個可視化的集成工具,但它並不穩定,生成代碼質量一般。而dex2jar與jd_gui的組合則更為實用,雖然操作稍微繁瑣一些,但它們在穩定性和生成代碼質量上表現良好。
對於Android 5.0 Lollipop以後的ODEX文件,由於Google使用了ART替代了Dalvik,因此我們可以使用上述方法將dex文件反編譯為java源代碼。然而,系統預裝的應用,如應用商店、播放器等,它們的APK文件中可能找不到對應的classes.dex文件,而是包含一個.odex文件。這時,我們需要使用baksmali來反編譯這個odex文件。
下載baksmali工具包,並確保其版本與Android內核版本匹配。打開工具所在目錄,按住shift鍵點擊滑鼠右鍵,打開Windows命令窗口,然後將odex文件復制到該目錄中。
在命令窗口中依次執行以下命令:
1. oat2dex.bat *.odex .
2. 運行後會創建一個temp.dex文件。
3. java -jar baksmali-2.0.3.jar -a 21 -x temp.dex -o source .
這將創建一個名為source的文件夾,並將temp.dex反編譯到該文件夾中,-a 21表示的是Android內核版本21。
4. 運行java -jar small-2.0.3.jar -a 21 source -o classes.dex ,這將反編譯為classes.dex文件。
需要注意的是,通過這種方式反編譯生成的classes.dex文件相較於原生的classes.dex文件可能缺少某些信息,因此生成的Java代碼的可讀性可能較差。這時,可以使用在線工具JADX將classes.dex文件最終反編譯為Java代碼。
反編譯過程需要一定的技術知識和耐心,但通過上述步驟,我們能夠有效地獲取並查看源代碼。反編譯不僅是研究Android應用的重要手段,也是理解和學習Android開發技術的一種途徑。
反編譯過程中可能會遇到各種問題,如工具版本不匹配、命令行參數錯誤等,這時需要仔細檢查每一步操作,確保所有步驟都准確無誤。同時,保持對最新工具和方法的關注,有助於提高反編譯的效果和效率。
❷ 如何反編譯Android 的apk/dex/odex,獲得源碼
反編譯普通的APK文件:
對於普通的APK/DEX文件的反編譯,其實工具有很多, 包括:
ByteCode Viewer: 一個可視化的集成工具,說實話,不太好用,不夠穩定,生成代碼質量中等。
dex2jar + jd_gui: 這兩個工具組合還可以, 用起來比ByteCode Viewer麻煩一些,但比較穩定,生成代碼質量中等。
反編譯ODEX文件:
Android 5.0 Lollipop以後,Google用ART代替了以前的Dalvik,對於普通的app來說我們仍然可以用上面的方法來把dex文件反編譯成Java源代碼。但對於系統預裝的App,特別是類似應用商店,播放器等, 你會發現這些應用的apk文件中找不到對應的classes.dex文件,而是會發現在其子目錄下有個.odex文件。 那如何反編譯這個odex文件呢?我通過google查了查,知道應該用baksmali,但從github上下載了幾個版本都不行,報各種不同錯誤。
具體方法如下:
1. 從 這里 下載工具包, 解壓縮到本地。 這里的baksmali的版本是2.0.3. 不同版本的baksmali針對的Android內核不同。有時候高版本反倒不好用。
2. 打開工具所在目錄, 按住shift鍵, 點擊滑鼠右鍵,打開Windows命令窗口
3. 把 odex文件拷貝到該目錄
4. 在命令窗口運行: oat2dex.bat *.odex . 正常情況下,應該顯示OK等信息。如果報錯的話,說明這個文件無法轉換,後面的也不用試了。
5. 運行 oat2dex.bat *.odex temp.dex . 運行後會創建一個temp.dex文件。
6. 運行 java -jar baksmali-2.0.3.jar -a 21 -x temp.dex -o source . 運行後會創建一個source的文件夾,並將temp.dex反編譯到該文件夾。-a 21 表明的是Android內核的版本21
7. 運行 java -jar small-2.0.3.jar -a 21 source -o classes.dex , 反編譯為classes.dex文件。
需要注意的是:由這種方式反編譯成的classes.dex 文件相比原生的classes.dex 還是缺少了些信息,因此反編譯這種classes.dex 文件後生成的java代碼可讀性會更差些。
8. 用在線工具JADX 來把 classes.dex 最終反編譯為java代碼。
❸ odex什麼意思
dex是安卓上的應用程序apk中提取出來的可運行文件,即將APK中的classes.dex文件通過dex優化過程將其優化生成一個·dex文件單獨存放,原APK中的classes.dex文件會保留。
所謂dex,是由android軟體中的classes.dex生成的,dex化即是把那個文件預先提取出來作用是能加快軟體載入速度和開機速度。不過dex也有缺點,那就是有時候加刷東西會出現問題。
原本系統恢復出廠設置後第一次開機需要先提取classes.dex出來,而dex化就是現在你提前把它提取出來了。系統啟動或者程序運行加快的原因也就在此。並且將dex變為odex還可以節省空間,因為提取後可以把apk內的dex刪除。如果不odex,那麼系統還是會自動提取dex,這時不僅apk內有dex,/data/dalvik-cache目錄下也有dex,雖然apk內的dex經過壓縮了,但是兩份dex的總體積已經大於一份odex的體積了。
Odex化後系統啟動和程序運行速度大大提高,穩定性不變。因此推薦做Odex化。
一般來說官方rom都是odex化的rom(含Odex文件),而定製rom大部分都是deodex化的(無odex文件)。兩者應該各有優點吧,貌似現在也沒有統一的說法。官方rom大部分每個apk對應一個.odex文件,而deodex化的rom裡面只有一個apk,把.odex轉換成classes.dex放到apk包裡面了。所以 odex rom的.apk+.odex=deodex化rom的1個.apk (簡單地來說,其實就上一個合並的過程)。
❹ Android編譯是不是生成odex的設置
Android編譯是否生成odex的設置
默認編譯odex版本,如果需要非odex版本,請將device/huawei/k3v2_s10/BoardConfig.mk如下兩個變數的值修改為:
DISABLE_DEXPREOPT := true
WITH_DEXPREOPT := false
其它說明
A. device/hisi/k3v2oem1/下面的配置文件不再使用,對應的配置文件在device/huawei/k3v2_s10/目錄,以後如果需要修改配置文件, 請在該目錄下進行修改。
B. out/target/proct/目錄下的產品編譯鏡像k3v2oem1不再使用,對應華為自己的產品鏡像,如out/target/proct/hws10101u
C. 【編APK,不生成odex】
目前庫上的代碼編譯apk時,同時生成了apk和odex,push/install進去不生效。
解決方法:
(1不生成odex,只生成apk,將 LOCAL_DEX_PREOPT 的值改為 false 即可。
即 build\core\package.mk 中156行改為 LOCAL_DEX_PREOPT := false。
照上述修改後,全部重新編譯,後續就可以mm單獨編譯apk方便調試了。
(2如果時間緊,又不想全編重新編譯怎麼辦?
在相應的apk代碼路徑的Android.mk文件中加入WITH_DEXPREOPT := false。
添加後mm重新編譯生成apk即可。
【編JAR包,不生成odex】
目前庫上的代碼編譯framework時,同時生成了JAR和odex,此時push進去開機起不來。
解決方法:
編譯時只生成jar包,不生成odex,即 build/core/java_library.mk 中37行改為 LOCAL_DEX_PREOPT := false。照上述修改後,全部重新編譯,後續就可以mm單獨編譯jar包方便調試了