一、反編譯java代碼首先須要下載dex2jar這個工具,下載完後並解壓縮。
二、將要反編譯的apk文件重命名爲zip格式並解壓縮,注意其中的classes.dex文件,它存放了所有的java代碼,將classes.dex文件拷貝到dex2jar解壓後的根目錄下。
三、打開cmd,進入dex2jar解壓後的根目錄,執行命令:java
d2j-dex2jar classes.dex工具
以下圖:佈局
命令執行完後在對應目錄下會生成classes-dex2jar.jar文件ui
jar文件spa
四、要查看java代碼,還須要下載jd-gui這個工具,目前最新版是1.4.0,下載完後解壓縮,並用jd-gui.exe打開上邊反編譯出來的jar文件:xml
到此,已經順利的反編譯出了java代碼
那資源文件呢,再回頭看一下剛纔apk文件對應的解壓縮文件,全部的xml文件都是亂碼,例如AndroidManifest.xml:ip
固然要還原原始的資源文件仍是有辦法的,繼續往下看。資源
一、要反編譯apk中的資源文件,就須要apktool這個工具了,cmd
二、將要反編譯的apk文件放到apktool文件夾,打開cmd,進入apktool文件夾目錄,執行命令:虛擬機
apktool d test.apk
以下圖:
apktool d test.apk
執行成功後,在當前目錄下會生成一個test文件夾:
test文件夾目錄
其中,res文件夾下存放的是反編譯出來的全部資源,smali文件夾下存放的是反編譯出來的全部代碼,AndroidManifest.xml則是通過反編譯還原後的manifest文件。smali文件夾下的文件smali文件使用的是Android虛擬機所使用的寄存器語言,若是看的懂smail文件的話,就能夠修改源代碼的邏輯了,好可怕的事...固然這不是咱們重點討論的。
此時查看AndroidManifest.xml文件,發現已經成功反編譯出來了:
AndroidManifest.xml
一、既然資源文件已經順利的反編譯出來了,那咱們就能夠適當的修改點東西了,例如換個圖標啥的、改下佈局文件等,這裏咱們將AndroidManifest.xml中的channel值改成10001,而後開始從新打包,一樣在cmd中切換到apktool文件夾目錄,執行命令:
apktool b test -o new_test.apk
以下圖:
從新打包
執行成功後,在當前目錄會生成一個新的new_test.apk文件:
new_test.apk
二、可是呢,這個apk文件目前並不能安裝,由於須要從新簽名。沒有簽名文件的話,經過Android Studio能夠很簡單的生成一個哦,將準備好的簽名文件放到apktool文件夾根目錄,繼續在cmd執行命令:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 簽名文件名 -storepass 簽名密碼 待簽名的APK文件名 簽名的別名
以下圖:
jarsigner start
jarsigner success
注意,其中jarsigner命令文件是存放在jdk的bin目錄下的,須要將bin目錄配置在系統的環境變量中才能夠在任何位置執行此命令。
三、簽名完成後,建議對APK文件進行一次對齊操做,這樣可使得程序在Android系統中運行得更快,對齊操做使用的是zipalign工具,該工具在<Android SDK>/build-tools/<version>目錄下,須要將這個目錄配置到系統環境變量當中才能夠在任何位置執行此命令。繼續在cmd中執行命令:
zipalign 4 new_test.apk new_test_aligned.apk
執行成功後,會生成一個對齊後的new_test_aligned.apk文件:
new_test_aligned.apk
四、最後能夠經過以下命令驗證apk簽名是否成功:
jarsigner -verify -verbose -certs new_test_aligned.apk
以下圖:
verify start
verify success
到這裏apk反編譯及從新打包流程就介紹完畢了。