Android上的res / values / public.xml文件有什么用?

时间:2012-02-19 11:05:39

标签: android android-resources

我在Google上搜索过,但找不到任何相关结果。

我还检查了官方Android文档this page(所有可用资源)是我能找到的。我在此页面上找到的相关链接(到 res/values/ 目录)是:

这些页面没有说明 res/values/public.xml 文件的任何内容 以下是我为this type of file找到的示例

小片段

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="attr" name="commentTextColor" id="0xAA010007" />
    <public type="drawable" name="add_icon_bl" id="0xAA020000" />
    <public type="layout" name="act_date_picker" id="0xAA030001" />
    <public type="anim" name="activity_slide_from_bottom" id="0xAA040000" />
    <public type="xml" name="pref_menu" id="0xAA050000" />
    <public type="raw" name="alert_bell_animation_bl" id="0xAA060000" />
    <public type="array" name="taskRepeat" id="0xAA070000" />
    <public type="color" name="theme_main_color_bl" id="0xAA080000" />
    <public type="string" name="no_internet" id="0xAA0a0001" />
    <public type="id" name="page1" id="0xAA0d0015" />
</resources>

type 属性中可以看出,它通常包含所有标准资源类型,通常放在单独的目录中< / strong>在 res 目录下...


为什么要滥用Android提供的目录并使用单个文件存储所有值?有人可以提供更多相关信息吗?

3 个答案:

答案 0 :(得分:84)

文件 res / values / public.xml 用于为Android资源分配固定资源ID。

res / values / strings.xml

中考虑这些字符串资源集
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string3">String 3</string>
</resources>

Android资产包装工具(aapt)可能会在编译应用程序时为这些资源分配以下资源ID:

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string3=0x7f040001;
    }
}

现在,将字符串资源集更改为

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="string1">String 1</string>
    <string name="string2">String 2</string>
    <string name="string3">String 3</string>
</resources>

您会注意到@string/string3的资源ID已更改:

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string2=0x7f040001;
        public static final int string3=0x7f040002; // New ID! Was 0x7f040001
    }
}

为防止这种情况发生,您可以使用 res / values / public.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <public type="string" name="string3" id="0x7f040001" />
</resources>

将导致资源ID分配如下:

public final class R {
    // ...
    public static final class string {
        public static final int string1=0x7f040000;
        public static final int string2=0x7f040002;
        public static final int string3=0x7f040001; // Resource ID from public.xml
    }
}

应用程序很少用于 res / values / public.xml ,因为分配给资源的资源ID无关紧要。当它们发生变化时,无论如何都会重建整个应用程序,因此将更新Java资源ID对资源的任何引用。

res / values / public.xml 的最重要用户是Android平台本身。针对旧版Android构建的应用程序假定某些资源具有特定的资源ID。例如,Android资源@android:style/Theme必须始终具有资源ID 0x01030005,以使平台向后兼容针对旧版本平台构建的应用程序。

如果您对有关如何分配资源ID的详细信息感到好奇,请参阅以下答案:How does the mapping between android resources and resources ID work?

答案 1 :(得分:8)

https://developer.android.com/studio/projects/android-library.html#PrivateResources

public.xml对于一般的库项目非常有用。如果您包含public.xml,则认为其余资源都是私有的。

虽然其他项目仍然可以使用私人资源,但是linter会警告使用它们,并且它们不会被包含在AndroidStudio的自动完成中。

这是自动生成public.xml的要点 https://gist.github.com/HannahMitt/99922d4183bdb03356fd339413ba6303

答案 2 :(得分:3)

是否仅仅是为了使用OS代码的作者来定义符号名称和系统资源id之间的映射?

您可以在SDK中的YOUR_SDK_LOCATION \ platforms \ android - ?? \ data \ res \ values中找到它。

它正朝着

  

此文件定义平台导出的基本公共资源,   必须始终存在

并提出警告:

  

任何修改此文件的重要提示请在此之前阅读此内容   做出任何改变

     

此文件定义资源的二进制兼容性。因此,   你在这里做出改变时必须非常小心,否则你会   完全破坏与旧应用程序的向后兼容性

它有

等条目
<public type="attr" name="smallScreens" id="0x01010284" />
<public type="attr" name="normalScreens" id="0x01010285" />
<public type="attr" name="largeScreens" id="0x01010286" />

其中 - 所有系统resurce id,所以任何更改条目的人都会破坏他们的代码,因为它不会在标准设备上运行。