一、报错描述
废话不多说,先上报错信息:
I: Copying unknown files...
I: Copying original files.
ED: \Android\apk>apktool b reverse/ shucainali
I: Using Apktool 2.8.1
T: Checking whether sources has changed.
I: Smaling smali folder into classes. dex.
I: Checking whether resources has changed. .
Building resources.
10-07 11:08:39. 29117520 1604 W ziparchive: Unable to open ’ C: \Users\◆❷❸\AppData\Local
\apktool \framework\1. apk' : Illegal byte sequence
W: 10-07 11:08:39.292 17520 1604 W zipro
Error opening archive C: \Users\❷❷❷\AppData\L
ocal \apktool \framework\1. apk: I/0 error
W: 10-07 11:08:39.303 17520 1604 W ResourceType: No known package when getting value for res
ource number 0x01010000
V: 10-07 11:08:39. 303 17520 1604 W ResourceType: Invalid package identifier when getting bag
for resource number 0x0101 0000
V: 10-07 11:08:39. 304 17520 1604 W thread
WARNING: bad result from unlocking mutex
W: D: \Android\apk \reverse \shucainali \AndroidManifest. xml:1: error: No resource identifier fou
nd for attribute’ compileSdkVersion in package’ android'
图片上面的问题总结一下为“apk反编译后重打包失败”。通过上网搜索,向老师请教,确定报错原因为:“使用了中文用户名,导致框架资源无法被搜索到”。
我按照正常步骤进行如下:
1、首先在下载完apktool.jar和apktool.bat,部署完环境变量之后,来到存放apk文件的目录(我的是D:\Android\apk\),对其进行解压:(参考安装工具文章一、工具教程文章一)
1)解包文件:执行命令{apktool d shucainalipao.apk -o D:\Android\apk\reverse\shucai}
2)修改文件:这个时候还可以对文件进行修改,找到.smail文件,进行修改。不过需要熟悉技术,这里不做展示,tcl。
3)重打包:还是在存放apk文件目录下,执行命令:
命令一:apktool b reverse/shucai
命令二:apktool b D:\Android\apk\reverse\shucai -o D:\Android\apk\reverse\shucai\dist\shucai.apk
按照预期目的,会在reverse/shucai/dist目录下生成shucainalipao.apk文件。然鹅执行之后,只生成了reverse/shucai/build目录下的dex文件,这是为啥子?下面我们开始解决问题。
二、解决过程
1、首先,我们在解包文件这一步,执行命令:
apktool d shucainalipao.apk -o D:\Android\apk\reverse\shucai -p D:\Android\apktools\framework
d后面参数表明要解压的apk文件位置;
-o后面参数为解压后的目录,不能是已经存在的,需要写一个新的,如果不写的话,默认在当前目录下再创建一个与apk文件名同名(shucainalipao)的文件夹;
-p是指定加载framework的目录。当然也可以把原来在你中文用户目录下的那个1.apk复制过来,复制到指定文件夹(我这里是D:\Android\apktools\framework,自己新建的,便于管理)
2、然后在重打包这一步,之后本来还是直接执行{apktool b reverse/shucai}这个命令,然后出现报错:brut.androlib.exceptions.AndrolibException: --frame-path is set to a file, not a directory.意识到应该用这个命令执行一下调用框架资源的目录,并且它不是一个文件,而是一个目录。
修改后的执行命令:
apktool b reverse/shucai --frame-path D:\Android\apktools\framework
最终成功啦!在reverse/shucai->dist目录下自动生成shucainalipao.apk文件
三、总结
其实就是framework在含有中文目录的文件夹下,而又因为是默认加载这个路径,却由于乱码问题不能被加载到。我们给它重新指定一个(注意路径中不能有中文),就阔以重打包啦!
参考文章:
解决文章一(隐隐指出是没有指定框架资源的路线,来避免apktool使用默认路径)
解决文章二(指明在反编译时用-p指定了反编译生成的framework,在重打包时就不需要了)
文章四(官方文档,可我看不出一个所以然,希望对你有收获)
拓展文章一(指出了在Manifest.xml文件中需要删除那些报错属性,但是我并没有这样做)