一.環境要求 安裝java 1.8 以上 命令行運行 java -version 返回版本大於1.8 如果沒有,請安裝java 1.8 二.下載與安裝 下載apktool_x.x.x.jar到本地 官網下載或者 鏡像下載 重命名下載的apktool_x.x.x.jar,改名為apktool.jar ...
一.環境要求
- 安裝java 1.8 以上
- 命令行運行 java -version 返回版本大於1.8
- 如果沒有,請安裝java 1.8
二.下載與安裝
- 下載apktool_x.x.x.jar到本地 官網下載或者 鏡像下載
- 重命名下載的apktool_x.x.x.jar,改名為apktool.jar
- 下載腳本並配置
- Windows
-
寫個bat腳本放在同一目錄下
@echo off java -jar apktool.jar
-
兩個文件放在同一目錄,後將該目錄添加到您的環境變數系統PATH變數中
-
- Linux
-
寫個sh腳本放在同一目錄下
#!/bin/bash #關閉已運行的 pid = ps-ef| grep apktool.jar| grep -v | awk `{print $2}` kill -9 $pid echo "$pid進程終止" sleep2 #後臺啟動 nohup java -jar apktool.jar
-
將兩個文件(apktool.jar&apktool)移動到/usr/local/bin
-
確保兩個文件都可執行(chmod +x1)
-
- Mac OS
- 寫個sh腳本放在同一目錄下
- 將兩個文件(apktool.jar&apktool)移動到/usr/local/bin
- 確保兩個文件都可執行(chmod +x)
- Windows
- 命令行中輸入 apktool 驗證
三.使用
1.反編譯
使用 d 或者 decode 命令
apktool d apk文件路徑
apktool decode apk文件路徑
// 效果一樣 反編譯
apktool d apk文件路徑 o 解壓目錄
2.重新打包
使用 b 或 build
apktool b 解壓後的項目目錄 -o 新apk的名字
// 重新打包生成的 apk 需要簽名才能安裝
3.拓展反編譯的配置
#-api, --api-level <API>
指定生成smali文件所用的api等級,預設使用targetSdkVersion版本
#-b, --no-debug-info
防止baksmali寫出調試信息(.local,.param,.line等)。如果您要比較來自不同版本的同一APK的smali,則首選使用。
#-f, --force
如果反編譯的目標目錄存在,將會被強制清空
#--force-manifest
強制反編譯 AndroidManifest.xml文件,優先順序高於 -s, --no-src 配置。
#--keep-broken-res
如果出現 "Invalid Config Flags Detected. Dropping Resources..." 錯誤,這表示apk中有apktool不能識別的結構。可能是apktool不支持的更新的api版本,亦或者是該apk為不規則的apk。你可以添加此配置,以跳過錯誤,但後續你需要手動修複這些錯誤。
#-m, --match-original
將各文件處理為最接近原生的形式,將會導致不能備重新打包。
Ps:我試了下,格式確實更接近原生,但是我重新打包也是成功了(打包成功,但並未簽名安裝)。
#--no-assets
不處理和拷貝屬於 unknown 的資源文件。
#-o, --output <DIR>
指定輸出目錄
#--only-main-classes
只反編譯apk根目錄下的dex文件,如:classes[0-9].dex
通過閱讀源碼發現,此配置的作用為:反編譯根目錄下的以 classes 開頭,並以 .dex 結尾的dex文件,不僅限於0-9
#-p, --frame-path <DIR>
指定存儲和載入framework的目錄
#-r, --no-res
不反編譯資源,保留 resources.arsc 為原來的樣子,如果你只是需要修改代碼,此配置會加快反編譯和重新打包的速度。
#-s, --no-src
不反編譯代碼,即不處理 dex文件。如果你只是需要修改資源,此配置會加快反編譯和重新打包的速度。
#-t, --frame-tag <TAG>
使用指定的framework進行反編譯,前文有述。
4.拓展重新打包配置
#-a, --aapt <FILE>
指定使用的aapt,當指定目錄未找到aapt時,會使用apktool自帶的aapt進行處理。
#-api, --api-level <API>
指定處理smali文件的api版本,預設使用minSdkVersion版本
#-c, --copy-original
拷貝原始 AndroidManifest.xml and META-INF 到apk包體中。將會在2.5.0版本移除此功能。
#-d, --debug
在 AndroidManifest 加入 debuggable="true" 配置
此配置,不會覆蓋已經存在的debuggable配置。
#-f, --force-all
當生成的文件存在時,進行強制覆蓋
#-nc,--no-crunch
此配置會傳遞給aapt,參閱:
Expose the aapt --no-crunch option by Novex · Pull Request #1849 · iBotPeaches/Apktool · GitHub
aapt build in apktool is not support new options · Issue #1232 · iBotPeaches/Apktool · GitHub
禁止對資源文件的處理
#-o, --output <FILE>
指定apk的輸出目錄
#-p, --frame-path <DIR>
指定載入framework的路徑
#--use-aapt2
使用aapt2進行打包
5.編譯後目錄打開
#subl進行打開
#subl的安裝http://www.sublimetext.com/3
subl 反編譯後文件目錄