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

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

我还检查了官方的Android文档,而此页面(包含所有可用资源)是我所能找到的全部。 我在此页面上找到的相关链接(到res目录)是:

  • 字符串资源
  • 风格资源
  • 更多资源

这些页面没有透露有关res文件的任何信息。
这是我为此类文件找到的示例。

小片段

<?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>

res属性中可以看到,它几乎包含了通常放在res目录下单独目录中的所有标准资源类型...


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

Igor Popov asked 2019-11-18T21:49:35Z
3个解决方案
85 votes

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>

并且您会注意到@android:style/Theme的资源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的更多详细信息感到好奇,请参考以下答案:android资源和资源ID之间的映射如何工作?

Martin Nordholts answered 2019-11-18T21:50:55Z
8 votes

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

一般而言,public.xml对于库项目很有用。 如果包含public.xml,则假定其余资源都是私有的。

尽管私有资源仍可用于其他项目,但linter会警告使用它们,并且它们不会包含在AndroidStudio的自动完成功能中。

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

HannahMitt answered 2019-11-18T21:51:38Z
3 votes

它不是仅供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" />

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

NickT answered 2019-11-18T21:52:53Z
translate from https://stackoverflow.com:/questions/9348614/what-is-the-use-of-the-res-values-public-xml-file-on-android