最近在使用apktool反編譯某款項(xiàng)目,再重新編譯回去時,出現(xiàn)以下錯誤:

在網(wǎng)上搜索相關(guān)內(nèi)容,可以看到這個是因?yàn)閣indow下使用IDE或者命令行時出現(xiàn)的問題:命令行支持的字符串長度有限制,字符串的長度是8191個字符。
解決方案就是:
1、縮短項(xiàng)目文件的目錄層級;
2、改用linux;
但是上面梁中方案針對apktool來說改動都太大,不宜使用;
因此直接去apktool官網(wǎng)找答案,可以看到已經(jīng)有人遇到相同問題:
Decompile An Apk success,But Recompile fail #1623
可以看到出現(xiàn)的問題基本一致,確認(rèn)是因?yàn)閣indow限制cmd字符串長度 。
根據(jù)apktool的issue這里面說明:
filename or extension is too long when recompile apk #1272
是由于反編譯之后apktool.yml中doNotCompress內(nèi)容過長所導(dǎo)致,其中包含了大量的assets下面的txt文件導(dǎo)致在cmd下面執(zhí)行命令過長,因此失敗。

下面就簡單了,clone下來apktool的源碼,修改Androidlib類下面的NO_COMPRESS_PATTERN,將txt格式添加進(jìn)去:


并重新生成jar包:

此時進(jìn)行嘗試,可以看到,doNotCompress已經(jīng)沒有問題:

再編譯回去也是OK的:

注意一:
private static final Pattern NO_COMPRESS_PATTERN = Pattern.compile("...")內(nèi)的內(nèi)容是來源于:
android / platform / frameworks / base / android-8.1.0_r22 / . / tools / aapt / Package.cpp

所以按照google的注釋其實(shí)是,默認(rèn)在生成apk時候,aapt會選擇性的壓縮各種資源來節(jié)省設(shè)備空間,aapt使用后綴來決定哪個資源需要壓縮,aapt源碼定義了一些不需要壓縮的文件后綴,見上 。
注意二:
偶爾反編譯之后會出現(xiàn)apktool處理后的apk包跟原始母包大小不一致,此時其實(shí)也可以檢查一下doNotCompress屬性內(nèi)是不是有一些壓縮文件后綴的問題,比如.json文件,在原始母包內(nèi)被壓縮,但是反編譯之后由于默認(rèn)是不壓縮,所以導(dǎo)致大小有區(qū)別,此時可以針對apktool動態(tài)調(diào)整一下不壓縮的文件類型即可。
參考:
CREATEPROCESS ERROR=206,文件名或擴(kuò)展名太長
What is the command line length limit?
filename or extension is too long when recompile apk #1272
注意三:
在clone下來apktool源碼時候,一定最好要下載release版本的代碼,不要直接去github下載,
因?yàn)橹苯尤ithub下載的話,拿到的可能是alpha版本或者dirty版本:
你很難保證這個版本就一定是穩(wěn)定版本(因?yàn)楸豢恿苏惶?,clone下來之后反編譯再編譯回一直出問題)
所以還是直接去Apktool/releases/tag/v2.3.2里面下載好了。