安卓资源密钥冲突



我有两个Android项目,一个是主项目(包名com.adip.sampler(和一个添加到主库(包名com.samples.projb(。在它们的资源中,我都有一个具有相同键的integer-array my_int_values

在主项目中:

<integer-array name="my_int_values">
    <item>10</item>
    <item>20</item>
    <item>30</item>
    <item>40</item>
    <item>50</item>
    <item>60</item>
    <item>70</item>
    <item>80</item>
</integer-array>

在图书馆时:

<integer-array name="my_int_values">
    <item>34</item>
    <item>35</item>
    <item>36</item>
    <item>37</item>
</integer-array>

在活动的主项目中,如果我正在调查这些数组(主项目和库(中的值是什么:

protected void showLocalStrings() {
    Log.d("RESSampler", "In Main: " + Arrays.toString(getResources().getIntArray(com.adip.sampler.R.array.my_int_values)));
    Log.d("RESSampler", "In Libr: " + Arrays.toString(getResources().getIntArray(com.samples.projb.R.array.my_int_values)));
}

然后我在 Logcat 中看到了这一点:

In Main: [10, 20, 30, 40, 50, 60, 70, 80]
In Libr: [10, 20, 30, 40, 50, 60, 70, 80]

似乎主项目正在覆盖库数组中定义的值......我仔细检查了我是否使用正确的键从资源中读取,这没关系。直到我看了一眼每个生成的R类。在主项目中,这就是我com.adip.sampler.R.array.my_int_values

public static final class array {
    public static final int my_int_values=0x7f060000;
}

在库项目中com.samples.projb.R.array.my_int_values

public static final class array {
    public static final int my_int_values = 0x7f060000;
}

Android 工具生成了相同的值,所以难怪我会出现这种行为。如果我从整数数组之一更改键,我可以摆脱这种行为,但想象一下你有一些拥有大量资源、依赖库的大型项目,迟早你可能会遇到这种问题:拥有相同类型的资源具有相同的键值(我已经检查过string并且string-array和上述行为也出现在那里(。所以问题是:

  1. 为什么会出现此问题?或者,如果这不是问题,那么这种行为是什么原因?
  2. 如何最好地避免它?我猜试图在定义键时具有某种唯一性可以解决问题,但开发人员往往很懒惰......

这是使用最新ADT和Eclipse版本(Juno和Indigo(的多个变体出现的。仅在窗口上检查。

从 Android Developers 的库项目中阅读,有许多参考资料明确表示合并发生在构建时,具有相同 ID 的资源会相互覆盖。

对于库和应用程序中具有相同 ID 的资源

在同时在应用程序和 库,工具确保在 应用程序获得优先级,并且库项目中的资源 未编译到应用程序.apk中。这为您的应用程序提供了 灵活地使用或重新定义任何资源行为,或者 在任何库中定义的值。

对于来自两个库的具有相同 ID 的资源

。您的应用程序可以添加对多个库项目的引用,然后 指定每个库中资源的相对优先级。这 允许您在 累积方式。当从应用程序引用两个库时 定义相同的资源 ID,工具从 具有较高优先级的库并丢弃另一个。

文档中建议的解决方案

使用前缀避免资源冲突

若要避免常见资源 ID 的资源冲突,请考虑使用 前缀或项目特有的其他一致命名方案 (或在所有项目中都是唯一的(。

如何从命令行设置库中的优先级

如果要添加对多个库的引用,请注意,您可以 通过手动编辑 项目属性文件,并将每个引用的 .n 索引调整为 适当。

就个人而言,我会更改资源的名称。如果你读到任何关于命名约定的内容,它应该是有意义的,"my_int_array"并不是太有用,尤其是在其他人或项目可能使用的库中。

理想情况下,您希望能够在 6 个月内忘记这一点,回过头来看看它并知道该数组的用途/包含什么,而不必深入研究代码来推断数组的用途。

这篇文章;https://stackoverflow.com/a/7249410/1222199 包含一些关于命名约定的不同答案。

最后,不确定冲突,无法挖掘任何东西。我猜这与它的自动生成方式有关,可能值得将其记录为错误,看看您是否得到开发团队的任何响应。

相关内容

最新更新