Apktool 命令大全,不全你來打我

一 .番外篇Apktool作用

各位看官們孵班,在上一篇blog中Apktool 手動構(gòu)建源碼需要了解的事情略微提及了Apktool是干嘛的困肩,那么我先給大家詳細(xì)介紹下带族。

1.apktool是什么

Apk本質(zhì)上是一個包含資源和匯編Java代碼的壓縮(.zip)包恃轩,把xx.apk后綴改成xx.zip
解壓后會看到classes.dex和resources.arsc等文件结洼。

apk.zip.png

但這些文件對我們來說沒有什么用處完全看不懂,你可以嘗試打開AndroidManifest.xml:可以看到如下內(nèi)容叉跛,完全是一臉懵逼 都是什么東西松忍?

AndroidManifest.xml.png

此時就是apktool發(fā)揮用處的時候了,apktool開源庫提供了一系列的命令幫助我們解決這個懵逼的事情

使用apktool d 解碼命令后筷厘,再次看AndroidManifest.xml 發(fā)現(xiàn)清單文件可讀性變高鸣峭,無限接近源碼。

同理除了xml酥艳,資源(例如.9圖摊溶,圖片,布局充石,字符串等)也已正確解碼為源格式莫换。


apktool d .png

2.framework是什么

安卓應(yīng)用程序用到了安卓系統(tǒng)自身的代碼和資源,這些資源被稱為資源框架骤铃,Apktool依靠它們來編譯和反編譯apk操作.

每個Apktool版本在發(fā)布時內(nèi)部都是包含最新的AOSP(安卓開源代碼)框架拉岁,這樣可以解決大部分apk編譯與反編譯的問題。但是除了一些常規(guī)的AOSP文件外惰爬,還有定制的系統(tǒng)框架 例如MIUI系統(tǒng)喊暖,要針對這些廠商apk使用apktool,必須首先安裝廠商的系統(tǒng)框架撕瞧。

例:你要反編譯htc設(shè)備上的系統(tǒng)框架陵叽,會出現(xiàn)如下錯誤消息

$ apktool d HtcContacts.apk
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: 1.apk
W: Could not decode attr value, using undecoded value instead: ns=android, name=drawable
W: Could not decode attr value, using undecoded value instead: ns=android, name=icon
Can't find framework resources for package of id: 2. You must install proper framework files, see project website for more info.

遇到這個錯誤我們需要找到HTC系統(tǒng)框架資源,取出并安裝

$ apktool if com.htc.resources.apk
I: Framework installed to: 2.apk

再次嘗試反編譯命令风范,發(fā)現(xiàn)問題解決了

$ apktool d HtcContacts.apk 
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: /home/brutall/apktool/framework/1.apk
I: Loading resource table from file: /home/brutall/apktool/framework/2.apk
I: Copying assets and libs...

2.1 如何找到 framework文件

正常情況下在/system/framework咨跌,在特殊的設(shè)備上可能存在/data/system-framework或者隱藏在/system/app或/system/priv-app中,通常它們命名格式是res或者framework硼婿。

示例:HTC有一個名為的框架com.htc.resources.apk锌半,LG有一個名為lge-res.apk

找到系統(tǒng)框架文件后,可以通過adb pull 命令 將文件拉出寇漫,拉到本地后刊殉,請注意apktool安裝方式,安裝中框架的命名編號對應(yīng)著應(yīng)用程序的pkgId州胳,取值范圍1-30.

apktool自帶安卓系統(tǒng)框架记焊,該文件會被復(fù)制到$home/apktool/framentwork/1.apk路徑下

注意::需要確保默認(rèn)的framework是最新的,apktool會將自帶的framework拷貝到默認(rèn)路徑下.

2.2 管理框架文件

根據(jù)所使用的操作系統(tǒng)栓撞,框架存儲在不同位置

  • Unix- $HOME/.local/share/apktool
  • windows- %UserProfile%\AppData\Local\apktool
  • mac os - $HOME/Library/apktool

如果這些目錄不可用遍膜,則默認(rèn)創(chuàng)建一個文件夾碗硬,也可以通過--frame-path為框架選擇一個備用文件夾

由于這些位置可能存在隱藏目錄中,這對框架的管理帶來了麻煩瓢颅,你可以執(zhí)行apktool empty-framework-dir 達(dá)到清理framework的目的恩尾。

注意:apktool 一旦安裝就無法控制框架,但是你可以自由的管理這些文件


二 .Apktool通用命令

  1. 查看apktool 當(dāng)前版本

-version 挽懦,--version

apktool  --version
  1. 詳細(xì)輸出apktool 命令翰意,該參數(shù)必須作為第一個參數(shù)

-v,--verbose

apktool  -v
  1. 靜默輸出信柿,即輸出是不顯示詳細(xì)信息冀偶,該參數(shù)必須作為第一個參數(shù)

