一 .番外篇Apktool作用
各位看官們孵班,在上一篇blog中Apktool 手動構(gòu)建源碼需要了解的事情略微提及了Apktool是干嘛的困肩,那么我先給大家詳細(xì)介紹下带族。
1.apktool是什么
Apk本質(zhì)上是一個包含資源和匯編Java代碼的壓縮(.zip)包恃轩,把xx.apk后綴改成xx.zip
解壓后會看到classes.dex和resources.arsc等文件结洼。
但這些文件對我們來說沒有什么用處完全看不懂,你可以嘗試打開AndroidManifest.xml:可以看到如下內(nèi)容叉跛,完全是一臉懵逼 都是什么東西松忍?
此時就是apktool發(fā)揮用處的時候了,apktool開源庫提供了一系列的命令幫助我們解決這個懵逼的事情
使用apktool d 解碼命令后筷厘,再次看AndroidManifest.xml 發(fā)現(xiàn)清單文件可讀性變高鸣峭,無限接近源碼。
同理除了xml酥艳,資源(例如.9圖摊溶,圖片,布局充石,字符串等)也已正確解碼為源格式莫换。
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通用命令
- 查看apktool 當(dāng)前版本
-version 挽懦,--version
apktool --version
- 詳細(xì)輸出apktool 命令翰意,該參數(shù)必須作為第一個參數(shù)
-v,--verbose
apktool -v
- 靜默輸出信柿,即輸出是不顯示詳細(xì)信息冀偶,該參數(shù)必須作為第一個參數(shù)
-q,--quiet
apktool -q
- 命令行每一步操作前渔嚷,打印詳細(xì)信息
-advance进鸠,--advanced
apktool -advance
三 .清除framework目錄時的所有命令。
- 強(qiáng)制刪除目標(biāo)目錄
-f圃伶,--force
- 指定framework文件儲存的位置堤如。
-p,--frame--path <dir>
四.反編譯(Decode)時所有命令選項
反編譯是什么:即解碼 將apk文件拆解成若干文件夾
反編譯命令 :apktool d apk路徑
例如:apktool d C:\Users\Administrator\Desktop\app.apk
反編譯后的生成的文件如下窒朋,original \ apktool.yml是apktool生成的臨時文件搀罢,可忽略
- 生成所用smali文件的api等級(默認(rèn)為 targetSdkVersion)
-api,--api-level <api>
apktool d -api 21 C:\Users\Administrator\Desktop\demo.apk
- 防止baksmali打印出調(diào)試信息
-b 侥猩,--no--debug-info
apktool d -b C:\Users\Administrator\Desktop\demo.apk
- 強(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 命令即可解決
- 強(qiáng)制反編譯AndroidManifest.xml文件 (v2.3.1新增)
--force-manifest
apktool d --force-manifest C:\Users\Administrator\Desktop\demo.apk
- 如果出現(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
- 將各文件處理為最接近原生的形式请梢,將會導(dǎo)致不能備重新打包赠尾。
-m ,--match-original
apktool d -m C:\Users\Administrator\Desktop\demo.apk
備注:針對這個命令有點迷毅弧,前半句說的沒錯反編譯后文件更接近原生的形式萍虽,重點在后半句,官網(wǎng)描述這個命令會導(dǎo)致無法重新打包形真,然而我親自試了一下重新打包簽名后一切正常,一臉懵逼超全。
demo 2.png這張圖片是正常反編譯后的清單文件
demo.png這張圖片是-m 命令反編譯后的清單文件咆霜,可以清晰的看出執(zhí)行-m命令后,
的確更接近原生編譯器的內(nèi)容。
- 不處理和拷貝屬于 unknown 的資源文件
--no-assets
apktool d --no-assets C:\Users\Administrator\Desktop\demo.apk
- 將反編譯后的文件寫入到指定的文件路徑下(這個命令比較常用)
-o嘶朱, --output <DIR>
apktool d -f C:\Users\Administrator\Desktop\demo.apk -o C:\Users\Administrator\Desktop\decode
- 反編譯根目錄中的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 文件
- 指定framework文件儲存的位置倘零。
-p, --frame-path <DIR>
- 不反編譯資源戳寸,保留 resources.arsc 為原來的樣子呈驶,如果你只是需要修改代碼,此配置會加快反編譯和重新打包的速度疫鹊。
-r袖瞻, --no-res
apktool d -r C:\Users\Administrator\Desktop\demo.apk
- 不反編譯代碼,即不處理 dex文件拆吆。如果你只是需要修改資源聋迎,此配置會加快反編譯和重新打包的速度。
-s枣耀, --no-src
apktool d -s C:\Users\Administrator\Desktop\demo.apk
- 給生成的framework文件打上標(biāo)識
-t霉晕, --frame-tag <TAG>
五. 回編(Rebuild)時所有命令
回編是什么:即將解包后的文件重新生成未簽名的APK文件(需要重新簽名才可被安裝使用)
回編命令:apktool b 反編譯后的apk文件夾
例如:apktool b C:\Users\Administrator\Desktop\demo
回編后未簽名的apk,如果沒有用 -o命令 指定新路徑奕枢,會在默認(rèn)路徑下dist文件
- 從指定的路徑加載aapt娄昆,指定目錄未找到aapt時,會使用apktool自帶的aapt進(jìn)行處理缝彬。
-a萌焰, --aapt <FILE>
apktool b -a C:\Windows\System32\aapt.exe C:\Users\Administrator\Desktop\demo
- 要建立的smali文件的數(shù)字api級別(默認(rèn)為minSdkVersion) -v2.4.0添加
-api, --api-level <API>
apktool b -api 10 C:\Users\Administrator\Desktop\demo
- 復(fù)制原始的AndroidManifest.xml 和 META-INF文件到內(nèi)置的apk中 (v2.5.0-將棄用)
-c, --copy-origina
apktool b -c C:\Users\Administrator\Desktop\demo
- 添加debuggable="true"到AndroidManifest文件谷浅。
-d 扒俯,--debug
apktool b -d C:\Users\Administrator\Desktop\demo
- 回編時候強(qiáng)制覆蓋存在的文件
-f 奶卓,--force-all
apktool b -f C:\Users\Administrator\Desktop\demo
- 回編時禁止對資源文件進(jìn)行處理 (v2.4.0新增)
-nc ,--no-crunch
apktool b -nc C:\Users\Administrator\Desktop\demo
- 回編時指定生成apk生成路徑
-o 撼玄,--output<file>
apktool b C:\Users\Administrator\Desktop\demo -o C:\Users\Administrator\Desktop\demo_unsigned.apk
- 從指定位置加載 framework的路徑
-p 夺姑,--frame-path<dir>
- 使用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)去查英文文檔。