apk逆向工程之aapt生成R文件报错

最近对接一款游戏,拿到母包的时候按照以往的套路打包,想着估计没什么问题,毕竟打包这么多回了,门儿清的很。

可是不好的事情还是发生了,回编译的时候报了个first type is not attr,百度了半天,都没找到解决方案(其实一开始就有解决方案了,只是我眼神不好,理解能力较差,没注意)。

网上说是由于apk包是as中的aapt2打出来的,而apktool使用的是aapt,所以回编译的时候出现了是用aapt去回编译aapt2打的包

由于aapt中要个强校验,public.xml中首个type必须是attr,否者就不干活了

解决方法是要么降低as的gradle版本到3.0以下,或者使用enableAapt = false禁用掉aapt2打包

但是前者被CP(也就是游戏研发)方拒绝,他们说unity导出版本是gradle4.5,不能降了,后者呢试了之后发现,as提示enableAapt2 = false这种方式将在2018年底被移除,现在都9102年,所以扑街;最后只能去升级我们的打包工具来解决了

按理说apktool早就解决了这个问题,就算版本太低更新一下apktool版本就好了,并且我用apktool单独反编译回编译没有任何问题,这样我就想问题定位到了打包脚本上了(没错,我们用的就是打包脚本,因为手动反编译,修改之后再回编译太麻烦了)

终于,我定位到了一个方法,打入渠道SDK之后生成新R文件的方法,发现我们脚本不是借助apktool去生成R文件,而是使用单独的aapt.exe去生成,这样就需要单独更新aapt工具了,然后找到as中最新的aapt过来,结果还是大失所望

然后我就想既然是aapt2打的包,那我使用aapt2工具来生成R文件不就好了吗,然后我就开始找aapt2的使用方式,结果发现,我滴娘啊,用法和aapt完全不同,要什么先compile再link啥啥啥的,在下才疏学浅,没学会(我也很绝望啊)

以我的脾气,紧接着就放弃了使用aapt2的念头,继续扑倒apktool中,它也没用aapt2,但是可以正常回编译(如果apktool要是用aapt2的话需要在命令行中加上 --use aapt2的)

但是我使用的时候直接是apktool.exe d xx.apk  apktool.exe b xx.apk,所以apktool默认情况一定不是使用的aapt2,接着我就看各种文章,终于在快下班的时候在刚出问题时候看的第一篇文章中找到了线索

就是这篇啊(https://baijiahao.baidu.com/s?id=1612770712213635730&wfr=spider&for=pc),上面有个地方写到

那么也就是说apktool的作者将aapt源码改动了,然后用到了apktool中,我一拍脑门,我可以在apktool中找出改过的aapt,然后拿出来替换我现在使用的aapt就可以了呀,然后我终于在apk逆向工程之aapt生成R文件报错_第1张图片找到了,hiahiahia,我真是个天才

接着我就拿出里面的aapt.exe替换现有的,然后打包,完美通过,嗯。。。。我就是个天才

 

那么就下来终结一下,毕竟逼逼叨叨一大堆,还不如直接说解决方法

1.首先联系CP方,看他们的gradle版本能不能降到3.0以下,重新出包(由于enableAapt2 = false在18年底已经被as移除,所以这里也就不讲了)(估计是不行了,因为现在as这么高的版本了,都支持kotlin了,gradle版本更是5.x了)

2.最简单的,如果没有单独使用aapt去生成R文件的话,使用apktool2.3以上的应该就没啥问题,如果还有问题,就去(https://baijiahao.baidu.com/s?id=1612770712213635730&wfr=spider&for=pc)使用里面提供的什么apk逆向工程之aapt生成R文件报错_第2张图片,应该就好了

3.也就是我遇到的,脚本工具单独使用了aapt去生成R文件,那就找到2.3以上的apktool,解压找到里面的aapt文件,替换到你原来使用的就好apk逆向工程之aapt生成R文件报错_第3张图片

大致就是这些了,说的不好别打人,字有点多,图有点少!!!

 

你可能感兴趣的:(android)