-q,--quiet

apktool  -q
  1. 命令行每一步操作前渔嚷,打印詳細(xì)信息

-advance进鸠,--advanced

apktool  -advance


三 .清除framework目錄時的所有命令。

  1. 強(qiáng)制刪除目標(biāo)目錄

-f圃伶,--force

  1. 指定framework文件儲存的位置堤如。

-p,--frame--path <dir>


四.反編譯(Decode)時所有命令選項

反編譯是什么:即解碼 將apk文件拆解成若干文件夾

反編譯命令 :apktool d apk路徑

例如:apktool d C:\Users\Administrator\Desktop\app.apk

反編譯后的生成的文件如下窒朋,original \ apktool.yml是apktool生成的臨時文件搀罢,可忽略

apktool d命令.png


  1. 生成所用smali文件的api等級(默認(rèn)為 targetSdkVersion)

-api,--api-level <api>

apktool  d   -api  21   C:\Users\Administrator\Desktop\demo.apk
  1. 防止baksmali打印出調(diào)試信息

-b 侥猩,--no--debug-info

apktool   d    -b  C:\Users\Administrator\Desktop\demo.apk
  1. 強(qiáng)制刪除目標(biāo)文件目錄榔至,執(zhí)行反編譯命令時,強(qiáng)制覆蓋存在欺劳。

-f唧取, --force

apktool  d  -f   C:\Users\Administrator\Desktop\demo.apk

如果當(dāng)前apk已經(jīng)反編譯過了,在執(zhí)行apktool d xxx.apk就會出現(xiàn)下圖所示划提,加上-f 命令即可解決

apktool -f.png
  1. 強(qiáng)制反編譯AndroidManifest.xml文件 (v2.3.1新增)

--force-manifest

apktool   d    --force-manifest      C:\Users\Administrator\Desktop\demo.apk
  1. 如果出現(xiàn)"Invalid Config Flags Detected. Dropping Resources..." 錯誤枫弟,你可以添加此命令,可以跳過此錯誤鹏往,但后續(xù)你需要手動修復(fù)這些錯誤淡诗。 官方解釋:如果出現(xiàn)例如 檢測到無效的資源配置標(biāo)志,正在刪除資源之類的提示(官方這句是英文伊履,我漢譯過來的)韩容。這意味著APK數(shù)據(jù)結(jié)構(gòu)不是Apktool可以處理的,可能是安卓新的版本唐瀑∪盒祝或者不符合一個APK文件的標(biāo)準(zhǔn)。我個人理解為 強(qiáng)制解碼資源哄辣。

--keep-broken-res

apktool   d    --keep-broken-res    C:\Users\Administrator\Desktop\demo.apk
  1. 將各文件處理為最接近原生的形式请梢,將會導(dǎo)致不能備重新打包赠尾。

-m ,--match-original

apktool   d    -m      C:\Users\Administrator\Desktop\demo.apk

備注:針對這個命令有點迷毅弧,前半句說的沒錯反編譯后文件更接近原生的形式萍虽,重點在后半句,官網(wǎng)描述這個命令會導(dǎo)致無法重新打包形真,然而我親自試了一下重新打包簽名后一切正常,一臉懵逼超全。

demo 2.png這張圖片是正常反編譯后的清單文件

demo 2.png

demo.png這張圖片是-m 命令反編譯后的清單文件咆霜,可以清晰的看出執(zhí)行-m命令后,
的確更接近原生編譯器的內(nèi)容。

demo .png
  1. 不處理和拷貝屬于 unknown 的資源文件

--no-assets

apktool   d    --no-assets   C:\Users\Administrator\Desktop\demo.apk
  1. 將反編譯后的文件寫入到指定的文件路徑下(這個命令比較常用)

-o嘶朱, --output <DIR>

apktool   d    -f   C:\Users\Administrator\Desktop\demo.apk  -o    C:\Users\Administrator\Desktop\decode
  1. 反編譯根目錄中的dex文件(v2.4.1新增)

--only-main-classes

apktool   d     --only-main-classes  C:\Users\Administrator\Desktop\demo.apk                                  

注意:此命令適用于apk 里有加密過后的 dex 文件蛾坯,比如有些 apk 的 assets 目錄下有加密后的 dex 文件,添加 –only-main-classes 參數(shù)即可(針對這個異常org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value)

備注:看了下源碼這個命令的引用疏遏,if (file.startsWith("classes") && file.endsWith(".dex")) { }
反編譯根目錄下的以 classes 開頭脉课,并以 .dex 結(jié)尾的dex文件,不僅限于0-9财异。說白了就是反編譯根目錄的classes[0-9].dex 文件

  1. 指定framework文件儲存的位置倘零。

-p, --frame-path <DIR>

  1. 不反編譯資源戳寸,保留 resources.arsc 為原來的樣子呈驶,如果你只是需要修改代碼,此配置會加快反編譯和重新打包的速度疫鹊。

