CreateProcess error=206, 文件名或扩展名太长的问题

最近在使用apktool反编译某款项目,再重新编译回去时,出现以下错误:

CreateProcess error=206, 文件名或扩展名太长的问题_第1张图片
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下面执行命令过长,因此失败。

CreateProcess error=206, 文件名或扩展名太长的问题_第2张图片
doNotCompress下的文件太长(后续还有很多)

下面就简单了,clone下来apktool的源码,修改Androidlib类下面的NO_COMPRESS_PATTERN,将txt格式添加进去:

CreateProcess error=206, 文件名或扩展名太长的问题_第3张图片
Androidlib路径
CreateProcess error=206, 文件名或扩展名太长的问题_第4张图片
修改Androidlib类不被压缩类型

并重新生成jar包:

CreateProcess error=206, 文件名或扩展名太长的问题_第5张图片
新jar包

此时进行尝试,可以看到,doNotCompress已经没有问题:

CreateProcess error=206, 文件名或扩展名太长的问题_第6张图片
修正后的apktool重新反编译

再编译回去也是OK的:

CreateProcess error=206, 文件名或扩展名太长的问题_第7张图片
反编译成功

注意一:

private static final Pattern NO_COMPRESS_PATTERN = Pattern.compile("...")内的内容是来源于:

android / platform / frameworks / base / android-8.1.0_r22 / . / tools / aapt / Package.cpp

CreateProcess error=206, 文件名或扩展名太长的问题_第8张图片
不需压缩格式

所以按照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

apktool打包之后apk包体变大

注意三:

在clone下来apktool源码时候,一定最好要下载release版本的代码,不要直接去github下载,

因为直接去github下载的话,拿到的可能是alpha版本或者dirty版本:

CreateProcess error=206, 文件名或扩展名太长的问题_第9张图片
alpha版本

你很难保证这个版本就一定是稳定版本(因为被坑了整整一天,clone下来之后反编译再编译回一直出问题)

所以还是直接去Apktool/releases/tag/v2.3.2里面下载好了。

你可能感兴趣的:(CreateProcess error=206, 文件名或扩展名太长的问题)