对Android的R文件的研究与逆向实践,使用aapt、java cvf命令、javac命令、dx.jar、、baksmali.jar将R.java生成R.samli合并到母包

上一篇文章讲了“aapt 命令生成 R文件”,这次我们来讲一下Android的R文件

R文件从哪里来

  • Android.jar 中的android包名下自带的R类,R类中有很多嵌套类,比如anim、animator、array、attr、bool、color、dimen、drawable、fraction、id、integer、interpolator、layout、menu、mipmap、plurals、raw、string、style、transition、xml等,如下图

  • AAPT编译res资源文件后生成R,不同的资源类型会生成不同的嵌套类,比如我们在values.xml下定义一个string资源,然后在代码中进行调用,R文件的包名路径与AndroidManifest.xml的manifest元素的package属性一致,当然package属性的取值最终由gradle配置的applicationId决定的,如下图是res下定义自己的资源

  • 代码调用R

R文件的属性值

  • R$xxx类的属性是int类型,代表资源索引,比如android.R.drawable.alert_dark_frame的值为17301504,其8位16进制的表示为0x01080000,是以0x01开头的,后面的01代表资源ID对应的资源的类型,比如01是attr,02是drawable,后面的四位0800代表资源在资源包该资源类型中的编号,0x01可以用来区分是android自带的R文件还是AS自动编译生成的R文件,AS生成的是以0x07开头的,如果是厂商自定义开发的资源文件,会以0x02,0x03等开头

R文件的不同文件类型

  • R.java、R.class文件是开发过程中最长见的,在AS开发中,每个module在build的时候都会根据AndroidManifest.xml中(或者gradle中的applicationId)来生成 包名+R.class文件,这个文件一般存放在build/iintermediates/classes/release或者build/iintermediates/classes/debug目录下,顺着包名目录就能找到相应的R.class文件
  • R.smali文件是apktool反编译之后生成的samli文件,由于R类有很多内部类,所以反编译apk后可以看到有很多R$开头的文件,如果你对samli语法感兴趣,可以看这篇文章http://www.doczj.com/doc/74441680360cba1aa811da8e-40.html

R.java如何转R.samli

  • 我们可以使用aapt生成R.java文件,请参考aapt 命令生成 R文件_林慈桥的博客-CSDN博客
  • 然后再使用javac命令将R.java文件转成R.class,凡是用到java命令的地方必须保证java的环境变量已经配置好了的,如下图
  • 然后再使用jar命令将上面的class文件转为jar文件
  • 然后再是用jdx.jar工具执行jar命令将jar转为dex文件,dx.jar可以在android sdk 的build-tools\28.0.3\lib目录下找到,​​​​​​
  • 然后是使用baksmali.jar执行jar命令将r.dex转为smali文件,baksmali.jar可以在这个网址下载https://github.com/JesusFreke/smali
  • 最后我们来看下生成的R的smali文件 ,这些smali文件都是根据最新的apk资源生成的,保证了最新资源ID的唯一性,如果将母包里面的包名修改了,但是母包又使用到了R的引用的话,那么我们就必须将使用到的代码里面的所有包含R的smali代码替换为新生成的R引用,这样在运行时才不会报资源ID找不到的崩溃问题,另外如果我们要合并一些第三方库的samli文件到母包中,如果第三方库也使用到了R引用类,也必须进行替换才行,比如之前我们遇到的Facebook、快手广告平台的第三方库等,都需要进行R引用的替换
  • 后面我会专门用一篇文章来讲解下R$styleable以及它的代码合并处理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值