-r袖瞻, --no-res

apktool   d    -r   C:\Users\Administrator\Desktop\demo.apk
  1. 不反編譯代碼,即不處理 dex文件拆吆。如果你只是需要修改資源聋迎,此配置會加快反編譯和重新打包的速度。

-s枣耀, --no-src

apktool   d    -s   C:\Users\Administrator\Desktop\demo.apk
  1. 給生成的framework文件打上標(biāo)識

-t霉晕, --frame-tag <TAG>


五. 回編(Rebuild)時所有命令

回編是什么:即將解包后的文件重新生成未簽名的APK文件(需要重新簽名才可被安裝使用)

回編命令:apktool b 反編譯后的apk文件夾

例如:apktool b C:\Users\Administrator\Desktop\demo

回編后未簽名的apk,如果沒有用 -o命令 指定新路徑奕枢,會在默認(rèn)路徑下dist文件

apktool b.png
  1. 從指定的路徑加載aapt娄昆,指定目錄未找到aapt時,會使用apktool自帶的aapt進(jìn)行處理缝彬。

-a萌焰, --aapt <FILE>

apktool  b  -a   C:\Windows\System32\aapt.exe     C:\Users\Administrator\Desktop\demo
  1. 要建立的smali文件的數(shù)字api級別(默認(rèn)為minSdkVersion) -v2.4.0添加

-api, --api-level <API>

apktool  b    -api     10   C:\Users\Administrator\Desktop\demo
  1. 復(fù)制原始的AndroidManifest.xml 和 META-INF文件到內(nèi)置的apk中 (v2.5.0-將棄用)

-c, --copy-origina

apktool  b   -c     C:\Users\Administrator\Desktop\demo
  1. 添加debuggable="true"到AndroidManifest文件谷浅。

-d 扒俯,--debug

apktool  b     -d    C:\Users\Administrator\Desktop\demo
  1. 回編時候強(qiáng)制覆蓋存在的文件

-f 奶卓,--force-all

apktool  b    -f     C:\Users\Administrator\Desktop\demo
  1. 回編時禁止對資源文件進(jìn)行處理 (v2.4.0新增)

-nc ,--no-crunch

apktool  b   -nc   C:\Users\Administrator\Desktop\demo
  1. 回編時指定生成apk生成路徑

-o 撼玄,--output<file>

apktool  b    C:\Users\Administrator\Desktop\demo  -o C:\Users\Administrator\Desktop\demo_unsigned.apk
  1. 從指定位置加載 framework的路徑

-p 夺姑,--frame-path<dir>

  1. 使用aapt2進(jìn)行回編打包(v2.3.2版本新增)

--use-aapt2

apktool    b     C:\Users\Administrator\Desktop\demo   --use-aapt2


聲明:

參考文獻(xiàn)均來自Apktool 官網(wǎng)文檔: https://ibotpeaches.github.io/Apktool/documentation/

結(jié)語:

此blog只為記錄下apktool常用命令,用到了查下自己blog掌猛,不用每次去翻別人的博客盏浙,也不用去官網(wǎng)去查英文文檔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荔茬,一起剝皮案震驚了整個濱河市废膘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慕蔚,老刑警劉巖丐黄,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孔飒,居然都是意外死亡灌闺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門坏瞄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桂对,“玉大人,你說我怎么就攤上這事惦积〗有#” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵狮崩,是天一觀的道長蛛勉。 經(jīng)常有香客問我,道長睦柴,這世上最難降的妖魔是什么诽凌? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮坦敌,結(jié)果婚禮上侣诵,老公的妹妹穿的比我還像新娘。我一直安慰自己狱窘,他們只是感情好杜顺,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蘸炸,像睡著了一般躬络。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搭儒,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天穷当,我揣著相機(jī)與錄音提茁,去河邊找鬼。 笑死馁菜,一個胖子當(dāng)著我的面吹牛茴扁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汪疮,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼峭火,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了智嚷?” 一聲冷哼從身側(cè)響起躲胳,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纤勒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隆檀,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡摇天,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恐仑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泉坐。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖裳仆,靈堂內(nèi)的尸體忽然破棺而出腕让,到底是詐尸還是另有隱情,我是刑警寧澤歧斟,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布纯丸,位于F島的核電站,受9級特大地震影響静袖,放射性物質(zhì)發(fā)生泄漏觉鼻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一队橙、第九天 我趴在偏房一處隱蔽的房頂上張望坠陈。 院中可真熱鬧,春花似錦捐康、人聲如沸仇矾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贮匕。三九已至,卻和暖如春倾鲫,著一層夾襖步出監(jiān)牢的瞬間粗合,已是汗流浹背萍嬉。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留隙疚,地道東北人壤追。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像供屉,于是被迫代替她去往敵國和親行冰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355