public.xml合并

1.publi.xml中的数据是什么样子的

反编译apk后,会在res/values/下面发现一个public.xml文件,文件内容大致如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="attr" name="adSize" id="0x7f010000" />
    <public type="attr" name="adSizes" id="0x7f010001" />
    <public type="attr" name="adUnitId" id="0x7f010002" />
	<public type="color" name="browser_actions_bg_grey" id="0x7f020000" />
    <public type="color" name="browser_actions_divider_color" id="0x7f020001" />
	<public type="dimen" name="browser_actions_context_menu_max_width" id="0x7f030000" />
    <public type="dimen" name="browser_actions_context_menu_min_padding" id="0x7f030001" />
</resources>

type是资源的类型,name是资源名称,id是资源的id,在代码中引用的资源名最终会被这里的id替代。如代码中R.coloe.browser_actions_bg_grey。会在生成apk的过程中被0x7f020000替换。(为什么会被替换,请自行了解java的编译过程)

这里要着重关注一下id的格式:

id的值共有四个字节,

其中第一个字节表示packageId,系统的是01,app的资源是7f 

第二个字节表示资源类型,比如上面代码中attr的类型01,color的类型值02,dimen的类型值03。注意,类型值只要求同一类型的值一样即可,比如 attr在其他app的public.xml中值可能不是01,但是所有的attr的类型值必须是一样的。

第三和第四个字节的值表示资源的值。

2.public.xml作用。

public.xml是有aapt在反编译的时候根据resources.arsc文件生成,其作用就是在回编译的时候固定资源id。

编译生成apk的时候,每次都会对资源重新编译,资源对应的id也会改变。而java代码在编译的时候资源引用已被替换为资源的id引用。也就是说dex中的引用的资源id的值是固定的,不变的。这就要求重新编译apk的时候资源id也不能变。public.xml中定义的资源id在编译生成apk的时候不会重新生成,而是直接引用。id的值也就不会改变。

3,public.xml的合并原则

比如要把a apk的public.xml(以下简称a public.xml)合并到b apk的public.xml(以下简称b public.xml)中 其步骤如下

3.1.解析b public.xml,将不同的类型的资源分类存储,并找出其中的最大值

3.2.解析a public.xml,将不同类型的资源分类存储,再根据b public.xml中同类型资源的的名字去重,比如b public.xml中有name为app_name  type 为string的资源,a public.xml中也有一个同名同类型的资源,那么将 a public.xml中的同名同类型资源去掉。

3.3 将3.2整理好的 a public.xml 中的分类资源id 在3.1中找出的最大值的基础上加1并保存。

比如 3.1种找出的String类型的资源id的最大值时0x7f04001a, 那么 a pubic.xml中的String 类型的资源id就从0x7f04001a往上以此加1,直到a public.xml中的String类型的资源id处理结束。其他类型的资源依次处理。

3.4合并 public.xml

把3.3处理完后的a public.xml中的资源id增加到 b public.xml文件中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值