Android逆向工程之aar包转jar包找不到R文件的问题

遇到的问题

目前的工作是游戏出渠道包,使用的apktool反编译apk,然后打入渠道SDK,然后回编译生成渠道包的方式
在新接渠道SDK是,发现渠道的依赖包是aar,那就需要将之解压,将jar转成smail文件放入游戏包的samil目录下,把so放入游戏包的libs中,将res放入游戏包的res目录下,再解决一些资源名重复的问题,本来以为都完工了,因为以前就是这么干的,但是打完包运行的时候,使用到SDK的地方直接报错,报错信息如下:
在这里插入图片描述

找解决思路

以上的大致意思是SDK中的代码找不到对应的R文件,那就是说aar对R文件有专门的定义,当AS依赖aar时,会以aar的包名对R重新生成,这也就是为什么eclipse依赖aar需要将其改成一个工程去依赖,而不是直接解压将对应资源放入对应文件这么简单(eclipse依赖工程回生成自己的R文件)。

第一次尝试

根据以上思路我们使用aapt对aar中的资源文件单独生成R文件,然乎将这个R文件也转成smail,放入游戏包的smail目录下,这样SDK就能找到对应的R文件了。

  1. 找到Android SDK下的aapt.exe和android.jar(最好都是8.0以上的),放在解压好的aar文件夹中,还新建一个gen的文件夹(叫啥无所谓,主要是在下面的命令中用到)
    (PS:aar中的res如果是空的话,就说明jar中的代码没有自己的资源,是不需要单独的R文件的)在这里插入图片描述
  2. cmd进入当前目录,使用命令aapt.exe p -f -m -J gen -S res -I android_9.0.jar -M AndroidManifest.xml,就会在跟目录下生成以AndroidManifest中package为包名的R文件

    在这里插入图片描述
  3. 然后将R.java文件编译,转换为samil放入游戏包的samil目录下,当然res下的文件该合并到母包中还是要合并的,这时候SDK应该不会找不到R文件了

然后再次回编译运行,报了个新的错,xml解析错误,如下:在这里插入图片描述

第二次尝试

我就很气,这是系统的xml文件,怎么可能出问题,而且提示找不到系统类,纠结了一天之后,对比通过AS依赖aar包编译出来的R文件,发现一个致命的问题,虽然AS为aar生成的R文件与apk包名下的R文件不一样大,但是只是少了些定义,已有的定义都是一摸一样的,不管是值还是变量名,那我就知道了,这两份R文件其实是同一份,只是包名不同而已,再加上AS为aar的R文件做了优化处理,剔除了aar不需要的R定义

那么我们打入了新的SDK之后,回编译的时候不是会针对新合并好的res文件生成一个apk包名下的R文件吗,那我们在为apk包名生成R文件的同时,也为aar的包名生成一份你同样的R文件。

至于为什么是同时再生成一份,而不是直接拷贝apk包名目录下的R文件到aar包名目录下,我只是感觉里面可能会有很多用到包名引用的地方,重新生成保险。至于直接拷贝,我也没试过,我也不知道
(PS:剔除这一步就不用做了,实力不允许,我也不知道剔除的原理是什么,以后再慢慢研究)

总结

aar是根据AS的习性设计的,我们抛开AS想要使用aar文件,就需要处理除了jar和res之外还有R文件的生成,R文件的生成不能只针对aar的资源单独生成,要合并好母包和aar的全部资源之后生成的R文件才能正确引用到资源,所以我们应该在为apk生成包名所对应的R文件的同时也为aar生成一份相同的R文件,内容一样包名不同而已

后记

这里面没有讲到的问题有很多,使用那行命令的参数分别是什么意思,为什么要为回编译的apk重新生成一个apk包名下的R文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值