原因
在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中获取过的项进行删除,否则会提示资源重复,至于原因请看上面。
网友评论