Android资源文件编译并打包apk的流程:
Android资源文件分为assets(原始数据放在apk中)和res(需要编译)
Android的res资源文件会编译成二进制格式,因为二进制格式解析速度快,占用空间小。
在编译的过程中,Res的每个资源文件会被赋予一个资源ID,存放在R.java当中,最后胜出一个Resources.arsc文件,该文件包含具有ID的资源的配置信息,作为一个索引表使用。
在编译xml的时候,从根节点遍历整个树,给每个属性都分配一个资源ID,并写入R.java,以后需要用到资源时直接通过资源ID查找。
在resourcesTable中,包含一个package对象,一个package包含多个type对象,而每个type对象包含多个configList,每个configList包含多个entry,entry包含一个key-value,其中key是属性名,value是值。由于系统在查找资源的时候是根据资源ID来查找,所以key的属性其实可以为空或0。
在某apk的混淆处理中,它把大部分entry的key设为0,这样在apktool反编译的时候,由于属性名为空,无法反编译通过,报错为读取资源表时异常。
处理方式是修改一下apktool对key为0的entry抛出异常的方式,把key=0修改为相应的名字或编号即可。