安裝常用工具
brew install apktool
brew install dex2jar
brew cask install jd-gui
注:這里有個(gè)隱藏的坑兔毒,通過brew安裝的dex2jar可能不是最新版本的,會(huì)導(dǎo)致如下錯(cuò)誤姨俩,這是dex2jar已知的一個(gè)錯(cuò)誤匆赃,詳細(xì)見這里
dex2jar classes.dex -> ./classes-dex2jar.jar
Detail Error Information in File ./classes-error.zip
Please report this file to http://code.google.com/p/dex2jar/issues/entry
解決這個(gè)的辦法是下載最新版的dex2jar https://github.com/pxb1988/dex2jar
工具介紹
apktool:查看二進(jìn)制文件
apk 雖然實(shí)際上是個(gè) zip 可以直接 unzip,但里邊的 xml 都是 Binaray XML 形式蒜胖,需要再次轉(zhuǎn)化成 xml 才能查看消别。apktool 可以將 apk 內(nèi)的資源全部提取出來抛蚤,同時(shí) xml 也轉(zhuǎn)化好可直接查看內(nèi)容。apktool 也可以用于在修改資源后重新打包 apk寻狂。用法如下:
// 提取資源
apktool d <apk_name>
// 提取資源并指定輸出目錄
apktool d <apk_name> -o <foleder_name>
// 重新打包apk
apktool b <folder_name>
//重新打包apk并指定輸出apk名字
apktool b <folder_name> -o <new_apk_name>
但這里apktool反編譯出來只能得到apk的smali文件岁经,即匯編語言版本,并不能得到源代碼
重新給apk簽名
通常的需求是蛇券,將已有的apk文件通過apktool進(jìn)行提取資源后獲取到smali文件缀壤,修改相應(yīng)內(nèi)容后,將修改后文件再次通過apktool打包成 new_apk纠亚,但若原始apk為debug的塘慕,此時(shí)新打包的 new_apk 沒有簽名,因此需要重新給 new_apk 簽名后才能進(jìn)行安裝:
jarsigner -verbose -keystore ~/.android/debug.keystore -signedjar <signed_apk_name> <new_apk_name> androiddebugkey
其中
Eclipse或Android Studio在Debug時(shí),對(duì)App簽名都會(huì)使用一個(gè)默認(rèn)的密鑰庫:
默認(rèn)在 ~/.android/debug.keystore
密鑰庫名: debug.keystore
密鑰別名: androiddebugkey
密鑰庫密碼: android
dex2jar:將dex文件轉(zhuǎn)換成Jar包
// 將 dex 文件轉(zhuǎn)成 jar 文件
d2j-dex2jar <dex_name> -o <jar_name>
//將apk文件轉(zhuǎn)成jar文件
sh d2j-dex2jar.sh -f <apk_name>
兩種方式打包出來的jar文件是一樣的
jd-gui 將Jar包文件反編譯成java源文件
jd-gui下載解壓后蒂胞,直接打開文件夾里面的JD-GUI图呢,即可打開圖形化界面。將我們上一個(gè)步驟生成的classes-dex2jar.jar直接拖動(dòng)進(jìn)入界面中骗随,就可以看到反編譯之后的源碼結(jié)構(gòu)了蛤织。
注:jd-gui 可視化反編譯查看 .jar 文件。這里存在一個(gè)坑鸿染,jd-gui只能適配java8指蚜,否則無法正常打開運(yùn)行,我就是不小心安裝了java10涨椒,掙扎了好久默默的換了java版本摊鸡,命令如下:
//卸載java10
brew cask uninstall java
//安裝java8
brew tap caskroom/versions
brew cask install java8
APK Analyzer
Android Studio 自帶的 APK Analyzer 可直接查看APK內(nèi)的 圖片,xml內(nèi)容丢烘,dex結(jié)構(gòu)柱宦,文件尺寸等,還可以比較兩個(gè)apk的差異播瞳。雖然不能導(dǎo)出資源有點(diǎn)可惜掸刊,但已經(jīng)很強(qiáng)大方便了。用法:將 apk 拖入 AndroidStudio 就好了