码迷,mamicode.com
首页 > 其他好文 > 详细

andorid下的Public.xml 怎么使用小结

时间:2015-02-12 16:24:01      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:

用 apktoool 反编译过 apk ,反编译后在res/values 下有一个 public.xml 文件

技术分享

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="attr" name="bg_category" id="0x7f010000" />
    <public type="attr" name="bg_details_zan" id="0x7f010001" />
    <public type="attr" name="bg_input_view" id="0x7f010002" />
    <public type="attr" name="bg_item_channel" id="0x7f010003" />
    <public type="attr" name="bg_title_bar" id="0x7f010004" />
    <public type="attr" name="btn_back" id="0x7f010005" />
    <public type="attr" name="btn_open_source" id="0x7f010006" />
    <public type="attr" name="channel_edit_divider_color" id="0x7f010007" />
    <public type="attr" name="channel_item_bg" id="0x7f010008" />
    <public type="attr" name="channel_item_text_color" id="0x7f010009" />
    <public type="attr" name="common_text_color" id="0x7f01000a" />
    <public type="attr" name="listItemBg" id="0x7f01000b" />
    <public type="attr" name="list_divider" id="0x7f01000c" />
    <public type="attr" name="main_left_more" id="0x7f01000d" />
    <public type="attr" name="main_refresh" id="0x7f01000e" />
    <public type="attr" name="main_title" id="0x7f01000f" />
    <public type="attr" name="news_list_divider" id="0x7f010010" />
    <public type="attr" name="news_list_extra" id="0x7f010011" />
    <public type="attr" name="news_list_title_text_color" id="0x7f010012" />
    <public type="attr" name="no_comment" id="0x7f010013" />
    <public type="attr" name="other_text_color" id="0x7f010014" />
    <public type="attr" name="settingItemBg" id="0x7f010015" />
    <public type="attr" name="title_bar_text_color" id="0x7f010016" />
    <public type="attr" name="tool_bar_back" id="0x7f010017" />
    <public type="attr" name="tool_bar_comment" id="0x7f010018" />
    <public type="attr" name="tool_bar_heart" id="0x7f010019" />

这个东西有什么用呢?

先从如何使用资源 ID 开始,在开发中我们通常使用 Resources.getXXX(resid) 来获取某个资源,传入的是 ID 这个 ID 定义在 R.XXX 类里面,R 类是编译器自动生成的,打开看知道

技术分享

其实资源 ID 就是一个常量,对我们引用了某个ID,编译成 APK 之后,这个ID的值就固定了,
而 apktool 在重新打包 apk 的时候会对资源重新编译 (编译成 resources.arsc 你有zip打开 apk 看得到),编译资源的时候自然需要对所有资源ID进行重新编排(这是一个随机过程)试想假设原包里面 drawable/a.png id=0x7f020003 那么重新编排资源ID后就可能是 0x7f020004 又假设原包 0x7f020004 对应图片 b.png,那你重新打包后的 apk 当显示 a.png 的时候就会替换成 b.png,这还好不会出错,倘若生成的一个 id 原包不存在,那会导致程序崩溃的!

所以 public.xml 的作用就是把对象资源 ID 写死!
格式是 
<public type="资源类型" name="资源名" id="0x7f080000" />

如果你细心观察就会发现,id 都是 0x7f 开头紧接着后面两位 08 是独立于每种资源类型的,再后面的编码就是从 1 开始咯

public.xml 特殊用途:
<public-padding name="my_" end="0x7f02000f" start="0x7f020001" type="drawable" />

public-padding 顾名思义,留间距,为什么要留间距,这就涉及到一个深奥的问题了,可以应用在 主题、apk动态更新 领域,这个我们以后讨论

加了这个的效果就是在 R 里多了 my_1 ~ my_15 的资源ID,这些个资源ID空的,你去引用会找不到资源,如图:

技术分享

貌似还有几种用法,以前研究 apk 动态加载的时候忘了写日记记录,现在忘得差不多了,
技术分享

andorid下的Public.xml 怎么使用小结

标签:

原文地址:http://blog.csdn.net/qq253113827/article/details/43761681

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!