Apktool 參數(shù)詳解

上一篇?Apktool 使用教程 - 簡(jiǎn)書?簡(jiǎn)單說明了以下 apktool 的基本使用。能夠反編譯和重新打包一個(gè)apk了。

如果你學(xué)會(huì)了使用 -d ,-b 進(jìn)行apk的反編譯和重新打包。

那么恭喜你!apktool你已經(jīng)學(xué)會(huì)了90%的使用了,你也能夠反編譯絕大多數(shù)的apk了。

但事情總有小小的例外,有那么一些apk它就是不讓你如愿。比如加固過的,或者一些廠商的系統(tǒng)應(yīng)用,它們依賴了一些系統(tǒng)特有的resource,你不得不進(jìn)行特殊處理,才能成功的反編譯,甚至有時(shí)候需要你去修改apktool的源碼。

所以,這一篇文章就是告訴你那些你平時(shí)可能不注意的小細(xì)節(jié),不常用的參數(shù)到底有什么用。

注意:本文所用apktool版本為,2.4.1。

官網(wǎng)介紹:Apktool - Documentation

1、-d 反編譯

apktool d bar.apk -o baz

apktool decode bar.apk -o baz

你可以使用-o來指定反編譯的輸出目錄,如上命令為 反編譯 bar.apk 到 baz 目錄,也可以使用絕對(duì)路徑,輸出到任意目錄。

decode 和 d 以及 -d 等效。

2、-b 打包apk

apktool b bar -o new_bar.apk

apktool build bar -o new_bar.apk

你可以使用-o來指定重新打包的輸出目錄,如上命令為 重新編譯bar目錄下的結(jié)構(gòu)到 new_bar.apk,也可以使用絕對(duì)路徑,輸出到任意目錄。

build 和 b 以及 -b 等效。

3、if?or?install-framework 安裝 framework

(1)apktool if framework-res.apk

安裝?framework-res.apk 到默認(rèn)目錄,默認(rèn)目錄如下:

????????unix -?$HOME/.local/share/apktool

????????windows -?%UserProfile%\AppData\Local\apktool

????????mac -?$HOME/Library/apktool

(2)apktool if com.htc.resources.apk -t htc

安裝?framework-res.apk 到默認(rèn)目錄,并添加tag標(biāo)記,最終可能生成 2-htc.apk,前序的數(shù)字,由所安裝的framework的pkgId決定。個(gè)人理解pkgId是所安裝的 framework 的apk中的Manifest中的package字段值。

(3)apktool if framework-res.apk -t baz -p foo/bar

安裝?framework-res.apk 到 -p 指定的目錄,并添加tag標(biāo)記,最終可能在 foo/bar 目錄下生成 2-htc.apk

安裝framework的作用,是讓apktool能夠識(shí)別一些廠商自定義的屬性或resource,否則將反編譯失敗。

每一個(gè)版本的apktool都會(huì)自帶有最新AOSP的framework,能支持絕大多數(shù)的apk反編譯。當(dāng)需要特殊的framework時(shí),如何尋找相應(yīng)的framework,請(qǐng)參閱apktool文檔中的內(nèi)容,此處不再詳述。

如何找到framework


(4)注意:你需要自己確保默認(rèn)的framework是最新的

apktool會(huì)將自帶的framework拷貝到默認(rèn)路徑下,各平臺(tái)默認(rèn)路徑,請(qǐng)參考上文。

但是,當(dāng)你升級(jí)apktool之后,最好是去掉默認(rèn)路徑下的framework,讓apktool自動(dòng)安裝最新的(自帶的)framework。

同時(shí),當(dāng)默認(rèn)路徑不可用(通常是無權(quán)限)時(shí),apktool會(huì)使用 /tmp 目錄,但是此目錄通常都不穩(wěn)當(dāng),你可以使用?--frame-path(也就是上文提到的 -p ) 指定一個(gè)其他的穩(wěn)定的目錄。

從2.2.1版本開始,apktool加入了相應(yīng)的命令,可以完成此操作。?

apktool empty-framework-dir?

命令會(huì)清除framework目錄下的所有已安裝的framework

(5)apktool不會(huì)判斷framework是否重復(fù)安裝了,你可以任意安裝

4、使用指定的framework進(jìn)行反編譯

當(dāng)你安裝了不同的framework,并且其中一些framework可能是互不兼容的,那么你在反編譯的時(shí)候需要指定使用相應(yīng)的framework。

安裝不同的framework,并指定tag

使用指定的framework進(jìn)行反編譯,注意查看log中的區(qū)別。

使用不同的framework進(jìn)行反編譯

同時(shí)需要說明的是,當(dāng)你使用了指定的framework進(jìn)行反編譯后,想要重新打包apk時(shí),不需要再進(jìn)行framework的指定了,apktool會(huì)自動(dòng)使用反編譯時(shí)使用的framework進(jìn)行重新打包。

5、關(guān)于.9圖的問題

谷歌官方文檔上有.9圖的說明,但是說漏了一些東西。

.9圖有兩種存在形式,一種是"源碼"形式,一種是經(jīng)過編譯處理的形式。

