最近对接一款游戏,拿到母包的时候按照以往的套路打包,想着估计没什么问题,毕竟打包这么多回了,门儿清的很。
可是不好的事情还是发生了,回编译的时候报了个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就可以了呀,然后我终于在找到了,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)使用里面提供的什么,应该就好了
3.也就是我遇到的,脚本工具单独使用了aapt去生成R文件,那就找到2.3以上的apktool,解压找到里面的aapt文件,替换到你原来使用的就好
大致就是这些了,说的不好别打人,字有点多,图有点少!!!