在android開發中常常會遇到須要反編譯競品的需求,題主也就針對反編譯apk後替換sdk後從新打包的場景進行試驗,下面一步一步來講明Android如何反編譯後從新打包。java
咱們知道android項目編譯成應用程序後的安裝文件是.apk文件,運行期間classloader加載的是dex文件中的class。因此咱們先來看看一個典型的apk包中具備哪些基本內容: android
1.打開apktool官網 git
2.下載執行腳本文件和apktool.jar包先下載腳本文件 : mac os 對應 apktool.sh windows 對應 apktool.batgithub
再下載最新的apktool.jar windows
3.配置apktool的運行環境windows:把下載的兩個文件都copy到c:/windows目錄,或者放到本身指定的目錄下再修改系統path也行 Mac os: 把下載的兩個文件都copy到/usr/local/bin目錄下,修改權限爲可執行chmod a+x安全
在命令行終端模式下,輸入apktool驗證是否完成apktool環境配置 工具
1.命令行進入到apk包所在的文件夾路徑 ui
2.執行反編譯命令apktool d filename
3.獲得反編譯後的文件夾
查看manifest.xml文件,icon對應的就是配置應用logo 命令行
logo圖片資源所在1.回編譯apkapktool b files
files就是對應剛剛修改的apk文件夾,執行完後會從新生成一個apk文件3d
注意:編譯後的apk是安裝不成功的,老是提示
Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]
,實質是沒簽名。
2.生成簽名: keytool -genkey -keystore coolapk.keystore -keyalg RSA -validity 10000 -alias coolapk
注意:上面-keystore後面跟的是簽名文件的名字,而-alias是別名,通常狀況下-keystore後面跟-alias是同樣的,但其實二者沒有關係,這也是我故意搞成不同的緣由。
3.爲apk增長簽名: jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa -verbose -keystore coolapk.keystore -signedjar coolapk-signed.apk coolapk.apk coolapk
注意: 1.最後的」coolapk」就是-alias後面帶的,必須保持一致 2.若是不帶-digestalg SHA1 -sigalg MD5withRSA簽名後的apk安裝也會不成功,INSTALL_PARSE_FAILED_NO_CERTIFICATES的錯誤,若是不帶-tsa會報一個時間方面的警告.
dex2jar: https://github.com/pxb1988/dex2jar jd-gui: http://jd.benow.ca/
直接覆蓋原來的dex文件
而後就興沖沖地直接去安裝了,然而~ 看來果真沒這麼簡單就能呢個搞定,繼續排查緣由。看看apk文件中有什麼可疑對象致使了安裝失敗,果真除了dex和資源文件之外,還發現了三個文件
打開文件來一探究竟,果真裏面都是對打包時對文件進行了標識記錄,看來這是避免文件被篡改的安全機制。
想一想既然是這些文件致使的,那先試試簡單粗暴地直接把文件刪了,避免防篡改檢查
然而,這樣的是不行的,必需要有這個文件夾才能解析apk包,可能這些至關因而讀取安裝文件列表清單,必須具備,看來此路不通,
既然原來的清單內容對不上,但又不能不提供,那能不能咱們給它配一個新的? 想到這裏,感受能夠動手試試,嘿咻嘿咻~
這些文件既然是在編譯打包成apk時期自動生成的,那要想再生成一份新的,因此應該從新打包就能夠。但是這個自己已經就是apk文件了,怎麼再編譯打包? 停下來想了想,對啊,忽然想起來能夠給包籤個名唄,打簽名應該也會有一樣的效果纔對,繼續嘿咻嘿咻。
找個工具來簽名吧,用本身的去簽名留下點什麼不良記錄就很差了,嘿嘿~