"源碼"形式很容易得到,我們平時(shí)寫apk所用的到就是這種形式,網(wǎng)上也能方便的找到。而apk中的.9圖,是經(jīng)過編譯處理后的圖。

"源碼"形式的.9圖,帶有透明的邊框,而編譯后的.9圖,不再存在這種透明邊框,編譯后的圖存在一種叫做?npTc 數(shù)據(jù)塊的結(jié)構(gòu)中。你不能方便的查看和修改它,但是Android系統(tǒng)可以更快的讀取和使用它。

以上的情況就會(huì)導(dǎo)致,apktool不能直接去修改.9圖,而需要依賴谷歌官方的工具 -- aapt進(jìn)行處理。

6、Options

? ? 常用的配置

(1)-version, --version

? ? 輸出當(dāng)前工具版本

(2)-v, --verbose

? ? 輸出所有l(wèi)og,此參數(shù)必須放在第一位

(3)-q, --quiet

? ? 靜默模式,與?-v, --verbose 相反,此參數(shù)必須放在第一位

(4)-advance, --advanced

? ? 進(jìn)行每一步操作前,打印相應(yīng)log。默認(rèn)開啟。


????清空framework的配置

(1)-f, --force

? ? 強(qiáng)制清除目標(biāo)目錄

(2)-p, --frame-path <DIR>

? ? 指定加載framework的目錄

? ? 反編譯的配置

(1)-api, --api-level <API>

? ? 指定生成smali文件所用的api等級(jí),默認(rèn)使用targetSdkVersion版本

(2)-b, --no-debug-info

? ??防止baksmali寫出調(diào)試信息(.local,.param,.line等)。如果您要比較來自不同版本的同一APK的smali,則首選使用。

(3)-f, --force

? ? 如果反編譯的目標(biāo)目錄存在,將會(huì)被強(qiáng)制清空

(4)--force-manifest?

? ? 強(qiáng)制反編譯 AndroidManifest.xml文件,優(yōu)先級(jí)高于?-s, --no-src 配置。

(5)--keep-broken-res

? ? 如果出現(xiàn)?"Invalid Config Flags Detected. Dropping Resources..." 錯(cuò)誤,這表示apk中有apktool不能識(shí)別的結(jié)構(gòu)。可能是apktool不支持的更新的api版本,亦或者是該apk為不規(guī)則的apk。你可以添加此配置,以跳過錯(cuò)誤,但后續(xù)你需要手動(dòng)修復(fù)這些錯(cuò)誤。

(6)-m, --match-original

? ? 將各文件處理為最接近原生的形式,將會(huì)導(dǎo)致不能備重新打包。

? ? Ps:我試了下,格式確實(shí)更接近原生,但是我重新打包也是成功了(打包成功,但并未簽名安裝)。

(7)--no-assets

? ? 不處理和拷貝屬于?unknown 的資源文件。

(8)-o, --output <DIR>

? ? 指定輸出目錄

(9)--only-main-classes

? ? 只反編譯apk根目錄下的dex文件,如:classes[0-9].dex

? ? 通過閱讀源碼發(fā)現(xiàn),此配置的作用為:反編譯根目錄下的以?classes 開頭,并以 .dex 結(jié)尾的dex文件,不僅限于0-9

(10)-p, --frame-path <DIR>

? ? 指定存儲(chǔ)和加載framework的目錄

(11)-r, --no-res

? ? 不反編譯資源,保留?resources.arsc 為原來的樣子,如果你只是需要修改代碼,此配置會(huì)加快反編譯和重新打包的速度。

(12)-s, --no-src

? ? 不反編譯代碼,即不處理 dex文件。如果你只是需要修改資源,此配置會(huì)加快反編譯和重新打包的速度。

(13)-t, --frame-tag <TAG>

? ? 使用指定的framework進(jìn)行反編譯,前文有述。

????重新打包配置

(1)-a, --aapt <FILE>

? ? 指定使用的aapt,當(dāng)指定目錄未找到aapt時(shí),會(huì)使用apktool自帶的aapt進(jìn)行處理。

(2)-api, --api-level <API>

? ? 指定處理smali文件的api版本,默認(rèn)使用minSdkVersion版本

(3)-c, --copy-original

? ? ?拷貝原始 AndroidManifest.xml?and?META-INF 到apk包體中。將會(huì)在2.5.0版本移除此功能。

(4)-d, --debug

? ? ?在 AndroidManifest 加入?debuggable="true" 配置

? ? ? ? 此配置,不會(huì)覆蓋已經(jīng)存在的debuggable配置。

(5)-f, --force-all

? ? 當(dāng)生成的文件存在時(shí),進(jìn)行強(qiáng)制覆蓋

(6)-nc,--no-crunch

? ? 此配置會(huì)傳遞給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

? ? 禁止對(duì)資源文件的處理

(7)-o, --output <FILE>

? ? 指定apk的輸出目錄

(8)-p, --frame-path <DIR>

? ? 指定加載framework的路徑

(9)--use-aapt2

? ? 使用aapt2進(jìn)行打包


以上就是apktool目前支持的所有配置,下一篇文章,將會(huì)進(jìn)一步深入源碼,去看看apktool到底都做了些什么。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容