Colisión de claves de recursos de Android

Tengo dos proyectos Android, uno principal (nombre del paquete com.adip.sampler ) y una biblioteca que se agrega a main (nombre del paquete com.samples.projb ). En ambos de los recursos tengo un integer-array con la misma clave: my_int_values :

En proyecto principal:

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

Mientras que en la biblioteca:

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

En el proyecto principal de una actividad si estoy investigando cuáles son los valores de estos arrays (tanto el proyecto principal como la biblioteca):

 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))); } 

Entonces estoy viendo esto en Logcat:

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

Parece que el proyecto principal está anulando los valores definidos en la colección de la biblioteca … He duplicado comprobado si estoy leyendo de los recursos con la clave correcta y que está bien. Hasta que eché un vistazo en cada clase R generada. En el proyecto principal esto es lo que tengo para com.adip.sampler.R.array.my_int_values :

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

Mientras que en el proyecto de la biblioteca com.samples.projb.R.array.my_int_values :

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

La herramienta de Android ha generado el mismo valor, por lo que no es de extrañar que esté recibiendo este comportamiento. Puedo deshacerme de este comportamiento si cambio la clave de una de las matrices de números enteros, pero imagina que tienes algunos proyectos grandes con muchos recursos, bibliotecas de dependencia y tarde o temprano puedes chocar con este tipo de problemas: El mismo tipo de recursos con el mismo valor dominante (he comprobado con la string y con la string-array y el comportamiento antedicho aparece allí también). Así que las preguntas serían:

  1. ¿Por qué aparece este problema? O si no es un problema lo que explica este comportamiento?
  2. ¿Cómo evitarlo mejor? Supongo que tratar de tener algún tipo de singularidad en la definición de las claves hará el truco, pero los desarrolladores tienden a ser perezoso …

Esto aparece usando múltiples variantes de las últimas versiones ADT y Eclipse (Juno e Indigo). Verificado sólo en Windows.

Lectura de proyectos de la biblioteca en desarrolladores de Android , hay muchas referencias donde claramente dicen que la fusión ocurre en el tiempo de construcción y los recursos con los mismos ID se sobreescriben entre sí.

Para recursos con el mismo ID de una biblioteca y una aplicación

En los casos en que se define un ID de recurso en la aplicación y en la biblioteca, las herramientas garantizan que el recurso declarado en la aplicación obtiene prioridad y que el recurso del proyecto de biblioteca no se compila en la aplicación .apk . Esto le da a su aplicación la flexibilidad de utilizar o redefinir cualquier comportamiento de recursos o valores que se definen en cualquier biblioteca.

Para recursos con la misma ID de dos bibliotecas

… su aplicación puede agregar referencias a varios proyectos de biblioteca y, a continuación, especificar la prioridad relativa de los recursos de cada biblioteca. Esto le permite crear los recursos realmente utilizados en su aplicación de forma acumulativa. Cuando dos bibliotecas referenciadas desde una aplicación definen el mismo ID de recurso, las herramientas seleccionan el recurso de la biblioteca con mayor prioridad y descartan la otra.

Solución sugerida en la documentación

Utilice prefijos para evitar conflictos de recursos

Para evitar conflictos de recursos para ID de recursos comunes, considere el uso de un prefijo u otro esquema de nomenclatura coherente que sea exclusivo del proyecto (o sea único en todos los proyectos).

Cómo establecer la prioridad en las bibliotecas desde la línea de comandos

Si está agregando referencias a varias bibliotecas, tenga en cuenta que puede establecer su prioridad relativa (y el orden de combinación) editando manualmente el archivo project.properties y ajustando el índice .n de cada referencia, según corresponda.

Personalmente, cambiaría los nombres de los recursos. Si lee algo acerca de las convenciones de nomenclatura, debe ser algo significativo y "my_int_array" no es realmente muy útil, especialmente en una biblioteca que otras personas o proyectos podrían utilizar potencialmente.

Idealmente, usted quiere ser capaz de olvidar esto por 6 meses, volver y mirar y saber lo que esa matriz es para / contiene, sin tener que ahondar a través de código para deducir lo que la matriz es por lo que se hace con él.

Esta publicación; https://stackoverflow.com/a/7249410/1222199 contiene algunas respuestas diferentes sobre las convenciones de nomenclatura.

Por último, no estoy seguro sobre el conflicto, no podía cavar nada. Supongo que tiene que ver con la forma en que se genera automáticamente, tal vez valga la pena registrarlo como un error y ver si obtiene alguna respuesta del equipo de desarrollo.

  • Uso de una carpeta de recursos en el proyecto de prueba para datos de cadena de prueba
  • Android.R.id.home no puede encontrar el símbolo
  • Carpetas BitmapFactory.decodeResource y drawable *
  • ¿Es posible usar subcarpetas en drawables en Android?
  • Creación de matriz de números enteros de identificadores de recursos
  • Creación de aplicaciones con CrossWalk incorporado
  • Android ImageView setImageResource en el código
  • Cómo leer el atributo de dimensión personalizado del código java
  • Plural de cadenas de Android con nombres de identificadores separados por puntos
  • GetString fuera de un contexto o actividad
  • Empaquetado de archivos de recursos de Android dentro de un archivo Jar distribuible
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.