美文网首页
Apktool反编译R.styleable

Apktool反编译R.styleable

作者: 懇_ | 来源:发表于2023-05-16 01:15 被阅读0次

原因

在APK反编译后进行代码合并,经常会遇到这样一个问题,找不到R.styleable或者是找不到其中的某一个资源ID。通过仔细检查发现这是Apktool的一个缺陷:无法解析R.styleable。

如何解决?

仔细观察R.styleable文件可以得知它的组成是资源ID的数组集,例如:

    R$styleable

    .field public static AppCompatTheme:[I = null

    .field public static AppCompatTheme_windowActionBar:I = 0x2

    .field public static AppCompatTheme_windowNoTitle:I = 0x3

    .field public static AppCompatTheme_windowActionBarOverlay:I = 0x4


    fill-array-data v6, :array_1d2

    sput-object v6, Landroidx/appcompat/R$styleable;->AppCompatTheme:[I


    :array_1d2
    .array-data 4
        0x7f030002
        0x7f030003
        0x7f030004
    .end array-data

    R$attr
    .field public static windowActionBar:I = 0x7f030002

    .field public static windowNoTitle:I = 0x7f030003

    .field public static windowActionBarOverlay:I = 0x7f030004

不想写了 简述一下
从R.styleable切割得到一条declare-styleable,每一条declare-styleable基本都是资源ID数组集合,资源ID可以对应到APK中的attr里面的其中一项,如果调用的是系统的attr则需要去sdk中的data\res\values\public-final.xml举例(AppData\Local\Android\Sdk\platforms\android-33\data\res\values\public-final.xml) 在public中查找attr,framework中统一用android:{attrName},由此可以得到一条完整的declare-styleable。

其中有一个坑,如果attr存在子集,文件中只能保留一个完整的子集,其余的则需要省略子集,因为attr在编译过程中会被添加至R$attr中,而attr的规则就是如果有同名的attr则省略其他子集。

在添加完styleable后则需要把attr中获取过的项进行删除,否则会提示资源重复,至于原因请看上面。

脚本位置

相关文章

网友评论

      本文标题:Apktool反编译R.styleable

      本文链接:https://www.haomeiwen.com/subject/kmmvsdtx.html