最近在使用apktool反编译某款项目,再重新编译回去时,出现以下错误:
在网上搜索相关内容,可以看到这个是因为window下使用IDE或者命令行时出现的问题:命令行支持的字符串长度有限制,字符串的长度是8191个字符。
解决方案就是:
1、缩短项目文件的目录层级;
2、改用linux;
但是上面梁中方案针对apktool来说改动都太大,不宜使用;
因此直接去apktool官网找答案,可以看到已经有人遇到相同问题:
Decompile An Apk success,But Recompile fail #1623
可以看到出现的问题基本一致,确认是因为window限制cmd字符串长度 。
根据apktool的issue这里面说明:
filename or extension is too long when recompile apk #1272
是由于反编译之后apktool.yml中doNotCompress内容过长所导致,其中包含了大量的assets下面的txt文件导致在cmd下面执行命令过长,因此失败。
下面就简单了,clone下来apktool的源码,修改Androidlib类下面的NO_COMPRESS_PATTERN,将txt格式添加进去:
并重新生成jar包:
此时进行尝试,可以看到,doNotCompress已经没有问题:
再编译回去也是OK的:
注意一:
private static final Pattern NO_COMPRESS_PATTERN = Pattern.compile("...")内的内容是来源于:
android / platform / frameworks / base / android-8.1.0_r22 / . / tools / aapt / Package.cpp
所以按照google的注释其实是,默认在生成apk时候,aapt会选择性的压缩各种资源来节省设备空间,aapt使用后缀来决定哪个资源需要压缩,aapt源码定义了一些不需要压缩的文件后缀,见上 。
注意二:
偶尔反编译之后会出现apktool处理后的apk包跟原始母包大小不一致,此时其实也可以检查一下doNotCompress属性内是不是有一些压缩文件后缀的问题,比如.json文件,在原始母包内被压缩,但是反编译之后由于默认是不压缩,所以导致大小有区别,此时可以针对apktool动态调整一下不压缩的文件类型即可。
参考:
CREATEPROCESS ERROR=206,文件名或扩展名太长
What is the command line length limit?
filename or extension is too long when recompile apk #1272
注意三:
在clone下来apktool源码时候,一定最好要下载release版本的代码,不要直接去github下载,
因为直接去github下载的话,拿到的可能是alpha版本或者dirty版本:
你很难保证这个版本就一定是稳定版本(因为被坑了整整一天,clone下来之后反编译再编译回一直出问题)
所以还是直接去Apktool/releases/tag/v2.3.2里面下载好了。